2011-06-16 27 views
5

En relación con este question acerca de cómo escribir consultas SQL de largo plazo de C#, la solución sugerida que una consulta SQL tiempo debe ser escrito como:Sustitución dentro de literales literales literales? .

string query = @" 
    SELECT 
     c.CUSTOMER_ID, 
     COALESCE (c.FIRST_NAME, ''_ + ' ' + COALESCE (c.LAST_NAME, '') AS FULL_NAME 
     ct.NAME as CUSTOMER_TYPE 
    FROM 
     CT_CUSTOMER_TYPE AS ct INNER JOIN CUSTOMER AS c 
      ON ct.CUSTOMER_TYPE_ID = c.CUSTOMER_TYPE_ID 
    "; 

Eso me hace curioso sobre otra cuestión relacionada. ¿Puedo usar la sustitución de alguna manera? Es decir, ¿cómo me las arreglaría si dijera que el nombre de la tabla cambia pero la consulta sigue siendo la misma? ¿Tengo que volver a utilizar el otro enfoque de construir una cadena utilizando concatenaciones de cadenas o hay una manera más elegante?

Respuesta

19

¿Por qué no utilizar string.Format? En el ejemplo específico que diste, usted podría hacer algo como

string query = @" 
SELECT 
    c.CUSTOMER_ID, 
    COALESCE (c.FIRST_NAME, ''_ + ' ' + COALESCE (c.LAST_NAME, '') AS FULL_NAME 
    ct.NAME as CUSTOMER_TYPE 
FROM 
    {0} AS ct INNER JOIN {1} AS c 
     ON ct.CUSTOMER_TYPE_ID = c.CUSTOMER_TYPE_ID 
"; 

Y la invocación por

string real_query = string.Format(query, tblName1, tblName2); 
+0

Esa es una excelente respuesta e idea. –

4

Sí, puede utilizar el método String.Format.

string custtype = "CT_CUSTOMER_TYPE"; 
string cust = "CUSTOMER"; 
string query = @" 
SELECT 
    c.CUSTOMER_ID, 
    COALESCE (c.FIRST_NAME, ''_ + ' ' + COALESCE (c.LAST_NAME, '') AS FULL_NAME 
    ct.NAME as CUSTOMER_TYPE 
FROM 
    {0} AS ct INNER JOIN {1} AS c 
     ON ct.CUSTOMER_TYPE_ID = c.CUSTOMER_TYPE_ID 
"; 

string endQuery = String.Format(query, custtype, cust); 

El método String.Format sustituirá a los parámetros identificados por {x} secuencialmente con los argumentos siguientes la cadena, por lo que {0} será reemplazado con el valor de custtype, y {1} con el valor de cust.

1

Puede considerar el uso de LINQ to SQL, si no lo ha hecho aún.

Respondiendo a la pregunta real, podría usar string.Format como los otros han mencionado si está creando la consulta. Si desea modificar una cadena existente, intente usar string.Replace o Regex.Replace como se describe en here. Es decir:

string query = @" 
    SELECT 
     c.CUSTOMER_ID, 
     COALESCE (c.FIRST_NAME, ''_ + ' ' + COALESCE (c.LAST_NAME, '') AS FULL_NAME 
     ct.NAME as CUSTOMER_TYPE 
    FROM 
     CT_CUSTOMER_TYPE AS ct INNER JOIN CUSTOMER AS c 
      ON ct.CUSTOMER_TYPE_ID = c.CUSTOMER_TYPE_ID 
    "; 
query.Replace("CT_CUSTOMER_TYPE", "NEW_TABLE_NAME");