【问题标题】:Exception calling "ExecuteNonQuery" with "0" argument(s): "The parameterized query使用“0”参数调用“ExecuteNonQuery”的异常:“参数化查询
【发布时间】:2018-04-02 11:04:40
【问题描述】:

我正在使用 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'); 

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

【问题讨论】:

  • 您在第二个工作示例中的参数值周围使用引号。您是否尝试在 $obj.surname 周围使用引号?
  • $Command$cmd 这里正确的是什么?
  • 不要使用 AddWithValue。相反,使用 Add 方法并指定正确的 SQL 类型 (msdn.microsoft.com/en-us/library/wbys3e9s.aspx)。

标签: c# sql-server powershell ado


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 2019-11-29
    相关资源
    最近更新 更多