我想插入一个字符串,比如Hello,我是“Tmacy”!,进入sqlite3表。但是我找不到插入“。(ps.I试图用\”而不是“但是它没有说话。)。注意:我使用C / C ++ API函数sqlite3_exec将字符串插入sqlite表。如果使用sqlite3命令插入它,它可能会有效。
像那样: sprintf(sqlcmd,"insert into dict values('%s','%s')",word,meaning);
if(sqlite3_exec(data,sqlcmd,NULL,NULL,&errmsg) != SQLITE_OK){
printf("insert error!:%s\n",errmsg);
}else{
printf("insert success!\n");
}
谢谢!
答案 0 :(得分:2)
sqlite3_mprintf函数的格式类似于%Q
,可以让您正确格式化字符串:
char *sql = sqlite3_mprintf("INSERT INTO dict VALUES(%Q,%Q)", word, meaning);
err = sqlite3_exec(data, sql, NULL, NULL, &errmsg);
sqlite3_free(sql);
答案 1 :(得分:0)
尝试重复引用而不是转义它: -
答案 2 :(得分:0)
你最好在这里使用参数,它更安全,然后只需对文本字符串进行轻微更改,以便“这样不会导致崩溃。在我自己的一个项目中使用参数的一些示例代码, VB .net。
Public Sub RunSQLiteCommand(ByVal CommandText As String, Optional ByVal ReadDataCommand As Boolean = False, Optional ByVal ParameterList As Hashtable = Nothing)
SQLcommand.Parameters.Clear()
SQLcommand.CommandText = CommandText
If ParameterList IsNot Nothing Then
For Each key As String In ParameterList.Keys
SQLcommand.Parameters.Add(New SQLite.SQLiteParameter(key, ParameterList(key)))
Next
End If
SQLcommand.ExecuteNonQuery()
If ReadDataCommand Then
SQLreader = SQLcommand.ExecuteReader()
End If
End Sub
如果你真的想避免使用参数,那么“”(其中两个)将是你要走的路。如果我没有使用参数,我运行所有字符串值,我通过一个函数插入到数据库中,该函数替换“with”“字符串值中的任何位置。
编辑:哦,是的,我差点忘了。对于使用参数,您的键值应该是'@FieldName',并且您的SQL查询应该在您使用该参数的任何地方说'@FieldName'。因此,例如,如果您调用要插入“in”的字段“Name”,则插入查询会有类似的内容。
insert into dict values(@Name, @OtherField)
您可以随意调用您的参数,如果您将其命名为与加载值的字段相同,则更容易。