Вопрос

Я изучаю некоторый устаревший код 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top