【发布时间】:2019-03-05 04:13:37
【问题描述】:
我的SQL Server存储过程如下:
CREATE PROCEDURE ProcessAssessments
@assessmentIds AssessmentList READONLY,
@failed BIT
AS
UPDATE dbo.table
SET IsProcessed = 1,
dbo.ProcessFailed = @failed,
dbo.ProcessDate = GETDATE()
WHERE
dbo.ID IN (SELECT AssessmentId FROM @assessmentIds)
GO
在 Powershell 中:在全局定义下,我声明了 $connection 和 ArrayList。
$connection = New-Object System.Data.SqlClient.SqlConnection($connectionString)
$connection.Open()
$processedAssessments.Add("1")
$processedAssessments.Add("2")
$processedAssessments.Add("3")
UpdateAssessments($processedAssessments, 0)
在方法内部,我将ArrayList 转换为DataTable,并将其作为参数提供给我的存储过程。
function UpdateAssessments([System.Collections.ArrayList] $assessments,[bool] $failed) {
$table = New-Object System.Data.DataTable
$table.Columns.Add("AssessmentId", "System.String") | Out-Null
foreach($assessmentId in $assessments) {
$row = $table.NewRow()
$row.AssessmentId = $assessmentId
$table.Rows.Add($row)
}
$command = New-Object System.Data.SqlClient.SqlCommand
$command.CommandType = [System.Data.CommandType]::StoredProcedure
$command.CommandText = "ProcessKySpecialAssessments"
$command.Connection = $connection
$command.Parameters.Add("@assessmentIds", $table)
$command.Parameters.Add("@failed", $failed)
$Command.ExecuteNonQuery()
}
但是,当我执行此操作时,出现以下异常:
使用“0”参数调用“ExecuteNonQuery”时出现异常:“将 nvarchar 值 'System.Collections.ArrayList' 转换为数据类型 int 时转换失败。
表值参数“@assessmentIds”的数据不符合参数的表类型。
SQL Server 错误为:245,状态:1
我真的不知道我做错了什么。
【问题讨论】:
-
你有这个: $table.Columns.Add("AssessmentId", "System.String") 但是你的 SQL 表类型似乎是 int?也许这需要匹配 SQL 数据类型
-
另外我认为你需要给参数一个显式类型(结构化),但我承认我知道从 C# 中,我从未在 Powershell 中尝试过。
-
顺便说一句:请避免使用伪方法语法:不要使用
New-Object SomeType(arg1, ...),而是使用New-Object SomeType [-ArgumentList] arg1, ...- PowerShell cmdlet 和函数的调用方式类似于 shell 命令(无括号、空格- 分隔的参数),不像 methods.
标签: sql-server powershell