【问题标题】:ADODB CreateParameter in SELECT without specifying Parameter in CommandTextSELECT 中的 ADODB CreateParameter 未在 CommandText 中指定参数
【发布时间】:2016-11-19 08:08:01
【问题描述】:

将 SQL Server Express 2014 与 Access 2016 结合使用

前端包含一个用于在数据库中搜索记录的表单。表单提交上的 VBA 代码将 SELECT 语句的 WHERE 构建为一个长字符串。

这是一个简短的例子。

Set thisDb = DBEngine.Workspaces(0).Databases(0)
Set qDef = thisDb.CreateQueryDef("tempPTQ")
qDef.Connect = "ODBC;Driver={ODBC Driver 11 for SQL Server};SERVER=" & stServer & ";DATABASE=" & stDatabase & ";Trusted_Connection=Yes;"

strFields = "field1, field2, field3"

strTable = "dbo_SomeTable"

strParam = "WHERE field1=" & txtBox1.Value & ", AND field2=" & txtBox2.Value & ", AND field3=" & txtBox3.Value

strSQL = "SELECT " & strFields & " FROM " & strTable & " WHERE " & strParam & ";"

qDef.SQL = strSQL

DoCmd.RunSQL "INSERT INTO " & strDestTbl & " SELECT * FROM tempPTQ"

是否可以将其转换为带有动态 WHERE 子句的 ADODB 参数化查询,本质上是可变数量的列,每个列由不同的参数表示?

strSQL = "SELECT field1, field2, field3 FROM someTable"
Set dbCon = New ADODB.Connection

With dbCon
    .ConnectionString = "Driver={SQL Server Native Client 11.0};SERVER=" & stServer & ";DATABASE=" & stDatabase & ";Trusted_Connection=Yes;"
    .Open
End With

Set dbCmd = New ADODB.Command

With dbCmd
    .ActiveConnection = dbCon
    .CommandText = strSQL
    If txtBox1.Value <> "" Then 
        .CreateParameter("param1", adChar)
        .Parameters(0).Value = txtBox1.Value
    End If
    If txtBox2.Value <> "" Then 
        .CreateParameter("param2", adChar)
        .Parameters(1).Value = txtBox2.Value
    End If
    If txtBox3.Value <> "" Then 
        .CreateParameter("param3", adChar)
        .Parameters(2).Value = txtBox3.Value
    End If

    Set rst = .Execute()
    rst.Close
    Set rst = Nothing
End With

如何将参数动态添加到 WHERE 子句中?

【问题讨论】:

    标签: sql-server vba ms-access adodb


    【解决方案1】:

    考虑使用包含 WHERE 子句语句和 ? 占位符和相应参数字典的集合:

    Private Function FilterCriteria() As Collection
        Dim sqlCollection As New Collection
        Dim strCriteria As String
        Dim params As Object
    
        Set params = CreateObject("Scripting.Dictionary")
    
        strCriteria = "1 = 1"                  ' ALWAYS TRUE CONDITION TO START WHERE CLAUSE      
        If txtBox1.Value <> "" Then
            strCriteria = strCriteria & " AND field1 = ?"
            params.Add "field1param", txtBox1.Value
        End If
    
        If txtBox2.Value <> "" Then
            strCriteria = strCriteria & " AND field2 = ?"
            params.Add "field2param", txtBox2.Value
        End If
    
        If txtBox3.Value <> "" Then
            strCriteria = strCriteria & " AND field3 = ? "
            params.Add "field3param", txtBox3.Value
        End If
    
        sqlCollection.Add strCriteria
        sqlCollection.Add params
    
        Set FilterCriteria = sqlCollection
    
    End Function
    

    然后在您实际的数据库调用中,检索上述函数返回的集合并在准备好的语句和.CreateParameters中使用:

    Dim sqlCollection As New Collection
    Set sqlCollection = FilterCriteria        ' CALLING ABOVE FUNCTION (RETURNED COLLECTION)
    
    Set dbCon = New ADODB.Connection    
    With dbCon
        .ConnectionString = "Driver={SQL Server Native Client 11.0};SERVER=" & _
                             stServer & ";DATABASE=" & stDatabase & ";Trusted_Connection=Yes;"
        .Open
    End With
    
    ' CONCATENATE WHERE CLAUSE STRING TO SQL STATEMENT
    strSQL = "SELECT field1, field2, field3 FROM someTable WHERE " & sqlCollection(1) 
    
    Set dbCmd = New ADODB.Command        
    With dbCmd
        .ActiveConnection = dbCon
        .CommandText = strSQL
    
        ' BIND PARAMETERS FROM PARAMS DICT (KEYS=NAME, VALUES=PARAM VALUE)
        For Each key In sqlCollection(2).keys
            cmd.Parameters.Append cmd.CreateParameter(key, adVarChar, adParamInput, 255, _
                                  sqlCollection(2)(key))
        Next key
    
        Set rst = .Execute()
        rst.Close
        Set rst = Nothing
    End With
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      • 1970-01-01
      相关资源
      最近更新 更多