正如其他人所说,首先使用参数可能会更好。不过……
我也错过了连接运算符,已经习惯了 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 语句。因此,对于 VALUES 子句,似乎在 Access 应用程序中您不应该经常需要它。如果您发现自己需要编写这样的 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() 子句的括号之间)。
但正如其他人所说,首先使用参数可能会更好。