Access アプリによる SQL ステートメントの問題を解決するために、レガシーな VB 6.0 コード (Access XP アプリケーション) を調べています。顧客名の名前にアポストロフィが含まれている場合 (例: "Doctor's Surgery":
Replace(customerName, "'", "''")
一重引用符をエスケープするので、有効な SQL を取得できます。
SELECT blah FROM blah WHERE customer = 'Doctor''s Surgery'
残念ながら、Replace 関数は無限ループとスタック オーバーフローを引き起こします。おそらく、replace 関数は、追加された各引用符を別の 2 つの引用符に再帰的に変換するためです。たとえば、1 つの引用符が 2 つに置き換えられ、2 番目の引用符も 2 つに置き換えられます...
- - - - - - - - 編集 - - - - - - - -
このプロジェクトで使用されている置換関数がカスタム作成されていることに気付きました (ポスターのおかげで)。
Public Function replace(ByVal StringToSearch As String, ByVal ToLookFor As String,
ByVal ToReplaceWith As String) As String
Dim found As Boolean
Dim position As Integer
Dim result As String
position = 0
position = InStr(StringToSearch, ToLookFor)
If position = 0 Then
found = False
replace = StringToSearch
Exit Function
Else
result = Left(StringToSearch, position - 1)
result = result & ToReplaceWith
result = result & Right(StringToSearch, Len(StringToSearch) - position - Len(ToLookFor) + 1)
result = replace(result, ToLookFor, ToReplaceWith)
End If
replace = result
End Function
どうやら、VB には独自の置換機能が常にあるとは限りませんでした。この実装には欠陥があるはずです。人々のアドバイスに従い、VB 6 の実装を優先してそれを削除します。これが機能しない場合は、機能する独自のものを作成します。ご意見をお寄せいただきありがとうございます。