VB 6.0で 'を' 'に置き換えるとスタックがオーバーフローする
-
06-07-2019 - |
質問
いくつかのレガシーVB 6.0コード(Access XPアプリケーション)を調査して、AccessアプリによるSQLステートメントの問題を解決しています。顧客名の名前にアポストロフィが含まれる場合は、単一引用符を2つの単一引用符に置き換える必要があります(例:「Doctor's Surgery」:
Replace(customerName, "'", "''")
一重引用符をエスケープするため、有効なSQLが取得されます。
SELECT blah FROM blah WHERE customer = 'Doctor''s Surgery'
残念ながら、Replace関数は無限ループとスタックオーバーフローを引き起こします。おそらく、関数replaceが追加された各引用符を再帰的に別の2つの引用符に変換するためです。例えば。 1つの引用符が2に置き換えられ、その2番目の引用符も2に置き換えられます...
---------------- EDIT ---------------
このプロジェクトで使用されている置換関数はカスタム作成されていることに(ポスターのおかげで)気付きました:
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の実装を支持してそれを削除します-これがうまくいかない場合、私は自分で書く自分自身を書きます。ご意見ありがとうございます!
解決
Replace関数のプロプライエタリな実装ではないのですか?
その場合、VB6のReplaceで置き換えることができます。
どのバージョンで登場したか覚えていない(Vb3ではなく、VB6だった)ので、元のコードベースがvb3 / 4だった場合は、手動でコーディングしたバージョンである可能性があります。
編集
あなたの編集を見たばかりです、正しかったです!
はい、その関数を削除することができるはずです。それから、ビルドVB6置換関数を使用します。
他のヒント
'を `に置き換えるか、完全に削除するオプションがあるVB6アプリケーションを使用します。
文字の中を歩いて、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