Модуль преобразования величин для подстановки в SQL-запрос

Источник: codingclub
Максименко Юрий

Предлагаю Вашему вниманию Модуль преобразования величин для подстановки в SQL-запрос с моего сайта. Для тех, кто хотел бы разобраться и, возможно, внести усовершенствования, сделаю парочку пояснений.

Назначение функции 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


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=16261