Некоторые комментарии по созданию предложений WHERE в VBA.
Ваш пример по определению будет неверным, потому что вы помещаете одинарные кавычки там, где они не нужны. Это:
str_a = "db.col1 = 5"
str_b = " and db.col2 = 123"
str_c = " and db.col3 = 42"
"WHERE '" & str_a & "' '" & str_b & "' '" & str_c & "' ;"
... даст такой результат:
WHERE 'db.col1 = 5' ' and db.col2 = 123' ' and db.col3 = 42' ;
Это явно не сработает.
Уберите одинарные кавычки, и это должно сработать.
Теперь, как говорится, я бы никогда так не поступил. Я бы никогда не поместил AND в подстроки, которые используются для конструирования предложения WHERE, потому что, что бы я делал, если бы у меня было значение для второй строки, но не для первой?
Когда вам нужно объединить несколько строк с разделителем, и некоторые из них могут быть не назначены, нужно просто объединить их все и не беспокоиться, если строка перед объединением не назначена, не:
str_a = "db.col1 = 5"
str_b = "db.col2 = 123"
str_c = "db.col3 = 42"
Чтобы объединить это, вы должны сделать:
If Len(str_a) > 0 Then
strWhere = strWhere & " AND " str_a
End If
If Len(str_b) > 0 Then
strWhere = strWhere & " AND " str_b
End If
If Len(str_c) > 0 Then
strWhere = strWhere & " AND " str_c
End If
Когда назначены все три строки, это даст вам:
" AND db.col1 = 5 AND db.col2 = 123 AND db.col3 = 42"
Просто используйте Mid (), чтобы нарезать первые 5 символов, и он всегда будет корректным независимо от того, для каких переменных назначены значения:
strWhere = Mid(strWhere, 6)
Если ни один из них не назначен, вы получите строку нулевой длины, что вам и нужно. Если какой-либо из них назначен, вы сначала получите «И ...», который является ошибочным ведущим оператором, который вы просто удаляете командой Mid (). Это работает, потому что вы знаете, что все результаты до Mid () будут начинаться с «И», независимо от того, что - нет ненужных тестов на предмет того, было ли strWhere уже присвоено значение - просто вставьте туда «И» и нарежьте его в конце выкл.
В другой заметке кто-то упомянул SQL-инъекцию. Что касается Access, было долгое обсуждение того, что рассматривает много вопросов, близких к этой теме:
Инъекция SQL без веб-интерфейса