正如其他人所说,最好一开始就利用参数。然而,...
我也错过了一个连接运算符,因为我已经习惯了 PHP 中的 .=。在一些情况下,我编写了一个函数来实现它,虽然不是专门用于连接 SQL 字符串。这里是我用于创建 HTTP GET 查询字符串的代码:
Public Sub AppendQueryString(strInput As String, _
ByVal strAppend As String, Optional ByVal strOperator As String = "&")
strAppend = StringReplace(strAppend, "&", "&")
strInput = strInput & strOperator & strAppend
End Sub
这是我调用它的一个例子:
AppendQueryString strOutput, "InventoryID=" & frm!InventoryID, vbNullstring
AppendQueryString strOutput, "Author=" & URLEncode(frm!Author)
......等等。
现在,对于构建SQL WHERE子句,您可以考虑像这样将其作为Application.BuildCriteria的包装器:
Public Sub ConcatenateWhere(ByRef strWhere As String, _
strField As String, intDataType As Integer, ByVal varValue As Variant)
If Len(strWhere) > 0 Then
strWhere = strWhere & " AND "
End If
strWhere = strWhere & Application.BuildCriteria(strField, _
intDataType, varValue)
End Sub
然后你会这样调用:
Dim strWhere As String
ConcatenateWhere strWhere,"tblInventory.InventoryID", dbLong, 10036
ConcatenateWhere strWhere,"tblInventory.OtherAuthors", dbText, "*Einstein*"
Debug.Print strWhere
strSQL = "SELECT tblInventory.* FROM tblInventory"
strSQL = strSQL & " WHERE " & strWhere
...并且Debug.Print将输出此字符串:
tblInventory.InventoryID=10036 AND tblInventory.OtherAuthors Like "*Einstein*"
对于您来说,可能更有用的是变体,即您可能想要一个可选的连接运算符(这样您就可以使用OR),但我可能会通过构建一系列WHERE字符串并在代码中逐行使用OR进行连接来实现这一点,因为您可能希望仔细放置括号以确保AND/OR优先级得到正确执行。
现在,所有这些都没有真正解决INSERT语句中VALUES的连接问题,但我怀疑您在Access应用程序中实际上插入文字值的频率有多高。除非您使用未绑定的表单插入记录,否则您将使用表单插入记录,因此根本不需要SQL语句。因此,在Access应用程序中,对于VALUES子句,您不应该经常需要这样做。如果您发现自己需要编写这样的VALUES子句,我建议您没有正确使用Access。
话虽如此,您可以使用类似于以下内容的东西:
Public Sub ConcatenateValues(ByRef strValues As String, _
intDatatype As Integer, varValue As Variant)
Dim strValue As String
If Len(strValues) > 0 Then
strValues = strValues & ", "
End If
Select Case intDatatype
Case dbChar, dbMemo, dbText
' you might want to change this to escape internal double/single quotes
strValue = Chr(34) & varValue & Chr(34)
Case dbDate, dbTime
strValue = "#" & varValue & "#"
Case dbGUID
' this is only a guess
strValues = Chr(34) & StringFromGUID(varValue) & Chr(34)
Case dbBinary, dbLongBinary, dbVarBinary
' numeric?
Case dbTimeStamp
' text? numeric?
Case Else
' dbBigInt , dbBoolean, dbByte, dbCurrency, dbDecimal,
' dbDouble, dbFloat, dbInteger, dbLong, dbNumeric, dbSingle
strValue = varValue
End Select
strValues = strValues & strValue
End Sub
...这将连接您的值列表,然后您可以将其连接到整个SQL字符串中(在VALUES()子句的括号之间)。
但正如其他人所说,最好一开始就利用参数。