【问题标题】:VBA: Using ADODB ParameterVBA:使用 ADODB 参数
【发布时间】:2021-01-27 12:16:11
【问题描述】:

我正在尝试使用 ADODB 运行参数化 SQL 查询,但我收到错误消息“必须声明标量变量 @Id”。

我是 VBA 的菜鸟,我已经尝试阅读它是如何完成的以及遵循示例但无济于事。

有人知道我的代码有什么问题吗?

Public Function IndataTest()


Dim conn As ADODB.Connection
Dim ConnString As String
ConnString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Data Source=DB;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=B5037093;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=DB"



Dim sqlstr As String Dim rs As Object Dim cmd As Object Dim ParamId As Object Dim Id As String

Id = 1084924

sqlstr = sqlstr & "use DB " 
sqlstr = sqlstr & "Select * " & vbCrLf
sqlstr = sqlstr & "From tblA" & vbCrLf        
sqlstr = sqlstr & "where fldA = @Id"


Set conn = New ADODB.Connection conn.Open ConnString

Set cmd = CreateObject("ADODB.Command") cmd.ActiveConnection = conn cmd.CommandText = sqlstr

Set ParamId = cmd.CreateParameter("@Id", 129, 1, 52, Id) cmd.Parameters.Append ParamId

Set rs = CreateObject("ADODB.Recordset") rs.Open cmd


If Not rs.EOF Then
    ' Transfer result.
    Sheets("Valuta").Cells(5, 5).CopyFromRecordset rs ' Close the recordset
    rs.Close Else
    MsgBox "Error: No records returned.", vbCritical End If

' Clean up If CBool(conn.State And adStateOpen) Then conn.Close Set conn = Nothing Set rs = Nothing

End Function

【问题讨论】:

    标签: excel adodb vba


    【解决方案1】:

    不要使用参数,将值构建到字符串中

     Public Function IndataTest()
    
    
     Dim conn As ADODB.Connection
     Dim ConnString As String
     ConnString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Data Source=DB;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=B5037093;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=DB"
      Dim sqlstr As String 
      Dim rs As new adodb.recordset
      Set conn = New ADODB.Connection 
      conn.Open ConnString
    
      sqlstr = "use DB " 
      sqlstr = sqlstr & "Select * " & vbCrLf 
      sqlstr = sqlstr & "From tblA" & vbCrLf 
      sqlstr = sqlstr & "where fldA = "  & 1084924
      set rs = conn.execute(sqlstr)
    

    【讨论】:

    • 这与该主题的所有其他建议相反。
    • 如果您正在创建面向公众的解决方案,参数是有意义的 - 但如果您正在创建一个内部解决方案来选择长(所以没有文本符号会弄乱您的 sql),为什么还要麻烦做这项工作? .盲目地遵循“最佳实践”而不理解为什么它是最好的,只会导致不必要的工作。
    • ...为什么还要麻烦做这项工作?...因为在当今世界,任何您认为不是“面向公众”的东西都可以被黑客攻击。使用参数更安全。不应出现在防火墙“外部”的旧代码被防火墙内部的不良行为者利用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    相关资源
    最近更新 更多