mboost-dp1

Problem med apostrof i SQL (og C#)


Gå til bund
Gravatar #1 - Tang
10. mar. 2007 09:40
Jeg er ved at programmere et program til min bog-database i C#. Nu er problemet så, at SQL ikke tillader apostrof i fx et navn.

C#:
string query = "INSERT INTO Author (id, name) VALUES (" + id + ",'" + name + "');";

det lille stykke kode ville ikke fungere hvis navnet var: O'Brien.

Hvordan løser jeg dette problem?
Gravatar #2 - JesperJ
10. mar. 2007 10:19
Du skal tilføje backslashes i din query. Nu ved jeg ikke om der findes en funktion til formålet, men ellers går jeg ud fra du kan bruge string.Replace funktionen i C#.

string.Replace("'", "\'");
string.Replace("\"", "\\"");
Gravatar #3 - Tang
10. mar. 2007 10:41
Tak for svaret/hjælpen

Men det løser desvære ikke problemet.
query'en ser stadig således ud:

INSERT INTO Author (id, name) VALUES (id,'O'Brien');
Gravatar #4 - JesperJ
10. mar. 2007 11:11
#3 Giver mysql nogen fejlmeddelelse?
Gravatar #5 - Tang
10. mar. 2007 11:35
Ja!

Fejlmeddelelse:
ERROR [42000] [Microsoft][ODBC Microsoft Access-driver] Der er en syntaksfejl, fordi der mangler en operator. i forespørgselsudtrykket "'O'Brien' WHERE AutId=5;".
Gravatar #6 - Saxov
10. mar. 2007 13:00
lav en string replace på ' til ` :)
Gravatar #7 - Cyrack
10. mar. 2007 13:05
Det skyldes at JesperJ glemte at escape :

string.Replace(@"'", @"'");
string.Replace(@""", @"\"");

Det burde virke (omend meget grimt).
Gravatar #8 - Tang
10. mar. 2007 13:44
#6
Udmærket idé, det virker faktisk uden problemer, når bare lige man husker at ændre det igen når man udskriver teksten.

#7
Tak for svaret men det virker dog ikke (eller også kan jeg bare ikke finde ud af det). Problemet består stadig i, at SQL ikke kan lide, at der står 'O'Brien'.

Saxov's idé er dog lidt en "halv løsning", men det virker da.
Gravatar #9 - Cyrack
10. mar. 2007 13:56
Trident:

Husker du at assigne .Replace(..) til din variable igen?
String a = "O'Brien", b = "";
b = a.Replace(@"'", @"\'");
Console.WriteLine(a); // O'Brien
Console.WriteLine(b); // O\'Brien


Hvis du ikke gør det påvirkes indholdet ikke, da en String ikke kan ændres direkte (kort fortalt: String + String -> Char[] + CHar[] -> String).

[Edit]
Husk \ i stedet for i quote miljøer (tak hmn!)
Gravatar #10 - Tang
10. mar. 2007 15:01
Tak for de rigtige gode svar, jeg har dog fundet ud af, at man skal bruge dobbelt-apostrof, i stedet for det der med backslash.

SQL:

INSERT (id, name) INTO Author VALUES (id, 'O''Brien');
Gravatar #11 - Acro
10. mar. 2007 19:56
Som programmør ærgrer jeg mig lidt over de mange dårlige svar, selvom det er positivt med den store velvilje til at hjælpe.

#1 Trident:
Med Microsoft SQL Server og Microsoft Access skal du blot lave ' om til '' (dvs. to af samme slags), så fungerer det (MySQL kræver \', hvilket nok var det, der forvirrede de fleste). Du bør dog aldrig vælge den løsning, fordi du så i enkelte tilfælde kan glemme det (og det åbner op for sårbarheder, hvor man kan manipulere din database fuldstændigt).

Jeg vil derfor råde dig til, at du kigger på DbParameter, der så sørger for alt det sure arbejde med at konvertere forbudte tegn og tage de forbehold, du ellers skulle klare manuelt. Du skal på siden finde 'Inheritance Hierarchy' og så vælge den variant, du benytter (formentlig OdbcParameter), så finder du eksempler på anvendelsen.

#6 Saxov:
Det er jo ikke en løsning at fjerne kompatibilitet for forskellige tegn. ` kan jo forekomme helt legitimt, men det umuliggør man, hvis man slår to tegn sammen til et. I stedet bør man selvfølgelig altid anvende de rigtige metoder til at sikre konsistens i blandt ens data.
Gravatar #12 - Saxov
10. mar. 2007 20:09
#11,
Bare rolig, når jeg selv laver kode bruger jeg skam masser af tid på at sikre at det ikke bare bliver sådanne hurtige løsninger, men mange gange er det, jft. min erfaring, rart at man kan lave en grim fix, og så flag'e den, og komme vidre med ens produkt.
Jeg har set for mange der sidder med et problem i 2-3 dage, istedet for blot at lave en sub-optimal løsning, der virker og så komme vidre.

For en hel del af de problemer man normalt oplever, er nogle man løser når man lige kommer vidre.. Du ved, man kan ikke se skoven for bare træer.. ;)
Gravatar #13 - arne_v
11. mar. 2007 20:09
Jeg er helt enig med Acro.

Brug af parameters er klart den bedste løsning.

Det er den sikreste og giver den pæneste kode.
Gravatar #14 - Tang
15. mar. 2007 12:22
#11

Tak for tippet om DbParameter, men jeg kan nu ikke helt finde ud af at bruge det. Er det noget som skal implementeres i databasen, eller skal det programmeres og hvordan løser det egentlig problemet med fx apostrof?
Jeg bruger en Microsoft Access database, hvis det skulle have en betydning.
Gravatar #15 - arne_v
15. mar. 2007 13:17
#14

ADO.NET provideren sætter selv de nødvendige ind for at håndtere
alle special tegn.

Der skulle gerne være eksmepler i docs. Ellers kan jeg hurtigt finde et.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login