Назначение функции sqlReplace() Существует набор символов, имеющих специаьное значение в SQL, но которые могут оказаться и в Ваших текстовых данных. Самый заметный среди таких [проблемных] символов - апостроф. То есть если Вы, например, хотите ввести в выражение запроса название McDonald′s, то, чтоб не получить ошибку, должны обработать вхождение апострофа. Так, для MS Access Вы должны будете заменить один апостроф двумя, а для MySQL поставить перед апострофом обратный слэш. НО если Вы просто примените для этого функцию Replace(), то совершите ошибку, которая Вам аукнется, например, когда Вы попытаетесь программно сохранить выражение запроса в поле таблицы. Надеюсь, Вам понятно, что в случае Replace() Вы получите McDonald′′s. Функция sqlReplace() осуществляет замену корректно, без повторного [квочения] строки.
Поддержка нескольких СУБД В число параметров функций ToSQL() и dateToSQL() входит параметр platform. Он-то и позволяет Вам перейти на другую СУБД, не переписывая те участки, в которых происходит собирание запросов. Пишете новый case в ToSQL() и dateToSQL(), заменяете принятый по уочанию Access на новую платформу - и все запросы теперь собираются в синтаксисе новой платформы
Option Compare Database Option Explicit ′================================================== ′Для подстановки даты и времени строкой в запрос SQL. ′platform - СУБД, для которой составляется выражение
Function dateToSQL(ByVal Date_ As Date, Optional ByVal platform As String) As String If platform = "" Then platform = "Access" Select Case platform Case "Access" dateToSQL = "#" & Trim(str(Month(Date_))) & "/" & Trim(str(Day(Date_))) & "/" & Trim(str(Year(Date_))) dateToSQL = dateToSQL & " " & Trim(str(Hour(Date_))) & ":" & Trim(str(Minute(Date_))) & ":" & Trim(str(Second(Date_))) dateToSQL = dateToSQL & "#" Case "MySQL" dateToSQL = "′" & Year(Date_) & "-" & Month(Date_) & "-" & Day(Date_) & " " & Hour(Date_) & ":" & Minute(Date_) & ":" & Second(Date_) & "′" Case Else End Select End Function
′================================================== ′Заменяет в строке strToSQL спецсимвол specChar на replace - для вставки текстовой константы в запрос SQL ′Отличается от обычной замены тем, что не заменяет спецсимвол specChar, если он уже ранее заменялся на replace ′Примеры: ′sqlReplace("McDonald′s")="McDonald′′s" ′sqlReplace("McDonald′′s")="McDonald′′s" !!! заметьте - не "McDonald′′′′s" !!! ′sqlReplace("McDonald′s","′","′")="McDonald′s" !!! заметьте - не McDonald′′′′s
Function sqlReplace(ByVal strToSQL As String, Optional ByVal specChar As String, Optional ByVal replace As String) As String Dim Pos, r, s As Integer
If specChar = "" Then specChar = "′" If replace = "" Then replace = "′′" strToSQL = " " & strToSQL ′ на случай начала строки с specChar
s = Len(specChar) r = Len(replace): Pos = 2 Do While Len(strToSQL) >= Pos If (Mid(strToSQL, Pos, s) = specChar) And (Mid(strToSQL, Pos, 2) <> replace) And (Mid(strToSQL, Pos - 1, 2) <> replace) Then
strToSQL = Left(strToSQL, Pos - 1) & replace & Mid(strToSQL, Pos + 1) Pos = Pos + r Else Pos = Pos + 1 End If
Loop
sqlReplace = Mid(strToSQL, 2) ′Убираем пробелы, которые подставили в начале End Function
′=================================================== ′Преобразование величины для подстановки в запрос SQL
Public Function ToSQL(ByVal Value, Optional platform As String) As String
If IsNull(Value) Then Value = ""
If platform = "" Then platform = "Access" Select Case platform Case "Access"
Select Case VarType(Value)
Case vbDate ToSQL = dateToSQL(Value) Case vbString ToSQL = "′" & sqlReplace(Value) & "′" Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency ToSQL = Trim(str(Value)) Case vbBoolean ToSQL = IIf(Value, "-1", "0") End Select Case Else
End Select End Function |