Sfuggire letteralmente a stringhe letterali
-
19-08-2019 - |
Domanda
Ho la seguente stringa che non verrà compilata:
String formLookupPull = @"SELECT value1, '"+tableName+"', '"+columnName+"' FROM lkpLookups WHERE ""table"" = '" + tableName + "' and ""field"" = '" + columnName + "';";
Le sezioni offensive sono:
""table"" =
e
""field"" =
Il compilatore si sta confondendo sulla sequenza di escape. Qualcuno può vedere cosa c'è che non va?
Soluzione
Il problema è che non tutte le stringhe che stai concatenando sono letterali stringa verbatim , solo la prima parte della concatenazione è
In altre parole,
@"SELECT value1, '"
è l'unico verbale letterale nell'intera istruzione per creare la stringa finale.
Dovresti aggiungere @ davanti al resto delle tue stringhe per renderle tutte testuali.
Che lo farebbe apparire come:
String formLookupPull = @"SELECT value1, '"+tableName+ @"', '"+columnName+ @"' FROM lkpLookups WHERE ""table"" = '" + tableName + @"' and ""field"" = '" + columnName + @"';";
Altri suggerimenti
Per rispondere alla domanda sul titolo ...
Per evitare la citazione in una stringa letterale letterale, usa la sequenza quote-escape " "
(ovvero due caratteri virgolette)
string a = @"He said ""Hi!""..."; // He said "Hi!"...
Vedi MSDN per maggiori dettagli sulla fuga, ecc.
Nota che nel tuo codice pubblicato, l'unica stringa testuale è la prima (con @
prima di essa). Le stringhe successive non sono testuali, quindi la sequenza di escape corretta sarebbe \ "
.
Puoi renderlo più bello con string.Format
:
String formLookupPull =
string.Format(@"SELECT value1, '{0}', '{1}' FROM lkpLookups" +
@"WHERE ""table"" = '{0}' and ""field"" = '{1}';",
tableName, columnName)
Desideri utilizzare \ "
per sfuggire alle virgolette, non " "
.
In questo modo:
.. FROM lkpLookups WHERE \"table\" = '" ..
Modifica
Ulteriore spiegazione:
Hai solo un @
sulla prima di tutte le stringhe che stai concatenando. Nelle stringhe letterali (con un @
in primo piano) si evitano le virgolette con una doppia virgoletta. Nelle stringhe normali, è una barra.
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.";
Bene dopo la prima fine del preventivo, il simbolo @ non viene più utilizzato, quindi sei libero di usare il carattere di escape. Prova a mettere la tua "tabella" racchiuso tra '[' come [tabella] e [campo] o sfuggire a " personaggio con un \.
String formLookupPull = @"SELECT value1, '" + tableName + "', '" + columnName + "' FROM lkpLookups WHERE [table] = '" + tableName + "' and [field] = '" + columnName + "';";
Se non puoi utilizzare i parametri SQL, String.Format può essere poco più pulito e leggibile rispetto al puro " + concatenazione " ;.
string formLookupPull =
string.Format(@"SELECT value1, '{0}', '{1}'
FROM lkpLookups
WHERE ""table"" = '{0}' AND ""field"" = '{1}';",
tableName, columnName);
String formLookupPull = @"SELECT value1, '"+tableName+"', '"+columnName+"' FROM lkpLookups WHERE \"table\" = '" + tableName + "' and \"field\" = '" + columnName + "';";
Confido anche che stai sfuggendo correttamente a queste variabili prima di creare questa query :)
Perché stai citando i nomi letterali delle colonne, mi sembra superfluo.
" SELECT valore1, " + tableName + ", " + columnName + " DA lkpLookups DOVE tabella = '" + tableName + " ' e field = '" = columnName + " '; " ;;
Non testato ma penso che otterrai l'idea.