TopPicLogo TopPicText

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

Прислал: Юрий Максименко  http://db-maker.narod.ru

    Предлагаю Вашему вниманию Модуль преобразования величин для подстановки в 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

Назад ToTop
L.E. 03.03.2012
Рейтинг@Mail.ru