c#
  • string
  • escaping
  • verbatim-string
  • 2009-03-16 11 views 7 likes 
    7

    ho la seguente stringa, che non si compila:Escaping stringhe letterali

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

    Le sezioni incriminate sono:

    ""table"" = 
    

    e

    ""field"" = 
    

    Il compilatore è sempre tutto mescolato sulla sequenza di escape. Qualcuno può vedere cosa c'è che non va?

    +0

    grazie per le risposte veloci! –

    +1

    Si potrebbe prendere in considerazione l'ipotesi di puntare su questo intero problema usando LINQtoSQL invece di mettere insieme la propria stringa di query. –

    risposta

    6

    Il problema è che non tutte le stringhe che si sta concatenando sono verbatim letterali stringa, solo la prima porzione della concatenazione è.

    In altre parole,

    @"SELECT value1, '" 
    

    è l'unico testualmente letterale in tutta la dichiarazione di costruire la stringa finale.

    Dovresti aggiungere @ davanti al resto delle stringhe per renderle tutte testuali.

    che renderebbe sembrare:

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

    Si desidera utilizzare \" per evitare le citazioni, non "".

    Ti piace questa:

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

    Edit:

    Ulteriori spiegazioni:

    Basta un @ il primo di tutte le stringhe che stai concatenare. Nelle stringhe letterali (con un @ davanti) si evitano le virgolette con una virgoletta doppia. Nelle stringhe normali, è una virgola.

    Es.

    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

    I letterali delle stringhe verbali non usano \ come carattere di escape, l'unica sequenza di escape è "", che è ciò che viene utilizzato. Il problema è che l'identificatore di stringa verbatim, @, viene applicato solo alla prima stringa, non a quelli che vengono aggiunti con +. – Whatsit

    +0

    Il problema è che sta usando la sequenza di escape errata per il suo tipo di stringa. Può o cambiare la stringa in letterale (come dici tu), o cambiare la sequenza di escape (come ho detto) – Blorgbeard

    +0

    D'accordo, ma la tua risposta originale implicava che "" non era corretto in senso generale, quindi era probabile che confondesse qualcuno che non ha molta familiarità con i letterali stringa letterali. La tua risposta rivista è molto più chiara. – Whatsit

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

    Ho anche fiducia che si sta fuggendo queste variabili in modo corretto prima di costruire questa query :)

    +0

    lol si spera di sì, mi è stata data una DLL con tutte le funzioni per eseguire DB IO all'interno di esso ... Sono abbastanza sicuro che fa l'escape SQL corretto, ma non ho davvero guardato da vicino ... –

    4

    Bene dopo il primo fine della citazione, il simbolo @ non è più in uso in ogni modo in modo che siano libero di usare il personaggio di fuga. Prova a mettere il tuo "tavolo" avvolto in '[' come [tabella] e [campo] o sfuggire al "personaggio con un \.

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

    Per rispondere alla sua domanda di titolo ...

    Per sfuggire alla citazione in una stringa verbatim letterale utilizzare la citazione-escape-sequenza "" (che è due caratteri di virgolette)

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

    Vedere MSDN per maggiori dettagli sulla fuga, ecc

    Nota che nel tuo codice postato, l'unica stringa letterale è la prima (con il @ prima). Le stringhe successive non sono testuali, quindi la sequenza di escape corretta sarebbe \".

    È possibile farlo sembrare più bella con string.Format:

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

    Se non è possibile utilizzare SQL Parametri, String.Format può essere poco più pulito e leggibile di pura "+ concatenazione".

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

    È raro che non è possibile utilizzare DbParameter in un DbCommand. – ProfK

    +0

    Questo potrebbe essere uno di questi casi ... Sto usando una libreria che non espone alcuna di quelle cose a me e sto cercando di aderire il più possibile perché viene fornito con alcuni effetti collaterali che io Dovrebbe riprodursi altrimenti ... –

    +0

    +1. 'String.Format' è molto meglio per questo. –

    1

    Perché stai citando i nomi letterali delle colonne, sembrano inutili per me.

    "SELECT value1," + tableName + "," + columnName + "FROM lkpLookups WHERE table = '" + tableName + "' e field = '" = columnName + "';";

    Non testato ma penso che otterrete l'idea.

     Problemi correlati

    • Nessun problema correlato^_^