ГлавнаяMS ACCESS Формирования SQL запроса со строковыми параметрами
Формирования SQL запроса со строковыми параметрами
Автор Бушуев Игорь (Balu)
29.06.2004 г.
При формировании SQL запроса, в котором нужно задать условие отбора по текстовому полю, используются ограничители строковых значений. Для решения данного вопроса предлагается функция ...
Как известно при формировании SQL запроса, в котором нужно задать какое-то условие отбора данных по текстовому полю, используются ограничители строковых значений. Ограничители строковых значений не являются частью строковой переменной и должны отдельно включаться в строку аргумента условия. Допускается использование, как одинарных кавычек ('), так и прямых кавычек ("). Например:
StrSQL="SELECT * FROM Table1 WHERE (( Field1=" & Chr(34) & Me.Поле1.Value & Chr(34) & "));"
Данный запрос выбирает из таблицы Table1 строки, в которых поле Field1 имеет значение равное значению, указанному в Поле1 формы. Запрос работает если, выражение в Поле1 не содержит символа прямых кавычек. В этом случае SQL запрос может выглядеть так:
StrSQL="SELECT * FROM Table1 WHERE (( Field1=" & Chr(39) & Me.Поле1.Value & Chr(39) & "));"
Отличие между двумя этими запросами состоит в том, что в первом случае в качестве ограничителей используются прямые кавычки Chr(34), а во втором одинарные - Chr(39). Приведенный пример показывает, что формирование SQL запроса в общих случаях зависит от содержания информации. А как быть, если Поле1 формы содержит произвольное количество, как одинарных кавычек, так и прямых?
К сожалению встроенный в Access метод BuildCriteria(поле, типПоля, выражение) мало помогает в таких случаях, так как значение условия отбора, передаваемое в него, в нашем случае, придется формировать самостоятельно. Для решения данного вопроса предлагается функция MyBuildCriteria(поле, выражение), автоматически формирующая критерий отбора в текстовых полях для точного совпадения с образцом.
Пример использование функции: StrSQL="SELECT * FROM Table1 WHERE ((" & MyBuildCriteria("Field1", Поле1.Value) & "))"
Функция MyBuildCriteria
' Функция формирования критерия запроса. Public Function MyBuildCriteria(MyField As String, MyString As String) As String
' MyField – Строковое выражение, определяющее поле, для которого задается условие отбора. ' MyString - Строковое выражение, определяющее условие отбора. '******************************************************** Dim MyString1 As String, MyString2 As String
MyString1 = MyChangeChr(MyString, Chr(34), "?")
If MyString1 = MyString Then 'Символа прямые кавычки в критерии отбора нет. MyBuildCriteria = "(" & MyField & ") = " & Chr(34) & MyString1 & Chr(34) Exit Function End If
MyString2 = MyChangeChr(MyString, Chr(39), "?")
If MyString2 = MyString Then 'Символа одинарные кавычки в критерии отбора нет. MyBuildCriteria = "(" & MyField & ") = " & Chr(39) & MyString2 & Chr(39) Else 'Критерий отбора содержит символы строковых ограничителей двух видов. MyBuildCriteria = "(" & MyField & ") Like " & Chr(34) & MyString1 & Chr(34) & _ " And (" & MyField & ") Like " & Chr(39) & MyString2 & Chr(39) End If End Function
' Функция замены каждого символа SearchChar на символ InsertChar в строке MyString
Public Function MyChangeChr(MyString As String, SearchChar As String, InsertChar As String) As String '************************************************* MyChangeChr = MyString Do While InStr(1, MyChangeChr, SearchChar) > 0 MyChangeChr = Left(MyChangeChr, InStr(1, MyChangeChr, SearchChar) - 1) & _ InsertChar & Right(MyChangeChr, Len(MyChangeChr) - InStr(1, MyChangeChr, SearchChar)) Loop End Function
При формировании критерия отбора как для точного так и неточного совпадения с образцом, можно использовать более сложную функцию MyBuildCriteria_L(поле, выражение,[доп.условие]).
Пример использование функции: StrSQL="SELECT * FROM Table1 WHERE ((" & MyBuildCriteria_L("Field1", Поле1.Value, "**") & "))"
Функция MyBuildCriteria_L
' Функция формирования критерия запроса.
Public Function MyBuildCriteria_L(MyField As String, MyString As String, Optional MyOptional As String = "") As String
' MyField - Строковое выражение, определяющее поле, для которого задается условие отбора. ' MyString - Строковое выражение, определяющее условие отбора. ' MyOptional- Выражение, указывающее способ отбора: ' " *" - Несовпадение с правой частью ' "* " - Несовпадение с левой частью ' "**" - Несовпадение и справа и слева '******************************************************** Dim MyString1 As String, MyString2 As String Dim MyLeft As String, MyRight As String Dim MyOperand As String
MyOperand = " Like "
Select Case MyOptional Case " *" MyRight = "*" Case "* " MyLeft = "*" Case "**" MyLeft = "*" MyRight = "*" Case Else MyOperand = " = " End Select
MyString1 = MyChangeChr(MyString, Chr(34), "?")
If MyString1 = MyString Then MyBuildCriteria = "(" & MyField & ")" & MyOperand & Chr(34) & MyLeft & MyString1 & MyRight & Chr(34) Exit Function End If
MyString2 = MyChangeChr(MyString, Chr(39), "?")
If MyString2 = MyString Then MyBuildCriteria = "(" & MyField & ")" & MyOperand & Chr(39) & MyLeft & MyString2 & MyRight & Chr(39) Else MyBuildCriteria = "(" & MyField & ") Like " & Chr(34) & MyLeft & MyString1 & MyRight & Chr(34) & _ " And (" & MyField & ") Like " & Chr(39) & MyLeft & MyString2 & MyRight & Chr(39) End If End Function