【发布时间】: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