使用C#在SQLite中添加参数

29

我正在学习SQLite,但是我无法将参数正确地编译到命令中。当我执行以下代码时:

this.command.CommandText = "INSERT INTO [StringData] VALUE (?,?)";

this.data = new SQLiteParameter();
this.byteIndex = new SQLiteParameter();

this.command.Parameters.Add(this.data);
this.command.Parameters.Add(this.byteIndex);

this.data.Value = data.Data;
this.byteIndex.Value = data.ByteIndex;

this.command.ExecuteNonQuery();

我遇到了SQLite异常。经过检查CommandText,我发现无论我做什么都没有正确地添加参数:INSERT INTO [StringData] VALUE (?,?)

你有什么想法我可能遗漏了什么?

谢谢


你能发一下你得到的异常吗? - JP Alioto
3个回答

91

尝试不同的方法,命名查询中的字段并命名查询中的参数:

this.command.CommandText = "INSERT INTO StringData (field1, field2) VALUES(@param1, @param2)";
this.command.CommandType = CommandType.Text;
this.command.Parameters.Add(new SQLiteParameter("@param1", data.Data));
this.command.Parameters.Add(new SQLiteParameter("@param2", data.ByteIndex));
...

11
现在,你可以这样做:this.command.Parameters.AddWithValue("@param1", data.Data); this.command.Parameters.AddWithValue("@param2", data.ByteIndex); - skst
@skst 请不要使用.AddWithValue。请参考http://www.dbdelta.com/addwithvalue-is-evil/和https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/,以及另一个链接:https://dba.stackexchange.com/questions/195937/addwithvalue-performance-and-plan-cache-implications - Mary
1
@VinGarcia .CommandType 帮助数据库确定这是一个文本命令还是存储过程的名称。它可以避免数据库解析命令。 - Mary
1
@Mary,你说得很有道理,但公平地说,SQLite只提供了SQL Server的一小部分类型,因此出现不匹配的可能性要小得多。SQLite对AddWithValue()的实现只需要在_NULL_、_REAL_、_INTEGER_、_TEXT_和_BLOB_之间进行选择。我想它可能会在应该选择_REAL_时选择_INTEGER,但这可能很快就会被发现。尽管如此,是的,最好使用Add()并指定类型。至于指定CommandType,_Text_是默认类型,所以不需要设置。(SQLite中没有存储过程。) - skst
@skst 关于 CommandType,我只是试图回答 VinGarcia 在评论中的问题。你关于默认值为 .Text 的评论完善了答案。Sqlite 中类型有限的观点很好,但我想我会坚持使用 .Add。这是我习惯的方式。 :-) - Mary
显示剩余3条评论

30
尝试使用VALUES而不是VALUE

0
var connectionstring = "Data Source=" + Environment.CurrentDirectory + "\\game.db";
using (var connection = new SqliteConnection(connectionString))
{
    var insertCmd = connection.CreateCommand();
    insertCmd.CommandText = "INSERT INTO Results(result, win) VALUES (@prizes, @win)";
    insertCmd.Parameters.AddWithValue("prizes", prizes);
    insertCmd.Parameters.AddWithValue("win", winAmount);
    insertCmd.ExecuteNonQuery();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接