2009-06-17 11 views
2

Ich bin in einigen Legacy-VB 6.0-Code (eine Access XP-Anwendung), um ein Problem mit einer SQL-Anweisung durch die Access App zu lösen. Ich brauche zu verwenden, für die Fälle, einfache Anführungszeichen mit zwei einfachen Anführungszeichen zu ersetzen, wo ein Kundenname einen Apostroph im Namen (zB „Arztpraxis“ hat:Stack-Überlauf beim Ersetzen von "mit" in VB 6.0

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

, die den Apostroph werden entkommen, so dass ich die gültige SQL :.

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

Leider ist die Funktion ersetzen in eine Endlosschleife und Stapelüberlauf hervorruft, vermutlich weil es Funktion rekursiv wandelt jedes hinzugefügt Zitat mit weiteren 2 Anführungszeichen ersetzen Eg ein Quote von zwei ersetzt wird, dann ist das zweite Zitat auch ersetzt durch zwei und so weiter ...

---------------- BEARBEITEN ---------------

Ich habe bemerkt (dank Plakaten), dass die Funktion ersetzen in diesem Projekt ist individuell geschrieben:

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 

Offenbar hat VB nicht immer ersetzen Funktion von seinem eigenen. Diese Implementierung muss fehlerhaft sein. Ich werde den Ratschlägen der Leute folgen und sie zugunsten der Implementierung von VB 6 entfernen - wenn das nicht funktioniert, werde ich meine eigenen schreiben, was funktioniert. Vielen Dank für Ihre Anregungen!

+2

Stapelüberlauf? lol –

+2

Konstruieren Strings wie dies anfällig für SQL-Injection Attacks ... –

+0

Vereinbar ist es anfällig für SQL-Injektion. Die ganze Code-Basis ist schrecklich - ich habe es gerade auf einen Support-Vertrag genommen, weil der Entwickler oder die Firma, die es geschrieben hat, nicht mehr da ist ... wir wollen das Ding nicht umschreiben, sondern nur warten! –

Antwort

8

Sind Sie sicher, dass es nicht eine proprietäre Implementierung der Funktion ersetzen ist?

Wenn ja, kann er einfach durch Ersetzen von VB6 ersetzt werden.

Ich kann mich nicht erinnern, in welcher Version es erschien (es war nicht in Vb3, aber war in VB6), also wenn die ursprüngliche Codebasis vb3/4 war, könnte es eine handcodierte Version sein.

EDIT

ich deine Bearbeitung nur sah, war ich richtig!

Ja, Sie sollten in der Lage sein, nur diese Funktion zu entfernen, es wird dann die in VB6 Ersetzungsfunktion verwenden.

+0

eingebauten. Ja, es sieht so aus, als wäre es eine benutzerdefinierte Replace-Funktion, die ich nicht realisiert habe (siehe meinen bearbeiteten Post). Ich werde versuchen, es zu entfernen und zu sehen, was passiert ... –

+1

Sie müssen dafür in wirklich alten Access-Apps zu sehen. Access 97 wurde auf VB5 gebaut, die keine Replace-Funktion hatte, so dass Sie von Zeit zu Zeit darauf stoßen können. – Oorang

+0

Oorang: Ich dachte, es wäre eine späte Ergänzung, aber war nicht sicher, ob es in 5 oder 6 erschien. Danke Kumpel :) –

2

Wir verwenden eine VB6-Anwendung, die die Option "mit" ersetzen oder vollständig entfernen kann.

Sie könnten auch durch die Buchstaben gehen, eine zweite Zeichenfolge erstellen und jedes "as" einfügen.

2

ich das in Access gerade versucht, und es funktioniert gut (keine 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 
+1

Ja, die Replace-Funktion ist nicht das Problem - es sei denn, es ist eine proprietäre Implementierung von ersetzen, aus älteren Vb-Code, bevor ersetzt wurde –

+0

Ja, es sieht aus wie es eine benutzerdefinierte Replace-Funktion ist, die ich nicht erkannte (siehe meinen bearbeiteten Post). Ich denke, die Lösung ist, meine eigenen zu schreiben? –

+0

@James Allen: benutze einfach den in VB –

Verwandte Themen