我正在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上获得的命令文本时,它可以正常工作。我的问题是如何对没有任何价值的查询进行参数化。
答案 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,则使用一些不存在的值作为“解决方法”。
希望这有用!