Переполнение стека при замене ' на " в VB 6.0
-
06-07-2019 - |
Вопрос
Я изучаю некоторый устаревший код VB 6.0 (приложение Access XP), чтобы решить проблему с SQL-инструкцией приложения Access.Мне нужно использовать замену одинарных кавычек на 2 одинарные кавычки для случаев, когда имя клиента имеет апостроф в имени (например"Хирургическая операция доктора":
Replace(customerName, "'", "''")
Который не будет заключен в одинарную кавычку, поэтому я получаю действительный SQL:
SELECT blah FROM blah WHERE customer = 'Doctor''s Surgery'
К сожалению, функция Replace вызывает бесконечный цикл и переполнение стека, предположительно потому, что функция replace рекурсивно преобразует каждую добавленную цитату в другие 2 кавычки.Например.одна цитата заменяется двумя, затем эта вторая цитата также заменяется двумя, и так далее...
----------------РЕДАКТИРОВАТЬ---------------
Я заметил (благодаря плакатам), что функция replace, используемая в этом проекте, написана на заказ:
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.
Я не могу вспомнить, в какой версии это появилось (этого не было в Vb3, но было в VB6), поэтому, если исходная кодовая база была vb3 / 4, это могла быть версия, закодированная вручную.
Редактировать
Я только что увидел вашу правку, я был прав!
Да, вы должны иметь возможность просто удалить эту функцию, затем она будет использовать функцию замены в сборке VB6.
Другие советы
Мы используем приложение VB6, в котором есть возможность заменить "на` или удалить их полностью.
Вы также могли бы пройтись по буквам, построив вторую строку и вставив в каждую " как ".
Я только что попробовал это в 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