2

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 の実装を優先してそれを削除します。これが機能しない場合は、機能する独自のものを作成します。ご意見をお寄せいただきありがとうございます。

4

3 に答える 3

2

Access でこれを試したところ、正常に動作しました (stackoverflow なし):

 Public Function ReplaceSingleQuote(tst As String) As String
        ReplaceSingleQuote = Replace(tst, "'", "''")
 End Function


 Public Sub TestReplaceSingleQuote()
        Debug.Print ReplaceSingleQuote("Doctor's Surgery")
 End Sub
于 2009-06-17T15:29:46.780 に答える