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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top