Stack overflow quando si sostituisce 'con' 'in VB 6.0
-
06-07-2019 - |
Domanda
Sto cercando un codice VB 6.0 legacy (un'applicazione Access XP) per risolvere un problema con un'istruzione SQL dall'app Access. Devo utilizzare la sostituzione di virgolette singole con 2 virgolette singole per i casi in cui il nome di un cliente ha un apostrofo nel nome (ad es. & Quot; Doctor's Surgery " ;:
Replace(customerName, "'", "''")
Che sfuggirà alla singola citazione, quindi ottengo l'SQL valido:
SELECT blah FROM blah WHERE customer = 'Doctor''s Surgery'
Sfortunatamente la funzione Sostituisci provoca un loop infinito e un overflow dello stack, presumibilmente perché sostituisce ricorsivamente ogni citazione aggiunta con altre 2 virgolette. Per esempio. una citazione viene sostituita da due, quindi anche quella seconda viene sostituita da due e così via ...
---------------- --------------- EDIT
Ho notato (grazie ai poster) che la funzione di sostituzione usata in questo progetto è scritta su misura:
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
Apparentemente, VB non ha sempre avuto una sua funzione di sostituzione. Questa implementazione deve essere imperfetta. Seguirò il consiglio della gente e lo rimuoverò a favore dell'implementazione di VB 6 - se questo non funziona, scriverò il mio che funziona. Grazie a tutti per il vostro contributo!
Soluzione
Sei sicuro che non sia un'implementazione proprietaria della funzione Sostituisci?
In tal caso, può essere semplicemente sostituito da Sostituisci di VB6.
Non ricordo in quale versione appariva (non era in Vb3, ma era in VB6) quindi se la base di codice originale era vb3 / 4 potrebbe essere una versione codificata a mano.
Modifica
Ho appena visto la tua modifica, avevo ragione!
Sì, dovresti riuscire a rimuovere quella funzione, quindi utilizzerà la funzione di sostituzione VB6 in build.
Altri suggerimenti
Utilizziamo un'applicazione VB6 che ha la possibilità di sostituire "con" o rimuoverli completamente.
Potresti anche camminare tra le lettere, costruendo una seconda stringa e inserendo ciascuna 'as' '.
Ho appena provato questo in Access e funziona benissimo (senza 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