【问题标题】:Adding parameters to SQLCommand and adding value later将参数添加到 SQLCommand 并稍后添加值
【发布时间】:2020-04-22 00:43:47
【问题描述】:

我已经看到了使用 Parameters.AddParameters.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`:...Value = $batchID
  • @vonPryz 我会被诅咒的。我添加它们是因为早期的东西不起作用,而且我看到大量其他文章将它们定义为这样。如果您将评论添加为答案,我会接受并给您加分:)
  • 只是说声谢谢,那里有很多关于如何一般在 powershell(或只是 C# lite)中编写它的链接不起作用...
  • 谢谢——这对我有帮助:$SqlCmdAdd.CommandType = [System.Data.CommandType]::StoredProcedure 找不到如何在别处设置 SqlCmd commandType。现在我可以看到如何使用 C# 命名空间来获取 powershell 中的类型。

标签: powershell parameters sqlcommand


【解决方案1】:

发生这种情况,因为在分配之前将变量传递给Out-Null。因此,

$SqlCmdAdd.Parameters["@RunId"].Value = $batchID | Out-Null

首先将$batchID 传递给Out-Null,然后将结果 - $null - 分配给.Value

至于修复,只需像这样删除Out-Null

$SqlCmdAdd.Parameters["@RunId"].Value = $batchID

【讨论】:

  • 感谢您,特别是您解释了为什么我的原始代码不起作用。
猜你喜欢
  • 2011-10-28
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多