SELECT中的ADODB CreateParameter,不指定CommandText中的Parameter

时间:2016-11-18 21:20:36

标签: sql-server vba ms-access adodb

将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子句中?

1 个答案:

答案 0 :(得分:1)

考虑使用一个集合,该集合包含带有?占位符的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 中使用:

(function() {
//...
});