2017-10-21 76 views
1

我使用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)。 –

回答

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結構...

相關問題