使用“0”参数调用“ExecuteNonQuery”的异常:“参数化查询

时间:2017-10-21 12:35:34

标签: c# sql-server powershell ado

我正在使用ADO连接从API的PowerShell输出中将数据插入到MS SQL Server 2016中。

我的剧本如下:

$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 

我尝试过使用:

$cmd.Parameters.AddWithValue("@managingDeanery",'$obj.DBNull.Value'); 

但是这会使$obj.DBNull.Value列中的所有空字段和非空字段managingDeanery不正确。并非列中的所有数据都是空的。

1 个答案:

答案 0 :(得分:0)

除此之外,您不应该使用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结构......