문제

액세스 앱의 SQL 문의 문제를 해결하기 위해 일부 레거시 VB 6.0 코드 (액세스 XP 응용 프로그램)를 조사하고 있습니다. 고객 이름에 이름에 아포스트로피가있는 경우 (예 : "Doctor 's Surgery":

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

단일 견적을 피할 수 있으므로 유효한 SQL을 얻습니다.

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

불행히도 교체 함수는 무한 루프 및 스택 오버플로를 유발합니다. 아마도 추가 된 함수를 재귀 적으로 추가 된 인용문을 다른 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는 항상 자체의 교체 기능을 갖지는 않았습니다. 이 구현은 결함이 있어야합니다. Folk의 조언을 따르고 VB 6의 구현에 찬성하여 제거 할 것입니다. 이것이 작동하지 않으면 저의 자신의 글을 쓸 것입니다. 귀하의 의견에 감사드립니다!

도움이 되었습니까?

해결책

교체 함수의 독점적 구현이 아니라고 확신합니까?

그렇다면 VB6의 교체로 대체 할 수 있습니다.

어떤 버전이 나타나지 않았는지 (VB3에 있지 않았지만 VB6에 있었음) 원래 코드베이스가 VB3/4 인 경우 핸드 코드 버전 일 수 있습니다.

편집하다

방금 당신의 편집을 보았습니다. 나는 옳았습니다!

예, 해당 함수를 제거 할 수 있어야합니다. 그런 다음 빌드 vb6 교체 기능을 사용합니다.

다른 팁

우리는 '로 교체하거나 완전히 제거 할 수있는 vb6 응용 프로그램을 사용합니다.

또한 문자를 걸어 두 번째 끈을 만들고 각각 '' '를 삽입 할 수도 있습니다.

방금 액세스에서 이것을 시도했는데 잘 작동합니다 (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