2008-12-17 19 views
7

Tengo problemas para encontrar la sintaxis adecuada para permitir que una cadena o un NULL pasen a la base de datos. Aquí está mi código:Problema al insertar cadena o NULL en la base de datos de SQL Server

string insertString = String.Format(
    @"INSERT INTO upload_history (field1, field2, field3) 
    VALUES ('{0}', '{1}', '{2}')", 
    varField1, varField2, varField3); 

he usado comillas simples alrededor de los marcadores de posición variable de modo que la base de datos correctamente aceptaría un valor de cadena. Sin embargo, si se pasa NULL, termina yendo a la base de datos como la cadena "NULL".

¿Hay alguna manera de dejar las comillas simples de la cadena InsertCommand y agregar de forma condicional comillas simples a mis variables?

Respuesta

22

No concatenar la cadena (string.Format) - parámetros de uso (@p1 etc) - entonces puede pasar a significar DBNull.Value nula a SQL Server

SqlCommand cmd = new SqlCommand(); 
cmd.CommandText = @"INSERT INTO upload_history (field1, field2, field3) 
    VALUES (@p1, @p2, @p3)"; 
cmd.Parameters.AddWithValue("@p1", (object)someVar ?? DBNull.Value); 
//... 

Esto también le protege de inyección SQL

+0

me sale el siguiente error al utilizar "somevar ?? DBNull.Value" como la de arriba: "operador" ?? no se puede aplicar a operandos para tipo string y System.DBNull "¿Alguna idea sobre cómo funcionaría esto con una cadena? – buzzzzjay

+2

@buzzzzjay agregue un '(objeto)' delante de cualquiera de ellos. –

+0

¡Dulce! ¡Eso realmente ayuda! ¡Gracias! – buzzzzjay

5

Concentar la cadena con String.Format puede ser un gran riesgo de seguridad (inyección de SQL) y también problemático si desea insertar el 'carácter'.

Solución:

cmd.CommandText = "INSERT INTO upload_history (field1, field2, field3) " + 
    "VALUES (@p1, @p2, @p3)"; 
cmd.Parameters.AddWithValue("@p1", varField1); 
cmd.Parameters.AddWithValue("@p2", varField2); 
cmd.Parameters.AddWithValue("@p3", varField3); 
cmd.ExecuteNonQuery(); 
+0

También una gran respuesta, pero Marc te ganó. Gracias por la sugerencia. – beardog

2

En el espíritu de responder a la pregunta, ya que se le pidió, y siendo plenamente consciente de que la refactorización del código para paramaterizing las consultas es la solución correcta, se podría escribir una función que devuelve cualquiera una cadena de una sola comilla o un valor de cadena NULL no citado, luego eliminar las comillas simples de la cadena de consulta.

string insertString = String.Format( @"INSERT INTO upload_history (field1, field2, field3)  VALUES ({0}, {1}, {2})", ToStringorNull(varField1), ToStringorNull(varField2), ToStringorNull(varField3)); 

Si está utilizando VS 2008, puede implementarlo como método de extensión.

string insertString = String.Format( @"INSERT INTO upload_history (field1, field2, field3)  VALUES ({0}, {1}, {2})", varField1.ToStringorNull, varField2.ToStringorNull, varField3.ToStringorNull); 

voy a dejar la creación de la función ToStringorNull a usted - no es difícil :-)

Cuestiones relacionadas