使用 VBScript 进行 MS Access MDB 查询

Posted

技术标签:

【中文标题】使用 VBScript 进行 MS Access MDB 查询【英文标题】:MS Access MDB query with VBScript 【发布时间】:2017-01-19 16:02:41 【问题描述】:

我可以使用 VBScript 从图像中查找所有记录:

cn.Execute "SELECT * INTO [text;HDR=Yes;Database=" & exportDir & _
";CharacterSet=65001]." & exportFile & " FROM IMAGES" 

这非常有效。但是,我想将搜索范围从所有记录缩小到列 B (ProjectName) == "spoon"

Dim projName
projName = "spoon"
cn.Execute "SELECT * INTO [text;HDR=Yes;Database=" & exportDir & _
";CharacterSet=65001]." & exportFile & " FROM IMAGES" & " WHERE ProjectName=" & projName

但我得到了错误:

没有为一个或多个必需参数指定值。

Mu SQL-fu 很弱,不知道哪里出错了。

【问题讨论】:

确保在 proj 周围加上引号,可能是:" WHERE ProjectName='" & proj & "'" 。如果 projectname 是一个字符串变量,这是必要的,正如你所暗示的那样 避免字符串连接和使用 SQL 参数的另一个原因(除了 SQL 注入)。 另一个可能的问题:Dim projName: proj = "spoon" @Ekkehard.Horner 虽然这看起来不是问题,因为 OP 在 SQL 语句中使用proj,而不是projName @Ekkehard.Horner 我错过了一个谢谢 - 更新代码! 【参考方案1】:

总结(并略微减少):

Dim projName
projName = "spoon"

cn.Execute "SELECT * INTO [text;HDR=Yes;Database=" & exportDir & _
";CharacterSet=65001]." & exportFile & " FROM IMAGES WHERE ProjectName='" & projName & "'"

【讨论】:

Dim projName = "spoon" 应该是 Dim projName : projName = "spoon" @Ekkehard.Horner:没错,我想到了 VB.NET。谢谢。【参考方案2】:

作为@allen-wangpoints out,错误的原因是缺少通过将其封装在单引号中将其标识为字符串的字符串值('...')

但是,可以通过使用ADODB.Command 执行参数化查询来避免此问题和其他问题,例如 SQL 注入弱点。

Dim cmd, sql, exportDir, exportFile

'Shouldn't be configurable outside this procedure.
exportDir = "..."
exportFile = "..."

Const adCmdText = 1
Const adParamInput = 1
Const adCmdVarChar = 200
Const adExecuteNoRecords = &H00000080

Set cmd = CreateObject("ADODB.Command")
sql = "SELECT * INTO [text;HDR=Yes;Database=" & exportDir & _
";CharacterSet=65001]." & exportFile & " FROM IMAGES WHERE ProjectName = ?"
With cmd
  Set .ActiveConnection = cn
  .CommandType = adCmdText
  .CommandText = sql
  Call .Parameters.Append(.CreateParameter("@ProjName", adVarChar, adParamInput, 255))
  Call .Execute(, , adExecuteNoRecords)
End With

只要确保exportDirexportFile 都没有暴露,否则您将代码留给SQL 注入。

【讨论】:

以上是关于使用 VBScript 进行 MS Access MDB 查询的主要内容,如果未能解决你的问题,请参考以下文章

vbscript MS Access中的超时功能

VBScript MS Access数据库连接

如何通过VBscript检查MS Access中是不是存在表

VBscript 在 MS Access 2010 中制作问卷表格

vbscript MS Access VBA查询功能将CDec()应用于数字字段(有助于避免舍入错误)

MS access mdb 文件第一次从 Access 2007 打开时处于“修复”状态