系统无效操作异常:必须设置值。为SQLite设置空参数。

11

我正在使用 Microsoft.Data.Sqlite 2.1.0 在 .NETStandard 2.0 和 .NET Core 2.1.0 上与本地 SQLite 数据库交互。在异常中提到了 SQLitePCL,它也是一个依赖项。

我想要将参数的值设置为 NULL,但当我这样做时,会出现“必须设置参数值”的异常。

SqliteCommand cd = cn.CreateCommand();
cd.CommandText = sql;
cd.Parameters.AddWithValue("@param1", null); //This fails
cd.Parameters.AddWithValue("@param2", DBNull.Value); //This also fails
cd.Parameters.AddWithValue("@param3", ""); //This insert an empty string, not a NULL
cd.ExecuteNonQuery(); //The exception is thrown on this line

完整异常:

{System.InvalidOperationException: Value must be set.
  at Microsoft.Data.Sqlite.SqliteParameter.Bind (SQLitePCL.sqlite3_stmt stmt) [0x0004c] in <56cfa09aae23467e945f1a64a1f893bb>:0 
  at (wrapper remoting-invoke-with-check) Microsoft.Data.Sqlite.SqliteParameter.Bind(SQLitePCL.sqlite3_stmt)
  at Microsoft.Data.Sqlite.SqliteParameterCollection.Bind (SQLitePCL.sqlite3_stmt stmt) [0x00017] in <56cfa09aae23467e945f1a64a1f893bb>:0 
  at (wrapper remoting-invoke-with-check) Microsoft.Data.Sqlite.SqliteParameterCollection.Bind(SQLitePCL.sqlite3_stmt)
  at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader (System.Data.CommandBehavior behavior) [0x0025d] in <56cfa09aae23467e945f1a64a1f893bb>:0 
  at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader () [0x00000] in <56cfa09aae23467e945f1a64a1f893bb>:0 
  at MyApp.DbHelper.BuildDataSet (Microsoft.Data.Sqlite.SqliteCommand cd) [0x00019] in C:\...\MyApp\DbHelper.cs:55 }
根据官方文档,该值“可以为 null”。
我尝试创建一个新的SqliteParameter并在那里将值设置为空,想着可能是AddWithValue()出了问题,但结果还是一样。
如何将SqliteParameter的值设置为NULL

你试过使用 null 而不是 DBNull.Value 吗?不确定,但可能会起作用。 - sawbeanraz
当“this fails”时,您没有分享2个错误是什么。如果列允许空值,则DBNull将起作用。此外,您应该使用Add而不是AddWithValue,特别是在SqlIte中,这样您就可以控制它所感知的数据类型。 - Ňɏssa Pøngjǣrdenlarp
@sawbeanraz,我试过了用null,请看我的问题。@Plutonix,nullDBNull.Value都会产生我上面列出的相同错误。我刚刚尝试了使用显式数据类型的Add()并得到了相同的结果。目标字段是可空的,但无论如何SQL语句都不会执行,问题在参数绑定上。 - Eric
尽管文档上说AddWithValue是可行的,但我还是会倾向于避免使用它:请参见can we stop using AddWithValue。我记得之前有一个问题提到了为什么会发生这种情况,但我找不到了。 - Richardissimo
@Richardissimo,我明白你的意思,但这与我的问题无关;使用Add()方法时我仍然会收到相同的错误提示。 - Eric
@Eric 你是否定义了该列为 NOT NULL,导致出现问题? - sawbeanraz
1个回答

20

现在我对SQLite有了更多的经验,并通过实践得出了一个答案。

我现在不确定最初发布这个问题时导致问题的确切情况。

与开头的问题相反,这确实可以工作:

cd.Parameters.AddWithValue("@param2", DBNull.Value);

如果一个参数的值是null,那么直接使用null会抛出value must be set异常。现在我检测到这个问题并在包装类中将其转换为DBNull.Value

这个解决方案在过去的一个月里非常可靠。


2
你可能还需要将其转换为对象:https://dev59.com/QGgv5IYBdhLWcg3wF89P#10853351 - SharpC
太棒了!我已经做了好几天了。 - Samet ÖZTOPRAK

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