2011-05-02 24 views
6

que tienen una consulta SQL de esta formauso de variables en las consultas SQL en asp.net (C#)

string cmdText = "Select * from " + searchTable 
    + "WHERE " + searchTable 
    + "Name =' " + searchValue + "'"; 

Básicamente lo que estoy tratando de hacer es obtener la información de un actor en particular de la mesa de Actores de la base de datos. La variable searchTable tiene el valor 'Actor' que es el nombre de la tabla y searchValue tiene el nombre del actor (que está representado por el atributo ActorName en la tabla del Actor, aquí intento formar el nombre del atributo concatenando las palabras 'Actor' 'y 'Nombre')

así que, bueno, todo esto concatenación resultado en (o al menos debería dar lugar a) una consulta de la forma:

Select * from Actor where ActorName ='some actor'; 

Pero cuando trato de ejecutar este me da el error "Sintaxis incorrecta cerca de '='" en el navegador. ¿Alguien podría ayudar?

Respuesta

5

No debe concatenar cadena a SQL, ya que esto abrirá hasta SQL Injection attacks.

This es una lectura bastante larga sobre SQL dinámico, pero vale la pena leer para comprender los riesgos y las opciones.

En su lugar, debe usar parameterized queries, aunque la única forma de utilizar un nombre de tabla como parámetro es usar SQL dinámico.

Te pido que cambies tu enfoque con respecto a los nombres de tabla, esto generará problemas en el futuro, no es mantenible y como mencioné anteriormente, podría abrirlo a la inyección SQL.


El error que está viendo es el resultado de la concatenación que está haciendo con la cláusula "Donde" - se echa en falta un espacio antes de ella. También está agregando un espacio después del ' en el parámetro que termina con "Nombre".

Su cadena resultante, utilizando el ejemplo podría ser:

Select * from ActorWHERE ActorName =' some actor'; 
+0

Gracias por la respuesta, definitivamente voy a leer sobre eso! – QPTR

+0

¡Gracias por los enlaces! Trataré de usarlos. – QPTR

8

Se puede retener (y debe!) Parámetros en las consultas SQL para los valores de p su cláusula WHERE - pero usted no puede parametrizar cosas como su nombre de tabla.

Así que me gustaría volver a escribir esa consulta a ser:

SELECT (list of columns) 
FROM dbo.Actor 
WHERE ActorName = @ActorName 

y luego pasar en tan sólo el valor de @ActorName.

Si tiene que hacer lo mismo para los directores, que tendría que tener una segunda consulta

SELECT (list of columns) 
FROM dbo.Directors 
WHERE DirectorName = @DirectorName 

El uso de parámetros como esto

  • mejora la seguridad (prohíbe los ataques de inyección SQL!)
  • mejora el rendimiento: el plan de consulta para esa consulta puede almacenar en caché y volver a utilizar para el segundo, tercero corre

PD: el problema original en su configuración es la siguiente: usted no tiene ningún espacio entre la primera aparición de su nombre de la tabla y la cláusula WHERE - por lo tanto que se obtendría:

SELECT * FROM ActorWHERE ActorName ='.....' 

Si realmente insiste en concatenar juntos la instrucción SQL (! me NO recomiendo), entonces usted necesita para poner un espacio entre el nombre de su tabla y su WHERE!

Actualizar: algunos recursos para aprender acerca de las consultas parametrizadas en ADO.NET:

+0

Gracias por la respuesta detallada, soy muy nuevo en asp.net y C# y nuestro instructor acaba de hacer una concatenación con nosotros. Dicho esto, me gustaría saber más acerca de las consultas parametrizadas, lo busqué en Google pero no pude encontrar ninguna introducción satisfactoria, algo con ejemplos de código, ¿hay algún enlace al que me puedan dirigir? De todos modos, muchas gracias por tu ayuda! – QPTR

+0

@QPTR: agregó algunos enlaces de recursos –

+0

¡Gracias por los enlaces! – QPTR

1

Hay una falta en blanco y uno demasiado:

searchTable + "Name =' " 

debería leer

searchTable + " Name ='" 

Además de eso, utilice los parámetros de SQL para evitar la inyección de SQL.

+0

Gracias por la respuesta, no me di cuenta de los espacios, funciona ahora. – QPTR

-1
string cmdText = "Select * from " + searchTable + " WHERE Name = '" + searchValue + "'"; 
+0

Gracias por la respuesta, ¡funciona ahora! – QPTR

Cuestiones relacionadas