【问题标题】:Filtering SQL query in PowerShell with WHERE使用 WHERE 在 PowerShell 中过滤 SQL 查询
【发布时间】:2020-10-15 04:41:23
【问题描述】:

第一篇文章在这里。我正在使用一些 PowerShell 脚本来开发我的应用程序;我知道这不是开发 GUI 应用程序的最佳方式,但它是我熟悉的方式,也是我所知道的与 Office 365 应用程序交互的最佳方式,我的员工必须做很多事情。

我正在尝试构建函数,以便轻松填充组合框、从组合框中读取用户输入,然后根据该输入查询 Access 数据库以获取特定结果。

我还有另一个函数可以查询数据库以提取填充组合框的列表。现在,我想构建一个单独的函数,

  1. “读取”来自组合框的用户输入
  2. 打开 OleDB 连接以查询访问数据库
  3. 扫描数据库表中与用户输入对应的行
  4. 以字符串形式返回与用户选择的同一行不同的列中的单元格

这是我目前所拥有的:

 function Read-BoxSelection ($sourceBox, $sourceTable, $sourceColumn, $targetColumn){
     $conn = New-Object System.Data.OleDb.OleDbConnection
     $conn.ConnectionString = $connString
     $conn.Open() | Out-Null

     $cmd = New-Object System.Data.OleDb.OleDbCommand
     $cmd.Connection = $conn

     $selectedID = $sourceBox.SelectedItem

     [string]$writeQuery = ("SELECT * FROM $($sourceTable) WHERE $($sourceColumn) = $($selectedID)")

     $cmd.CommandText = "$writeQuery" 

     $reader = $cmd.ExecuteReader()

     while ($reader.read()){
        $readerResult = $reader.getValue($reader.GetOrdinal("$targetColumn"))
        return $readerResult  
     }

     $reader.close()
     $conn.close()
 }

我确信 while() 循环需要更改;它是从使用 $sourceColumn 的内容填充组合框的早期函数中提取的。

问题:我的第一个函数称为 Get-BoxData。它打开连接,运行查询,并使用 while() 循环到 Items。将 $targetColumn 中的每个单元格添加到组合框中。对于 Get-BoxData 函数,以下代码可以正常执行 SQL 查询:

[string]$readQuery = ("SELECT * FROM $($targetTable)")

$cmd.CommandText = "$readQuery"

$reader = $cmd.ExecuteReader()

但是当我更改 Read-BoxSelection 的查询时 - 即,使用 WHERE 根据用户输入过滤结果 - 无论我做什么,该命令都不会传递给 ExecuteReader。这很奇怪,因为我在 ExecuteReader 行放置了一个断点,Write-Host 确认 $writeQuery 和 $cmd.CommandText 都成功地按照所写的方式获取了查询。更奇怪的是,以前调试 ExecuteReader 问题会涉及 SQL 查询中的语法错误;在这里,我收到以下错误:

Exception calling "ExecuteReader" with "0" argument(s): "No value given for one or more required parameters."

不知道如何在这里继续!

【问题讨论】:

  • 请显示 SQL 查询的Write-Host 输出。 ExecuteReader 错误确实表明已到达命令。您需要用引号将 WHERE 中的字符串文字括起来。更好地使用parameterization
  • 还展示了如何调用该函数。你设置了sourceColumn和targetColumn了吗?
  • @parfait Write-Host 在断点处按预期返回 $query 的整个文本,即“SELECT * FROM myTable WHERE myColumn = myCellContents”
  • 什么是myCellContents?字符串,数字?如果这个 SQL 是按字面意思传递给 MS Access,它会引发一个未知参数的错误。
  • 它在数据库中定义为短文本,我的代码定义为 [string]

标签: sql powershell


【解决方案1】:

无论在SELECTJOINWHERE 子句中使用,SQL 中的字符串文字都必须用引号引起来。否则数据库引擎会将对象视为标识符(表、列等)或参数。 MS Access 将表中未识别的任何未加引号的命名对象视为参数。

因此,简短的回答是将WHERE 条件值用单引号括起来,因为您的评论是一个字符串值:

[string]$writeQuery = ("SELECT * FROM $($sourceTable) WHERE $($sourceColumn) = '$($selectedID)'")

但是,首选答案是使用parameterization,因为您已经设置了命令对象,所以很容易做到这一点:

# PREPARED STATEMENT WITH ? PLACEHOLDER
[string]$writeQuery = ("SELECT * FROM $($sourceTable) WHERE $($sourceColumn) = ?")     
$cmd.CommandText = $writeQuery

# ADD AND BIND PARAMETER
$cmd.Parameters.Add("@param", [System.Data.OleDb.OleDbType]::VarChar, 255)
$cmd.Parameters["@param"].Value = $selectedID

$reader = $cmd.ExecuteReader()

【讨论】:

    猜你喜欢
    • 2012-06-21
    • 2013-09-28
    • 2016-05-21
    • 2021-05-21
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2014-10-09
    • 2021-11-29
    相关资源
    最近更新 更多