【发布时间】:2020-10-15 04:41:23
【问题描述】:
第一篇文章在这里。我正在使用一些 PowerShell 脚本来开发我的应用程序;我知道这不是开发 GUI 应用程序的最佳方式,但它是我熟悉的方式,也是我所知道的与 Office 365 应用程序交互的最佳方式,我的员工必须做很多事情。
我正在尝试构建函数,以便轻松填充组合框、从组合框中读取用户输入,然后根据该输入查询 Access 数据库以获取特定结果。
我还有另一个函数可以查询数据库以提取填充组合框的列表。现在,我想构建一个单独的函数,
- “读取”来自组合框的用户输入
- 打开 OleDB 连接以查询访问数据库
- 扫描数据库表中与用户输入对应的行
- 以字符串形式返回与用户选择的同一行不同的列中的单元格
这是我目前所拥有的:
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