Quickie: sostituisce tutte le occorrenze di '(apostrofo) con' '(due apostrofi) in un AnsiString (C ++)

StackOverflow https://stackoverflow.com/questions/463816

  •  19-08-2019
  •  | 
  •  

Domanda

Penso che tu possa indovinare il problema che sto riscontrando. Sto inserendo nomi di file in un database sql in C ++ Builder. Alcuni file hanno un apostrofo nel loro nome. Ciò interrompe la query di inserimento sql. il solito modo per risolvere questo problema è raddoppiare e apostrofi si desidera far parte del valore del campo.

Ad esempio, se voglio aggiungere 'george's' al campo 'owner', la query sql sarebbe " inserire nella tabella (proprietario) i valori ('george''s') "

Sto bene con quel pezzetto. Devo solo sostituire i singoli apostrofi con quelli doppi. AnsiString non sembra avere una funzione integrata per questo. C'è un modo semplice per farlo senza dover includere un nuovo file di intestazione?

È stato utile?

Soluzione

In realtà ho avuto la risposta da solo ...

item = StringReplace( item, "'", "''", TReplaceFlags() <<rfReplaceAll );

(quindi esiste una funzione di sostituzione integrata in AnsiString dopotutto)

Modifica: aggiunti tag di codice in modo da poter distinguere tra virgolette diverse

Altri suggerimenti

Non ho usato AnsiString, ma sostanzialmente farei quanto segue:

  • Trova indietro tra virgolette singole nella tua stringa
  • Guarda a sinistra e a destra dell'indice di virgoletta singola corrente
  • Se non esiste già un'unica virgoletta, inserisci una virgoletta dopo l'indice corrente
  • Continua il ciclo fino a quando non premi l'indice 0.

Il solito modo per farlo è usare istruzioni preparate invece di generare il tuo sql. Cerca SQL Injection per un motivo per cui questo è negativo. Fondamentalmente, se in qualsiasi parte della tua app, ti dimentichi di raddoppiare le virgolette in qualsiasi istruzione sql e un utente malintenzionato può in qualche modo inviare un valore in tale istruzione sql, il tuo database viene violato. (Vedi questo fumetto xkcd per un esempio umoristico di ciò che può accadere.)

In C ++ Builder, stai cercando la funzione AnsiQuotedStr , in SysUtils . Il suo inverso è AnsiExtractQuotedStr . Non sono metodi del tipo AnsiString perché non hanno bisogno di una conoscenza intima degli interni del tipo.

Ancora più importante, tuttavia, dovresti usare query con parametri . Se i componenti che stai utilizzando per l'accesso al database non li supportano, procurati una libreria di database diversa. Le scelte di database non mancano, quindi puoi permetterti di essere esigente riguardo alle funzionalità e le query con parametri dovrebbero trovarsi in cima all'elenco.

Nota che nonostante il loro nome, le funzioni AnsiX accettano i parametri UnicodeString , non AnsiString , in Delphi e C ++ Builder 2009.

Cosa succede se lo sostituisci così

item = StringReplace( item, "'", "\'", TReplaceFlags() );
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top