ADODB Recordset.Open 给出语法错误 excel 到 SQL

ADODB Recordset.Open giving syntax error excel to SQL

太糟糕了,想不通为什么我在线上收到 SYNTAX 错误 rst.Open strSQL

我用 rst.Open strSQL、cnt、adOpenStatic、adLockReadOnly、adCmdText

试过了

但还是报错

我暗暗怀疑它与 strSQL 如何获取单元格值并将其附加到字符串末尾有关。

非常感谢任何帮助。

   Public Sub EzPz()

Dim cnt As ADODB.Connection
Dim rst As ADODB.Recordset


Set cnt = New ADODB.Connection
Set rst = New ADODB.Recordset


Dim strSQL As String

'Open connection
cnt.ConnectionString = "Driver={SQL Server};Server=HIDDEN;Database=HIDDENXX;Trusted_Connection=yes;UID=HIDDENU;PWD=HIDDENP;"
cnt.Open

'String for SQL cmd
Dim p1 As Range
Set p1 = ActiveSheet.Cells(1, 4)
strSQL = "SELECT DBNAME.vItem.Upc FROM DBNAME.vItem WHERE vItem.ItemDesc=" & p1.Value



rst.ActiveConnection = cnt    
rst.Open strSQL

ActiveSheet.Cells(1, 1).CopyFromRecordset rst

End Sub

SQL 需要理解字符串字面量;您需要用单引号分隔字符串文字以使语法有效。

你能试试看是否有效吗?

strSQL = "SELECT DBNAME.vItem.Upc FROM DBNAME.vItem WHERE vItem.ItemDesc= '" & p1.Value & "'"

您的代码受到 SQL 注入。您可以将字符串文字用单引号括起来 以修复语法错误,但这不能解决严重的安全问题。

Obligatory XKCD

那么如何安全地参数化查询?使用 参数化查询!

Dim conn As ADODB.Connection
Set conn = New ADOBD.Connection
.ConnectionString = "connection string ideally using Windows Authentication"
.Open

理想情况下,您的连接字符串不包含任何用户名或密码;您的服务器需要配置为支持 Windows Authentication 才能正常工作 - 然后使用登录 Windows 用户的凭据执行查询,并使用该用户.

的权限
Dim cmd As ADODB.Command
Set cmd.ActiveConnection = conn
cmd.CommandType = adCmdText
cmd.CommandText = "SELECT DBNAME.vItem.Upc FROM DBNAME.vItem WHERE vItem.ItemDesc = ?;"

设置一个Command对象。 CommandText 将是您的 SQL 语句,但不是将参数连接到其中,而是为每个参数使用一个 ? 问号。

Dim itemDesc As ADODB.Parameter
Set itemDesc = New ADODB.Parameter
itemDesc.Type = adVarChar
itemDesc.Direction = adParamInput
itemDesc.Value = p1.Value

cmd.Parameters.Append(itemDesc)

为 SQL 语句中的每个 ? 问号创建一个 Parameter。您必须为每个 ? 问号提供一个参数。

Dim results As ADODB.Recordset
Set results = cmd.Execute

您通过调用命令的Execute方法获得Recordset;服务器处理参数。

ActiveSheet.Cells(1, 1).CopyFromRecordset results

如果一切顺利,Recordset 会包含您的结果。

始终使用参数化查询:将用户输入串联成 SQL 语句是一种灾难。