כתבתי
אם כן פונקציה זו תספיק כפרמטר:
Public Function SqlParameter(Text As String, Optional AsNumeric As Boolean = False)
If AsNumeric Then
If IsNumeric(Text) Then SqlParameter = Text
Exit Function
End If
SqlParameter = Replace(Replace(Text, "'", "''"), "", """")
End Function
אבל יש לכאורה טעות בקוד - כי רק את סוג המרכאה המקיפה צריך לשכפל בשביל שישאר הטקסט נכון.
אם מקיף ' יש לשכפל רק את ' , אם מקיף " יש לשכפל רק את ".
לכן נראה לי הקוד הזה נכון יותר (זה מה שאני משתמש) - 2 פונקציות:
Public Function Sql_InsertNumeric(MyVariant As Variant) As Variant
' לפני הכנסה כשרשור טקסט לפונקציה
' DLookup
' וכדומה, או לשאילתה שאי אפשר להכניס בה פרמטרים בדרך הרגילה.
' הפונקציה הנוכחית מוודאת שאין הזרקת 'קוד זדוני' לשאילתה על ידי וידוא שמדובר במספר
If IsNumeric(MyVariant) Then
Sql_InsertNumeric = MyVariant
Else
Sql_InsertNumeric = ""
End If
End Function
Public Function Sql_InsertString(Text As String) As String
' לפני הכנסה כשרשור טקסט לפונקציה
' DLookup
' וכדומה, או לשאילתה שאי אפשר להכניס בה פרמטרים בדרך הרגילה.
' הפונקציה הנוכחית מוודאת שאין הזרקת 'קוד זדוני' לשאילתה, ומוסיפה גרש מכל צד לציון הטסקט
'תיקנתי כאן, כי בשאילתות וכן בקוד אם מקיף את הטקסט גרש בודד אין משמעות לגרשיים ולהיפך - כשמקיפים גרשיים אין משמעות לגרש
Sql_InsertString = "'" & Replace(Text, "'", "''") & "'"
End Function
ולשאילתת פעולה רגילה שאפשר להשתמש בה עם פרמטרים:
Public Sub RunSqlWithParameters(TextSql As String, ParamArray TextParameters() As Variant)
On Error GoTo MsgErr
Dim MyQuery As QueryDef
Dim TextParameter As Variant
Dim NumParameter As Integer
NumParameter = 0
Set MyQuery = CurrentDb.CreateQueryDef("", TextSql)
For Each TextParameter In TextParameters
MyQuery.parameters(NumParameter) = TextParameter
NumParameter = NumParameter + 1
Next
MyQuery.Execute
ExitErr:
Exit Sub
MsgErr:
MsgBox Error$
Resume ExitErr
End Sub
אשמח להערות.
(השמות SQL_INSERTSTRING ו Sql_InsertNumeric לא משהו... אשמח לשמוע שם אחר. יש עדיפות שיתחיל ב SQL למציאה קלה...)