首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在UPDATE查询的SET子句中使用参数(Powershell、MS Access SQL)

无法在UPDATE查询的SET子句中使用参数(Powershell、MS Access SQL)
EN

Stack Overflow用户
提问于 2018-03-01 22:53:41
回答 1查看 346关注 0票数 0

给定这个简单的Access数据库表:

代码语言:javascript
复制
ID   fruit   count
--   -----   -----
1    apples  10
2    oranges 2

我的目标是编写一个Powershell cmdlet (让我们叫它Set-FruitCount),它可以根据水果的名称设置水果的数量。例如,命令Set-FruitCount -Fruit Apples -Count 1应该更新ID为1的行,以将计数设置为1。当然,我的用例比较复杂,但为了问题清晰,我尽量简化问题。

但是,当尝试执行参数化的update查询时,它不起作用。但是,在几乎相同的查询中硬编码特定值,只需参数化实际的WHERE子句,而不是set子句,它确实有效。

这是我的程序:

代码语言:javascript
复制
$oConn = New-Object System.Data.OleDb.OleDbConnection "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\pvz\Documents\fruits.mdb"
$oConn.open()

function Get-Fruits {
    $TextInfo = (Get-Culture).TextInfo
    $oCmd = New-Object System.Data.OleDb.OleDbCommand("SELECT * FROM [fruits]", $oConn)
    $oReader = $oCmd.ExecuteReader()
    while ($oReader.Read()) {
        $obj = New-Object PSObject
        for ($i = 0; $i -lt $oReader.FieldCount; $i++) {
            $Name = $TextInfo.ToTitleCase($oReader.GetName($i))
            $Value = $oReader[$i]
            $obj | Add-Member -Type NoteProperty -Name $Name -Value $Value
        }
        $obj
    }
    $oReader.Close()
}

function Set-FruitCount {
    Param($Fruit, $Count)
    $strQuery = "UPDATE [fruits] SET [count] = @COUNT WHERE [fruit] = @FRUIT"
    $oCmd = New-Object System.Data.OleDb.OleDbCommand($strQuery, $oConn)
    [void]$oCmd.Parameters.Add("@FRUIT", $Fruit)
    [void]$oCmd.Parameters.Add("@COUNT", $Count)
    $ret = $oCmd.ExecuteNonQuery()
    Write-Host "Set-FruitCount affected $ret rows"
}

function Set-FruitCountToZero {
    Param($Fruit)
    $strQuery = "UPDATE [fruits] SET [count] = 0 WHERE [fruit] = @FRUIT"
    $oCmd = New-Object System.Data.OleDb.OleDbCommand($strQuery, $oConn)
    [void]$oCmd.Parameters.Add("@FRUIT", $Fruit)
    $ret = $oCmd.ExecuteNonQuery()
    Write-Host "Set-FruitCountToZero affected $ret rows"
}

Get-Fruits | Format-Table

Set-FruitCountToZero -Fruit "apples"
Get-Fruits | Format-Table

Set-FruitCount -Fruit "apples" -Count 1
Get-Fruits | Format-Table

$oConn.close()

这是输出:

代码语言:javascript
复制
PS C:\Users\pvz\desktop> .\fruits.ps1

ID Fruit   Count
-- -----   -----
 1 apples     10
 2 oranges     2


Set-FruitCountToZero affected 1 rows

ID Fruit   Count
-- -----   -----
 1 apples      0
 2 oranges     2


Set-FruitCount affected 0 rows

ID Fruit   Count
-- -----   -----
 1 apples      0
 2 oranges     2


PS C:\Users\pvz\desktop>

正如我们所看到的,Set-FruitCountToZero确实工作正常,将计数设置为零,并影响数据库中的一行。但是,Set-FruitCount函数不起作用,唯一的区别是为SET子句多添加了一个参数。

我遗漏了什么?

(注:此问题与参数化SQL查询有关,与Powershell函数参数无关。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-01 23:17:33

正如@JacobH在评论中发布的那样,似乎OleDB对传入的顺序参数很敏感。

因此,这里是‘Set-FruitCount`的修正版本,它可以工作:

代码语言:javascript
复制
function Set-FruitCount {
    Param($Fruit, $Count)
    $strQuery = "UPDATE [fruits] SET [count] = @COUNT WHERE [fruit] = @FRUIT"
    $oCmd = New-Object System.Data.OleDb.OleDbCommand($strQuery, $oConn)
    [void]$oCmd.Parameters.Add("@COUNT", $Count)
    [void]$oCmd.Parameters.Add("@FRUIT", $Fruit)
    $ret = $oCmd.ExecuteNonQuery()
    Write-Host "Set-FruitCount affected $ret rows"
}

请注意,@COUNT和@FRUIT现在的出现顺序与SQL查询中的顺序相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49052346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档