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 注入。您可以将字符串文字用单引号括起来 以修复语法错误,但这不能解决严重的安全问题。
那么如何安全地参数化查询?使用 参数化查询!
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 语句是一种灾难。
太糟糕了,想不通为什么我在线上收到 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 注入。您可以将字符串文字用单引号括起来
那么如何安全地参数化查询?使用 参数化查询!
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 语句是一种灾难。