ADODB Recordset.Open给SQL语法错误excel

时间:2017-04-03 17:46:30

标签: sql vba adodb

我敬酒,无法弄清楚为什么我在线上遇到 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

2 个答案:

答案 0 :(得分:3)

您的代码受SQL注入。您可以将字符串文字括在单引号as shown in this answer中以修复语法错误,但这不会解决严重的安全问题。

Obligatory XKCD

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

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

理想情况下,您的连接字符串不包含任何用户名或密码;您的服务器需要配置为支持 Windows身份验证才能生效 - 然后使用已登录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

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

ActiveSheet.Cells(1, 1).CopyFromRecordset results

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

始终使用参数化查询:连接到SQL语句中的用户输入是一种瘟疫。

答案 1 :(得分:2)

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

你可以尝试一下,看看它是否有效吗?

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