Quickie - remplacer toutes les occurrences de '(apostrophe) avec " (deux apostrophes) dans un AnsiString (C++)
Je pense que vous pouvez deviner le problème que je vais avoir. Je suis d'insérer les noms de fichiers dans une base de données sql en C++ Builder. Certains fichiers ont une apostrophe dans leur nom. Cela rompt avec le sql de la requête d'insertion. la façon habituelle de résoudre ce problème est de doubler et apostrophes vous voulez faire partie de la valeur du champ.
Par exemple si je veux rajouter "george" champ "propriétaire" de la requête sql serait "insert into table (propriétaire) values ('george"s")"
Je suis ok avec ça. J'ai juste besoin d'obtenir les apostrophes simples remplacé par double. AnsiString ne semble pas avoir un construit en fonction pour cela. Est-il un moyen simple de le faire sans avoir à inclure un tout nouveau fichier d'en-tête?
OriginalL'auteur MrVimes | 2009-01-21
Vous devez vous connecter pour publier un commentaire.
En fait j'ai eu la réponse par moi-même...
(il y a donc un construit en fonction replace dans AnsiString après tout)
Edit: Ajout des balises de code, de sorte que nous pouvons distinguer entre les différentes citations
Ne sais pas. Une façon de le savoir. Je vais mettre un guillemet double dans un nom de fichier et de voir ce qui se passe... Il semble bien fonctionner. Il tourne des guillemets dans quadrouple citations, qui permettrait de préserver les guillemets dans la base de données.
Donc je suppose qu'il donnera toujours un même nombre de citations (chaque devis est transformée en deux), qui serait toujours "travailler" dans la base de données.
p.s. la syntaxe correcte pour ce que je fais est... article = StringReplace( point, "'", """, TReplaceFlags()<<rfReplaceAll);
merci pour la réponse
OriginalL'auteur MrVimes
Je n'ai pas utilisé AnsiString, mais, fondamentalement, je ne les suivants:
C'est OK si vous voulez juste pour s'assurer qu'aucune apostrophe est nu, mais il n'est pas bon si vous voulez conserver les données. Une double apostrophe deviendra une apostrophe lors de l'insertion dans la base de données, et il ne sera pas re-doublé lors de la sélection, de sorte que vous ne saurez pas ce qui a été inséré.
OriginalL'auteur Eddie Parker
La façon habituelle de faire cela est d'utiliser les requêtes préparées par opposition à la production de vos propres sql. Rechercher L'Injection SQL pour l'une des raisons pourquoi c'est mauvais. En gros, si n'importe où dans votre application, vous oubliez de doubler les guillemets dans une instruction sql, et un attaquant peut en quelque sorte de présenter une valeur dans cette instruction sql de votre base de données est piraté. (Voir cette bd xkcd pour un plein d'exemple de ce qui peut arriver.)
L'Injection SQL. Ce que je fais pour mon propre usage, de sorte que personne d'autre ne sera capable de le voir. Mais je vais lire sur l'Injection SQL de toute façon comme je l'ai un jour peut-être faire beaucoup de sql pour un site web.
Les détails réels dépendent de votre base de données de l'API que vous utilisez. Regarder à travers elle pour quelque chose comme des déclarations préparées ou des requêtes paramétrées.
OriginalL'auteur Eclipse
Dans C++ Builder, vous êtes à la recherche pour le
AnsiQuotedStr
fonction, dansSysUtils
. Son inverse estAnsiExtractQuotedStr
. Ils ne sont pas des méthodes de laAnsiString
type lui-même, parce qu'ils n'ont pas besoin de connaissance intime du type de fonctionnement interne.Plus important encore, cependant, vous devriez être en utilisant des requêtes paramétrées. Si les composants que vous utilisez pour les accès de base de données ne prennent pas en charge ces, puis obtenir une autre base de données de la bibliothèque. Il n'y a pas de pénurie de choix de la base de données, de sorte que vous pouvez vous permettre d'être pointilleux sur les fonctionnalités, et les requêtes paramétrées devrait être près du haut de la liste.
Noter que, malgré leur nom, les
AnsiX
fonctions acceptentUnicodeString
paramètres, pasAnsiString
, en Delphi et C++ Builder 2009.OriginalL'auteur Rob Kennedy
Qu'advient-il si l'on remplace comme ça
OK. Il doit aussi être possible d'utiliser ", tels que : les valeurs("O'Malley")
OriginalL'auteur Riho