命令文本参数为空

时间:2016-01-11 14:34:44

标签: mysql vb.net

我正在vb.net中构建一个MySql查询:

 cmd.CommandText = "Select id INTO @idDep from dBase.tableA where guid in (@strdepToDelete, @strOtherToDelete) and IsDependent = '1'; " & _
                                  "Select id INTO @idOther from dBase.tableA where guid in (@strdepToDelete, @strOtherToDelete) and IsDependent = '0'; " & _
                                  "delete from dBase.tableA where id in(@idDep, @idOther);"
                cmd.Parameters.Add("@strdepToDelete", MySql.Data.MySqlClient.MySqlDbType.String)
                cmd.Parameters("@strdepToDelete").Value = strdepToDelete
                cmd.Parameters.Add("@strOtherToDelete", MySql.Data.MySqlClient.MySqlDbType.String)
                cmd.Parameters("@strdepToDelete").Value = strOtherToDelete
                cmd.Parameters.Add("@IdDep", MySql.Data.MySqlClient.MySqlDbType.Int24)
                cmd.Parameters("@IdDep").Value = Nothing
                cmd.Parameters.Add("@IdOther", MySql.Data.MySqlClient.MySqlDbType.Int24)
                cmd.Parameters("@IdOther").Value = Nothing


                Try
                    cmd.ExecuteNonQuery()
                    success = True
                Catch ex As Exception
                End Try
                Return success

捕获到错误,表示Null不能为@IdDep值。我试过""对于该变量的值;我试过了 ?对于该变量的值。当我运行从悬停在MySql中的cmd上获得的命令文本时,它可以正常工作。我的问题是如何对没有任何价值的查询进行参数化。

1 个答案:

答案 0 :(得分:0)

我不认为你的问题是数据类型,命令对象非常擅长从Nothing推断DBNull。我认为你的SQL语句是问题......

如果你有一个IN语句FldNm IN(1,2,NULL),那么SQL引擎会将其解析为FldNm=1 OR FldNm=2 OR FldNm=NULL。最后一项是无效的(对于一般的SQL,特别是对于MySQL ......只是尝试进行验证)。

您可以询问FldNm为空的记录,但不是FldNm = NULL的记录。

因此 - 当您构造该SQL语句时,如果它们为null,则需要跳过IN子句中的值。或者 - 如果值为null,则使用一些不存在的值作为“解决方法”。

希望这有用!