我正在使用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
不正确。并非列中的所有数据都是空的。
答案 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
结构......