powershell - 将参数添加到 SQLCommand 并稍后添加值
问题描述
我已经看到了使用Parameters.Add
vs的不同讨论Parameters.AddWithValue
(一个是明确的,另一个不是),但这不是我的问题。
我正在定义一个命令,它将用于对数据库进行多次插入。我想我会做如下的事情:
[define command]
[add parameters (including a batchid not known at this time)]
[enter loop]
[create new batchid]
[set parameter value]
[execute command]
[next]
这意味着我的参数是预先定义好的,并且我在循环中设置了它们的值。代码如下所示:
$SqlCmdAdd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmdAdd.CommandType = [System.Data.CommandType]::StoredProcedure
$SqlCmdAdd.CommandText = "AddBatch"
$SqlCmdAdd.Parameters.Add("@RunId", [Data.SQLDBType]::UniqueIdentifier)
$SqlCmdAdd.Parameters.Add("@RunType", [Data.SQLDBType]::NVarChar, 50)
$SqlCmdAdd.Connection = $SqlConnection
在循环中,我想我可以做这样的事情:
# Generate GUID to be used as a BatchID
$batchID = [guid]::NewGuid()
# I tried both using the parameter name, as well as their numeric order. Neither worked
$SqlCmdAdd.Parameters["@RunId"].Value = $batchID | Out-Null
$SqlCmdAdd.Parameters["@RunType"].Value = "HDD" | Out-Null
# $SqlCmdAdd.Parameters[0].SqlValue = $batchID | Out-Null
# $SqlCmdAdd.Parameters[1].SqlValue = "HDD" | Out-Null
但是,如果我读出 $SqlCmdAdd.Parameters[0] 和 [1] 的值,我会看到正确的名称和数据类型,但它们的值为 null。因此,我会得到一个错误,即没有为参数指定值。
起作用的是:
$SqlCmdAdd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmdAdd.CommandType = [System.Data.CommandType]::StoredProcedure
$SqlCmdAdd.CommandText = "AddBatch"
$SqlCmdAdd.Connection = $SqlConnection
在循环中这样做:
# Add parameters
$SqlCmdAdd.Parameters.AddWithValue("@RunId", $batchID) | Out-Null
$SqlCmdAdd.Parameters.AddWithValue("@RunType", "HDD") | Out-Null
$SqlCmdAdd.ExecuteNonQuery()
$SqlConnection.Close()
# Clear parameter collection for next run
$SqlCmdAdd.Parameters.Clear()
令我恼火的是需要为下一次运行清除参数集合,然后重新创建它们。虽然它运行我的代码,但我有兴趣找出为什么尝试在第一个代码块中设置早期创建的参数的值没有任何效果。
我尝试使用谷歌搜索并阅读了无数文章。
解决方案
发生这种情况,因为管道变量Out-Null
在分配之前发生。因此,
$SqlCmdAdd.Parameters["@RunId"].Value = $batchID | Out-Null
将首先传递$batchID
给Out-Null
,并将结果 - $null
- 赋值给.Value
。
至于修复,只需Out-Null
像这样删除,
$SqlCmdAdd.Parameters["@RunId"].Value = $batchID
推荐阅读
- ansible - 将文件下载到 ansible 控制器而不是远程机器
- sql-server - 如果工作表名称中有空格(SSIS),如何跳过 OpenRowset 中 xlsx 源的前几行?
- php - Laravel 邮件队列中断西里尔文发件人姓名编码
- ansible - 如何检查文件中的目录列表,但某些条目有多个目录,以逗号分隔
- dictionary - Julia 将 NamedTuple 转换为 Dict
- java - 对于 PDFBox 加密,是否有任何替代 BouncyCastle 的方法?
- c - 我在打印 char** 数组时遇到问题
- visual-studio-code - Prettier 在“Shift + Alt + F”上缩进 2 个空格而不是 4 个空格
- go - grpc.WithConnectParams.Backoff 和 grpc_retry.WithBackoff 有什么区别?
- r - 多个分组和多个表同时闪亮