异常调用“的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,这是不正确的。并非所有列中的数据都是空的。

+0

您正在引用参数值在你的第二个工作示例中。您是否尝试在$ obj.surname周围使用引号? – Michael

+0

_ $ Command_或_ $ cmd_这里的正确答案是什么? – Steve

+0

请勿使用AddWithValue。相反,请使用指定了正确的SQL类型的Add方法(https://msdn.microsoft.com/zh-cn/library/wbys3e9s.aspx)。 –

除了事实,你不应该使用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结构...