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

    tengo la siguiente cadena que no se compilará:Escapar literales de cadena literales

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

    Las secciones son ofensivos:

    ""table"" = 
    

    y

    ""field"" = 
    

    El compilador está recibiendo todo mezclado en la secuencia de escape. ¿Alguien puede ver lo que está mal?

    +0

    gracias por las respuestas rápidas! –

    +1

    Puede considerar hacer una pausa en todo este problema utilizando LINQtoSQL en lugar de unir su propia cadena de consulta. –

    Respuesta

    6

    El problema es que no todas las cadenas está concatenando son literales literales de cadena, sólo la primera porción de la concatenación es.

    En otras palabras,

    @"SELECT value1, '" 
    

    es la única pie de la letra literal en toda la declaración de construir la cadena final.

    Debería agregar @ al frente del resto de sus cadenas para que todas sean textuales.

    lo que haría que se vea como:

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

    Quiere utilizar \" para escapar de las cotizaciones, no "".

    De esta manera:

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

    Editar:

    una explicación más detallada:

    Sólo tiene un @ en la primera de todas las cadenas que estés concatenación. En cadenas literales (con un @ al frente) se salvan las comillas con una comilla doble. En cadenas normales, es slash-quote.

    Por ejemplo.

    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

    Los literales literales verbatim no usan \ como un carácter de escape, la única secuencia de escape es "", que es lo que se está utilizando. El problema es que el identificador de cadena literal, @, solo se está aplicando a la primera cadena, no a las que se añaden con +. – Whatsit

    +0

    El problema es que está usando la secuencia de escape incorrecta para su tipo de cadena. Él puede cambiar la cadena a literal (como dices), o cambiar la secuencia de escape (como dije) – Blorgbeard

    +0

    De acuerdo, pero tu respuesta original implicaba que "" era incorrecta en el sentido general, por lo que era probable que confundiera a alguien que no está muy familiarizado con literales literales literales. Su respuesta revisada es mucho más clara. – Whatsit

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

    también confío en que usted se está escapando correctamente estas variables antes de construir esta consulta :)

    +0

    jajaja sí esperamos, me dieron una DLL con todas las funciones para realizar DB IO dentro de ella ... Estoy bastante seguro de que escapa correctamente de SQL pero realmente no me fijé muy de cerca ... –

    4

    bien después de su primer fin de la cita, el símbolo @ ya no está siendo utilizado de todos modos por lo que son libre de usar el personaje de escape. Trate de poner su "mesa" envuelto en '[' como [Tabla] y [campo] o escapar de la "personaje con una \.

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

    Para hacer frente a la pregunta del título ...

    Para escapar de la cotización en una cadena literal, palabra por palabra, utilice la cita de escape de la secuencia "" (que es dos comillas)

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

    Ver MSDN para más detalles en escapar, etc.

    Tenga en cuenta que en el código publicado, la única cadena literal es la primera (con el @ anterior). Las siguientes cadenas no son textuales, por lo que la secuencia de escape correcta sería \".

    Puede hacer que se vea más bonita con string.Format:

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

    Si no puede utilizar los parámetros de SQL, String.Format puede ser poco más limpio y fácil de leer que pura "+ concatenación".

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

    Rara vez no puede usar DbParameter en un DbCommand. – ProfK

    +0

    Este puede ser uno de esos casos ... Estoy usando una biblioteca que no me expone nada de eso y estoy tratando de mantenerlo lo más posible porque tiene algunos efectos secundarios que Tendría que reproducir lo contrario ... –

    +0

    +1. 'String.Format' es mucho mejor para esto. –

    1

    ¿Por qué estás citando los nombres literales de las columnas, parece innecesaria para mí.

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

    No probado, pero creo que ya entenderás.

    Cuestiones relacionadas