在 SQL 查询中使用变量会引发 ADO 错误
Posted
技术标签:
【中文标题】在 SQL 查询中使用变量会引发 ADO 错误【英文标题】:Using Variable in SQL Query Raises ADO Error 【发布时间】:2020-07-09 12:52:54 【问题描述】:我正在尝试从 SQL Server 表(项目)中获取单个项目代码,以与在 Excel 工作表中输入的项目代码进行比较。为了实现这一点,我在 Excel 2019 中编写了以下 VBA 代码。
Function GetItemcodeFromSQLTable(sSQLArtikel As String) As String
Dim connection As New ADODB.connection
connection.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Data Source=SQL01;Initial Catalog=110"
Dim query As String
query = "select itemcode from items where itemcode = " & sSQLArtikel
Dim rs As New ADODB.Recordset
rs.Open query, connection
connection.Close
End Function
我在执行rs.open query, connection
行时不断收到错误消息。
这一切的目的是我想知道 SQL 表中是否已经存在 itemcode。如果没有,我的 VBA 代码的其余部分将创建一个 XML 文件以将新的 itemcode 导入 SQL 表。
我在 VBA 窗口中添加了对“Microsoft Active X Data Objects 6.1 Library”的引用。
谁能帮我解决这个问题?
非常感谢。
我现在使用的代码是
Function CheckIfArticleCodeExistsInSQLDatabase(sSQLArtikel As String) As String
Dim query As String
Dim connection As ADODB.connection
Dim rs As ADODB.Record
Dim cmd As ADODB.Command
' PREPARED STATEMENT WITH PARAM PLACEHOLDERS
query = "select itemcode from items where itemcode = " & "'" & sSQLArtikel & "'"
' OPEN CONNECTION
Set connection = New ADODB.connection
connection.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;" _
& "Data Source=SQL01;Initial Catalog=110"
' DEFINE COMMAND AND RECORDSET
Set cmd = New ADODB.Command
cmd.ActiveConnection = connection
Set rs = cmd.Execute(query, sSQLArtikel) ' BIND PARAM VALUES
' ... DO SOMETHING WITH rs
rs.Close: connection.Close
Set cmd = Nothing: Set rs = Nothing: Set connection = Nothing
End Function
执行命令“Set rs = cmd.Execute(query, sSQLArtikel)”时会显示错误消息“未为命令对象设置命令文本”。
我做错了什么,但是什么?
【问题讨论】:
您收到什么错误? 尝试更改:query ="select itemcode from items where itemcode = " & sSQLArtikel
to query = "select itemcode from items where itemcode = '" & sSQLArtikel & "'"
@Brian M 斯塔福德。错误是“无效的列名”
@Zac。我已经以多种方式尝试了括号。但总是得到相同的结果。 “列名无效”
显而易见的问题,但您确定itemcode
列存在于items
表中吗?
【参考方案1】:
在 VBA 等应用层中运行 SQL 时,请考虑参数化的行业最佳实践。这样做可以避免将变量连接和标点到 SQL 字符串。
具体来说,字符串文字 (sSQLArtikel
) 周围缺少引号是您的问题。使用 ADO Command.Execute,您可以定义带有绑定参数的记录集。
Dim query As String
Dim connection As ADODB.Connection
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
' PREPARED STATEMENT WITH PARAM PLACEHOLDERS
query = "select itemcode from items where itemcode = ?"
' OPEN CONNECTION
Set connection = New ADODB.Connection
connection.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;" _
& "Data Source=SQL01;Initial Catalog=110"
' DEFINE COMMAND AND RECORDSET
Set cmd = New ADODB.Command
With cmd
.ActiveConnection = connection
.CommandType = adCmdText
.CommandText = query
.Parameters.Append .CreateParameter(, adVarChar, adParamInput, _
Len(sSQLArtikel), sSQLArtikel)
Set rs = .Execute
End With
' ... DO SOMETHING WITH rs
rs.Close: connection.Close
Set cmd = Nothing: Set rs = Nothing: Set connection = Nothing
【讨论】:
我已经尝试过您的代码,但它在“set rs =”命令中带有错误消息。错误消息是:“连接不能用于执行此操作。连接在此上下文中已关闭或无效。” 我已经用我正在使用的完整功能更新了我的问题。执行此函数时,系统仍会产生错误消息。 查看使用不同方法分配命令参数的编辑版本。 这是我的问题的答案。非常感谢你帮助我!!以上是关于在 SQL 查询中使用变量会引发 ADO 错误的主要内容,如果未能解决你的问题,请参考以下文章
在 VBA 中执行 ADO 记录集命令会引发错误“转换 nvarchar 值时转换失败”
Nuxt 项目中的 Tailwind CSS 尝试使用 SCSS 变量会引发“未知单词”错误