S'échapper " de l'Accès SQL
Je suis en train de faire un domaine de recherche en vba avec quelque chose comme ceci:
DLookup("island", "villages", "village = '" & txtVillage & "'")
Cela fonctionne bien jusqu'à ce que txtVillage est quelque chose comme Dillon s Bay, lorsque l'apostrophe est une offre unique, et j'obtiens une erreur à l'exécution.
J'ai écrit un triviaux de la fonction qui s'échappe par des apostrophes, il remplace "'" avec """. Cela semble être quelque chose qui arrive assez souvent, mais je ne trouve pas de référence à une fonction intégrée qui fait la même chose. Ai-je raté quelque chose?
Vous devez vous connecter pour publier un commentaire.
La fonction "Remplacer" devrait faire l'affaire. En fonction de votre code ci-dessus:
C'est pire que vous ne le pensez. Penser à ce qui arriverait si quelqu'un est entré une valeur comme cela, et que vous n'avez pas échappé à quoi que ce soit:
Pas assez.
La raison il n'y a pas de fonction intégrée pour simplement échapper l'apostrophe est parce que la bonne façon de gérer cela est d'utiliser les paramètres de la requête. Pour un fournisseur Ole/Accès à la requête de style vous définissez ce que votre chaîne de requête:
Et puis définissez le paramètre séparément. Je ne sais pas comment vous allez sur la définition de la valeur de paramètre à partir de vba, cependant.
Bien que l'abréviation domaine des fonctions telles que la fonction Rechdom sont tentants, ils ont leurs inconvénients. L'équivalent Jet SQL est quelque chose comme
Si vous avez plus d'un correspondant candidat il va choisir le "premier" un, la définition de "première" est mise en œuvre (moteur SQL) et dépendants de l'indéfini de la Jet/ACE moteur de l'IIRC. Savez-vous qui était le premier? Si vous n'avez pas alors orienter clairement de la fonction Rechdom 🙂
[Pour l'intérêt, la réponse pour Jet/ACE sera la valeur minimale basée sur le clusterd index à la fois la base de données de fichier a été compacté ou la première (période de validité) valeur insérée si la base de données n'a jamais été compacté. Index cluster est à son tour déterminée par la PRIAMRY CLÉ si persent sinon une contrainte UNIQUE ou index défini sur les colonnes not NULL, sinon la première (période de validité) ligne insérée. Que faire si il n'y a plus d'une contrainte UNIQUE ou index défini sur NON NULL colonnes, dont l'un serait utilisé pour la mise en cluster? Je n'en ai aucune idée! J'ai confiance que vous obtenez l'idée que "première" n'est pas facile à déterminer, même lorsque vous savez comment!]
J'ai aussi vu les conseils de Microsoft pour éviter d'utiliser des fonctions d'agrégation domaine de l'optimisation de point de vue:
D'informations sur les performances des requêtes dans une base de données Access
http://support.microsoft.com/kb/209126
"Éviter d'utiliser des fonctions d'agrégation domaine, comme la fonction DLookup... le Jet moteur de base de données ne peut pas optimiser les requêtes qui utilisent des fonctions d'agrégation domaine"
Si vous choisissez de le ré-écrire l'aide d'une requête vous pouvez ensuite profiter de l'PARAMÈTRES de syntaxe, ou vous pouvez préférer le Jet 4.0/ACE PROCÉDURE de syntaxe par exemple, quelque chose comme
De cette façon, vous pouvez utiliser le moteur de ses propres fonctionnalités, ou au moins de ses fournisseurs de données -- pour échapper à tous les personnages (et pas seulement doubles et les guillemets simples) que nécessaire.
Je crois que l'accès peut utiliser Chr$(34) et heureusement simples guillemets/apostrophes à l'intérieur.
par exemple
Si ensuite, vous auriez à échapper à la chr$(34) (")
Vous pouvez utiliser la fonction Remplacer.
Requêtes paramétrées comme Joel Coehoorn proposées sont la voie à suivre, au lieu de faire de la concaténation de chaîne de requête. La première permet d'éviter certains risques de sécurité, deuxième - je suis raisonnablement certain qu'il prend la fuite dans le moteur de ses propres mains et vous n'avez pas à vous soucier de cela.
Mais ensuite, il devrait ressembler à ceci (avec une apostrophe chaque):
Ou ce que je préfère:
Faire une fonction pour échapper les guillemets simples, parce que "s'échapper" avec les "[]" ne permettrait pas ces caractères dans votre chaîne...
J'utilise cette fonction pour toutes mes requêtes SQL, comme SELECT, INSERT et UPDATE (et dans la clause where ainsi...)
ou
Par la voie, voici mon EscapeQuotes fonction
Pour qui avoir des ennuis avec des guillemets simples et une fonction de remplacement, cette ligne peut sauver votre journée ^o^
mettre des parenthèses autour de critères qui pourraient avoir une apostrophe en elle.
Quelque chose comme:
Ils pourraient avoir besoin d'être à l'extérieur des guillemets simples ou juste autour txtVillage comme:
Mais si vous trouvez la bonne combinaison, il prendra soin de l'apostrophe.
Keith B
Ma solution est beaucoup plus simple. À l'origine, j'ai utilisé cette expression SQL pour créer un jeu d'enregistrements ADO:
Quand
myString
avait une apostrophe, comme Int'l Electrics, mon programme s'arrête. L'aide de guillemets doubles résolu le problème.