Переполнение стека при замене «на» в VB 6.0 - PullRequest
2 голосов
/ 17 июня 2009

Я ищу какой-то устаревший код VB 6.0 (приложение Access XP), чтобы решить проблему с оператором SQL в приложении Access. Мне нужно использовать замену одинарных кавычек на 2 одинарных кавычки в тех случаях, когда в имени клиента указан апостроф (например, «Хирургия доктора»:

Replace(customerName, "'", "''")

Который будет экранирован одинарной кавычкой, поэтому я получу действительный SQL:

SELECT blah FROM blah WHERE customer = 'Doctor''s Surgery'

К сожалению, функция Replace вызывает бесконечный цикл и переполнение стека, предположительно потому, что она заменяет функцию рекурсивно, преобразует каждую добавленную кавычку с двумя другими кавычками Например. одна цитата заменяется двумя, затем вторая цитата также заменяется двумя, и так далее ...

---------------- 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 - если это не сработает, я напишу свой, который работает. Спасибо всем за ваш вклад!

Ответы [ 3 ]

8 голосов
/ 17 июня 2009

Вы уверены, что это не запатентованная реализация функции замены?

Если это так, его можно просто заменить на VB6 Replace.

Я не могу вспомнить, в какой версии он появился (он не был в Vb3, но был в VB6), поэтому, если исходная кодовая база была vb3 / 4, это могла быть версия с ручным кодированием.

EDIT

Я только что видел твою правку, я был прав!

Да, вы должны просто удалить эту функцию, тогда она будет использовать встроенную функцию замены VB6.

2 голосов
/ 17 июня 2009

Я только что попробовал это в Access, и он работает нормально (без переполнения стека):

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


 Public Sub TestReplaceSingleQuote()
        Debug.Print ReplaceSingleQuote("Doctor's Surgery")
 End Sub
2 голосов
/ 17 июня 2009

Мы используем приложение VB6, которое может заменить 'на `или полностью удалить их.

Вы также можете пройтись по буквам, построив вторую строку и вставив каждое «как».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...