2009-03-16 10 views
7

Ich habe die folgende Zeichenfolge, die nicht kompiliert werden:Escaping wörtlich Stringliterale

String formLookupPull = @"SELECT value1, '"+tableName+"', '"+columnName+"' FROM lkpLookups WHERE ""table"" = '" + tableName + "' and ""field"" = '" + columnName + "';"; 

Die beanstandeten Abschnitte sind:

""table"" = 

und

""field"" = 

Der Compiler wird immer alles auf die Escape-Sequenz gemischt. Kann jemand sehen, was falsch ist?

+0

danke für die schnellen Antworten! –

+1

Sie könnten in Erwägung ziehen, dieses Problem zu umgehen, indem Sie LINQtoSQL verwenden, anstatt eine eigene Abfragezeichenfolge zusammenzusetzen. –

Antwort

6

Das Problem ist, dass nicht alle Saiten Sie verketten sind wörtlich Stringliterale, nur der erste Teil der Verkettung ist.

Mit anderen Worten,

@"SELECT value1, '" 

ist die einzige wörtlich wörtliche in der gesamten Anweisung, um die endgültige Zeichenfolge zu bauen.

Sie müssten @ vor den Rest Ihrer Strings hinzufügen, um sie alle wörtlich zu machen.

Welche es aussehen würde:

String formLookupPull = @"SELECT value1, '"+tableName+ @"', '"+columnName+ @"' FROM lkpLookups WHERE ""table"" = '" + tableName + @"' and ""field"" = '" + columnName + @"';"; 
5

Sie möchten \" verwenden, um Zitate zu vermeiden, nicht "".

So:

.. FROM lkpLookups WHERE \"table\" = '" .. 

Edit:

Weitere Erläuterungen:

Sie nur eine @ haben auf der ersten von allen Saiten Sie verketten. In literalen Strings (mit einem @ davor) können Sie Anführungszeichen mit einem doppelten Anführungszeichen umgehen. In normalen Strings ist es ein Schrägstrich-Zitat.

Eg.

string s = @"this is a literal string with ""quotes"" in it, " 
     + "and this is a normal string with \"quotes\" in it"; 

string t = @"two literal strings" + @", concatenated together."; 
+0

Verbatim String-Literale verwenden nicht \ als Escape-Zeichen, die einzige Escape-Sequenz ist "", was verwendet wird. Das Problem besteht darin, dass die wörtliche Zeichenfolgenkennung @ nur auf die erste Zeichenfolge angewendet wird und nicht auf die mit + angefügten. – Whatsit

+0

Das Problem ist, dass er die falsche Escape-Sequenz für seinen String-Typ verwendet. Er kann entweder die Zeichenkette in literal ändern (wie du sagst), oder die Escape-Sequenz ändern (wie gesagt) – Blorgbeard

+0

Einverstanden, aber deine ursprüngliche Antwort implizierte, dass "" im allgemeinen Sinn falsch war, also war es wahrscheinlich, jemanden zu verwirren ist nicht mit verbatim String-Literalen vertraut. Ihre überarbeitete Antwort ist viel klarer. – Whatsit

1
String formLookupPull = @"SELECT value1, '"+tableName+"', '"+columnName+"' FROM lkpLookups WHERE \"table\" = '" + tableName + "' and \"field\" = '" + columnName + "';"; 

Ich vertraue darauf, dass Sie diese Variablen korrekt sind auf der Flucht vor dieser Abfrage bauen :)

+0

lol ja lass uns hoffen, ich bekam eine DLL mit allen Funktionen für die Ausführung von DB IO drin ... Ich bin mir ziemlich sicher, dass es richtiges SQL entkommt, aber ich schaute nicht wirklich genau hin ... –

4

Gut nach dem ersten Ende des Zitats wird das @ -Zeichen nicht mehr sowieso verwendet werden, so dass Sie frei, das Escape-Zeichen zu verwenden. Versuchen Sie, Ihren „Tisch“ setzt verpackt in ‚[‘ wie [Tabelle] und [field] oder Flucht aus dem "Zeichen einer \.

String formLookupPull = @"SELECT value1, '" + tableName + "', '" + columnName + "' FROM lkpLookups WHERE [table] = '" + tableName + "' and [field] = '" + columnName + "';"; 
17

Um die Titelfrage Adresse ...

Um zu entkommen dem Zitat in einem wörtlich Stringliteral, verwenden Sie die quote-Escape-Sequenz "" (das ist zwei Anführungszeichen)

string a = @"He said ""Hi!""..."; // He said "Hi!"... 

Siehe MSDN um weitere Details zu entkommen, usw.

Beachten Sie, dass in Ihrem geposteten Code die einzige wörtliche Zeichenfolge die erste ist (mit der @ davor). Die nachfolgenden Zeichenfolgen sind nicht wörtlich, also wäre die richtige Escape-Sequenz \".

Sie können es schönere aussehen mit string.Format:

String formLookupPull = 
    string.Format(@"SELECT value1, '{0}', '{1}' FROM lkpLookups" + 
       @"WHERE ""table"" = '{0}' and ""field"" = '{1}';", 
       tableName, columnName) 
4

Wenn Sie nicht SQL-Parameter verwenden können, String.Format kann wenig sauberer und lesbarer als reine „+ Verkettung“ sein.

string formLookupPull = 
    string.Format(@"SELECT value1, '{0}', '{1}' 
         FROM lkpLookups 
        WHERE ""table"" = '{0}' AND ""field"" = '{1}';", 
       tableName, columnName); 
+0

Es ist selten so Sie können DbParameter nicht in einem DbCommand verwenden. – ProfK

+0

Das mag ein solcher Fall sein ... Ich benutze eine Bibliothek, die mir nichts davon vorenthält, und ich versuche, so viel wie möglich dabei zu bleiben, weil es mit ein paar Nebenwirkungen kommt, die ich müsste ich sonst reproduzieren ... –

+0

+1. 'String.Format' ist dafür viel besser. –

1

Warum Sie die wörtliche Namen der Spalten zitiert werden, scheint mir unnötig.

"SELECT Wert1," + Tabellenname + "," + Spaltenname + "FROM lkpLookups WHERE Tabelle = '" + Tabellenname + "' und Feld = '" = Spaltenname + "';";

Nicht getestet, aber ich denke, Sie werden die Idee bekommen.