异常调用“的ExecuteNonQuery”和“0”的说法(S):“参数化查询
问题描述:
我使用ADO连接到从一个API输出的PowerShell中插入数据的MS SQL Server 2016异常调用“的ExecuteNonQuery”和“0”的说法(S):“参数化查询
我下面的脚本:
$conn = New-Object System.Data.SqlClient.SqlConnection("Data Source=XYZ; Initial Catalog=Z; Integrated Security=SSPI")
$conn.Open()
$cmd = $conn.CreateCommand()
$JSONResult |Select id,surname,managingDeanery
foreach($obj in $JSONResult) {
$Command = New-Object System.Data.SQLClient.SQLCommand
$Command.Connection = $dbConnection
$cmd.CommandText = "INSERT Client (id,surname,managingDeanery) VALUES (@id,@surname,@managingDeanery)"
$cmd.Parameters.AddWithValue("@id",$obj.id);
$cmd.Parameters.AddWithValue("@surname",$obj.surname);
$cmd.Parameters.AddWithValue("@managingDeanery",$obj.managingDeanery);
$cmd.ExecuteNonQuery()
$cmd.Parameters.clear();
}
$conn.Close()
我得到的错误是:
:Exception calling "ExecuteNonQuery" with "0" argument(s): "The parameterized query '(@id int,@surname nvarchar(9),@managingDeanery nvarchar(4000))IN'
expects the parameter '@managingDeanery', which was not supplied."
At line:30 char:5
+ $cmd.ExecuteNonQuery()
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [],
MethodInvocationException
+ FullyQualifiedErrorId : SqlException
我已经尝试使用10
但是,这使得managingDeanery
列中的所有空字段和非空字段为$obj.DBNull.Value
,这是不正确的。并非所有列中的数据都是空的。
答
除了事实,你不应该使用AddWithValue
我假设你必须检查$obj.managingDeanery
的内容。在null
情况下,你必须通过$obj.DBNull.Value
为
我从来没有通过PowerShell的使用C#的参数的值,但它应该是这样的
$cmd.Parameters.AddWithValue("@managingDeanery",$obj.managingDeanery ?? $obj.DBNull.Value);
或类似
$cmd.Parameters.AddWithValue("@managingDeanery",($obj.managingDeanery==null ? $obj.DBNull.Value : $obj.managingDeanery));
或简单的if
结构...
您正在引用参数值在你的第二个工作示例中。您是否尝试在$ obj.surname周围使用引号? – Michael
_ $ Command_或_ $ cmd_这里的正确答案是什么? – Steve
请勿使用AddWithValue。相反,请使用指定了正确的SQL类型的Add方法(https://msdn.microsoft.com/zh-cn/library/wbys3e9s.aspx)。 –