valor una resultados obtener ejemplos desde datos consultas consulta con buscar asignar c# .net sql concatenation stringbuilder

resultados - obtener valor de una consulta sql en c#



Crear sentencias SQL seguras como cadenas (5)

Crea tu objeto SqlCommand así:

SqlCommand cmd = new SqlCommand( "INSERT INTO Employees (id, name) VALUES (@id, @name)", conn); SqlParameter param = new SqlParameter(); param.ParameterName = "@id"; param.Value = employee.ID; cmd.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@name"; param.Value = employee.Name; cmd.Parameters.Add(param); cmd.ExecuteNonQuery();

Estoy usando C # y .NET 3.5. Necesito generar y almacenar algunas instrucciones de inserción de T-SQL que se ejecutarán más adelante en un servidor remoto.

Por ejemplo, tengo una matriz de empleados:

new Employee[] { new Employee { ID = 5, Name = "Frank Grimes" }, new Employee { ID = 6, Name = "Tim O''Reilly" } }

y necesito terminar con una serie de cadenas, como esta:

"INSERT INTO Employees (id, name) VALUES (5, ''Frank Grimes'')", "INSERT INTO Employees (id, name) VALUES (6, ''Tim O''''Reilly'')"

Estoy mirando un código que crea las instrucciones de inserción con String.Format, pero eso no se siente bien. Consideré usar SqlCommand (esperando hacer algo como esto ), pero no ofrece una manera de combinar el texto de comando con los parámetros.

¿Basta con reemplazar las comillas simples y construir una cadena?

string.Format("INSERT INTO Employees (id, name) VALUES ({0}, ''{1}'')", employee.ID, replaceQuotes(employee.Name) );

¿De qué debería preocuparme cuando hago esto? La fuente de datos es bastante segura, pero no quiero hacer demasiadas suposiciones.

EDITAR: Solo quiero señalar que en este caso, no tengo una SqlConnection ni ninguna forma de conectarme directamente a SQL Server. Esta aplicación en particular necesita generar sentencias SQL y ponerlas en cola para que se ejecuten en otro lugar; de lo contrario, estaría utilizando SqlCommand.Parameters.AddWithValue ()


Hmm. Estoy de acuerdo con todos los demás en que deberías usar consultas parametrizadas y lo dejo así. Pero, ¿cómo vas a pasar estas sentencias sql a tu servidor remoto? ¿Tiene algún tipo de servicio como un servicio web que aceptará y ejecutará comandos Sql arbitrarios o su aplicación cliente va a llegar directamente a la base de datos?

Si está pasando por algún tipo de proxy, no importa cuánto desinfecte sus datos en el cliente, un hacker podría omitir su aplicación y acceder al servicio. En ese caso, haga lo que recomienda Cade y pase los datos como XML, por ejemplo, o el formato que elija (JSON, Binario, etc.). Luego, cree su SQL justo antes de ejecutar el comando.


Para evitar la inyección, debe enviar los datos al servidor remoto (tal vez en XML) y luego al servidor remoto, los datos deben volverse a convertir a los tipos de datos apropiados y utilizarse en consultas parametrizadas o procesos almacenados.


Use comandos parametrizados. Pase también los parámetros a su servidor remoto y consígalo para llamar a SQL Server, manteniendo la distinción entre el SQL mismo y los valores de los parámetros.

Siempre y cuando nunca mezcles datos de tratamiento como código, deberías estar bien.


Corrija su función de reemplazo de citas de esta manera:

void string replaceQuotes(string value) { string tmp = value; tmp = tmp.Replace("''", "''''"); return tmp; }

¡Aclamaciones!