2009-06-17 8 views
2

Je suis à la recherche d'un code VB 6.0 hérité (une application Access XP) pour résoudre un problème avec une instruction SQL par l'application Access. Je dois utiliser remplacer des guillemets simples avec 2 guillemets simples pour les cas où un nom de client a une apostrophe au nom (par exemple « chirurgie du Docteur »:Dépassement de pile lors du remplacement de 'avec' 'dans VB 6.0

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

qui va échapper à la seule citation, je reçois le SQL valide :.

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

Malheureusement, la fonction remplacer provoque un débordement de la boucle et pile infinie, sans doute parce qu'elle remplace la fonction convertit récursive chaque citation ajoutée avec 2 autres guillemets, par exemple une citation est remplacée par deux, puis cette deuxième citation est également remplacé par deux, et ainsi de suite ...

---------------- EDIT ---------------

J'ai remarqué (grâce aux affiches) que la fonction de remplacement utilisé dans ce projet est écrit sur mesure:

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 

Apparemment, VB n'ont pas toujours remplacer la fonction de son propre. Cette implémentation doit être imparfaite. Un aller suivre le conseil de folk et l'enlever en faveur de la mise en œuvre de VB 6 - si cela ne fonctionne pas, j'écrirai le mien qui fonctionne. Merci à tous pour votre contribution!

+2

débordement de pile? lol –

+2

La construction de chaînes de ce type est sujette aux attaques par injection SQL ... –

+0

D'accord, il est vulnérable à l'injection SQL. L'ensemble de la base de code est horrible - je l'ai juste pris sur un contrat de support, parce que le développeur ou l'entreprise qui l'a écrit n'est plus là ... nous ne voulons pas réécrire la chose, il suffit de la maintenir! –

Répondre

8

Êtes-vous sûr que ce n'est pas une implémentation propriétaire de la fonction de remplacement?

Si oui, il peut juste être remplacé par remplacer VB6. Je ne me souviens pas de la version dans laquelle elle est apparue (elle n'était pas dans Vb3, mais dans VB6), donc si la base de code originale était vb3/4, elle pourrait être une version codée à la main.

EDIT

Je viens de voir votre édition, j'avais raison! Oui, vous devriez pouvoir supprimer cette fonction, il utilisera alors la fonction de remplacement VB6 in build.

+0

Oui, il semble que ce soit une fonction de remplacement écrit sur mesure, que je n'ai pas réalisé (voir mon post édité). Je vais essayer de l'enlever et voir ce qui se passe ... –

+1

Vous devez regarder pour cela dans les applications d'accès très anciennes. Access 97 a été construit sur VB5 qui n'avait pas de fonction Remplacer, donc vous pouvez courir à travers de temps en temps. – Oorang

+0

Oorang: Je pensais que c'était un ajout tardif, mais je ne savais pas si elle est apparue en 5 ou 6. Merci mon pote :) –

2

Nous utilisons une application VB6 qui a la possibilité de remplacer «avec» ou de les supprimer complètement.

Vous pouvez également parcourir les lettres, construire une deuxième chaîne et insérer chaque 'comme'.

2

Je viens d'essayer ce dans Access et il fonctionne très bien (pas 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

Oui, la fonction Remplacer n'est pas le problème - à moins qu'il s'agisse d'une implémentation propriétaire de remplacement, à partir du code Vb hérité, avant que le remplacement ne soit inclus –

+0

Oui, il semble que ce soit une fonction Remplacer personnalisée que je n'ai pas réalisée (voir mon post édité). Je suppose que la solution est d'écrire le mien? –

+0

@ James Allen: il suffit d'utiliser celui intégré dans VB –