[英]ADODB Recordset.Open giving syntax error excel to SQL
我敬酒,無法弄清楚為什么我在rst.Line上遇到SYNTAX錯誤。
我已經嘗試過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注入。 您可以按此答案所示將字符串文字括在單引號中,以解決語法錯誤,但是並不能解決嚴重的安全性問題。
那么,如何安全地設置查詢參數? 使用參數化查詢 !
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)
為每個創建一個Parameter
?
SQL語句中的問號。 您必須為每個參數提供一個參數?
問號。
Dim results As ADODB.Recordset
Set results = cmd.Execute
您可以通過調用命令的Execute
方法來獲取Recordset
。 服務器處理參數。
ActiveSheet.Cells(1, 1).CopyFromRecordset results
如果一切順利, Recordset
包含您的結果。
始終使用參數化查詢:連接到SQL語句中的用戶輸入是一個困擾。
SQL需要這樣理解字符串文字。 您需要使用單引號分隔字符串文字,以使語法有效。
您可以試試看是否可行嗎?
strSQL = "SELECT DBNAME.vItem.Upc FROM DBNAME.vItem WHERE vItem.ItemDesc= '" & p1.Value & "'"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.