我敬酒,无法弄清楚为什么我在线上遇到 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
答案 0 :(得分:3)
您的代码受SQL注入。您可以将字符串文字括在单引号as shown in this answer中以修复语法错误,但这不会解决严重的安全问题。
那么你如何安全地参数化查询?使用参数化查询!
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 & "'"