2011-02-10 21 views
9

Tengo un problema con una declaración preparada en C#:C# Las declaraciones preparadas - símbolo @ (en/signo strudel) busca

OdbcCommand cmd = sql.CreateCommand(); 
cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID = ?"; 
cmd.Parameters.Add("@USER_ID", OdbcType.VarChar, 250).Value = email; 

(por supuesto correo electrónico contiene una dirección válida de correo electrónico, con el símbolo @).

Este código devuelve un error aleatorio -

"La conexión ha sido desactivado" { "ERROR [01000] [Microsoft] [ODBC SQL Server Driver] [TCP/IP sockets] ConnectionWrite (send()). eRROR [08S01] [Microsoft] [ODBC SQL conductor Server] [TCP/IP sockets] general error en la red. Consulte la documentación de la red ".}

Howeve r si ejecuto mi código sin una declaración preparada, lo que significa:

cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID = '"+email+"'"; 

Todo funciona perfectamente.

¿Tal vez esté relacionado con el hecho de que tengo un signo @ en el valor parametrizado? Tiendo a pensar que no soy el primero tratando de crear una declaración preparada con una dirección de correo electrónico ...

¡No tengo idea de qué pasa! Otras declaraciones preparadas funcionan normalmente ...

¿Pueden ayudarnos? :) Gracias, Nili

+1

Hmm. Cuando hago declaraciones preparadas, utilizo parámetros con nombre. Algo en la medida de 'SELECT * FROM table WHERE id = @ id' y luego invoque' .Parameters.Add ("@ id", email); '- Intente eso, vea si funciona – Zack

Respuesta

7

De hecho, ODBC tiene su parte de problemas con el soporte de parámetros nombrados. Sin embargo, es posible cierto uso de parámetros con nombre.

Por ejemplo, en su caso, la sintaxis siguientes obras:?

OdbcCommand cmd = sql.CreateCommand(); 
cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID = ?"; 
cmd.Parameters.Add("USER_ID", OdbcType.VarChar, 250).Value = email; 

situación más difícil es cuando usted no tiene un partido único para el parámetro como USER_ID =; p.ej., cuando desee utilizar el operador IN en la cláusula WHERE.

A continuación, la siguiente sintaxis sería hacer el trabajo:

OdbcCommand cmd = sql.CreateCommand(); 
cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID IN (?, ?)"; 
cmd.Parameters.Add("?ID1", OdbcType.VarChar, 250).Value = email1; 
cmd.Parameters.Add("?ID2", OdbcType.VarChar, 250).Value = email2; 

Tenga en cuenta el uso de ? (signo de interrogación) en lugar de @ (en el signo) dentro del nombre del parámetro. Aunque tenga en cuenta que la sustitución de los valores de los parámetros en este caso no tiene nada que ver con sus nombres, sino solo con su orden con la colección de parámetros.

Espero que esto ayude :-)

+0

obteniendo un error de asignación de memoria – donstack

+0

@donstack ¿Después de ejecutar qué línea exactamente obtiene un error de asignación de memoria? ¿Qué tipo de error es, una excepción? – Lev

+0

Gracias. Venir de Java a C# e intentar entender las declaraciones preparadas fue sorprendentemente difícil. Esto explica perfectamente un enfoque similar a Java, en el ejemplo inferior. Uf... – KjetilNordin

2

Use '@USER_ID' en lugar de '?' y todo debería funcionar:

OdbcCommand cmd = sql.CreateCommand(); 
cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID = @USER_ID"; 
cmd.Parameters.Add("@USER_ID", OdbcType.VarChar, 250).Value = email; 
+0

La sintaxis del signo de interrogación funciona en todos los demás lugares Además, traté de usar la sintaxis que sugirió y obtuve un nuevo error: "ERROR [42000] [Microsoft] [Controlador ODBC SQL Server] [SQL Server] Debe declarar la variable escalar" @USER_ID "." – Nili

3

¿Hay alguna razón específica que está utilizando OdbcCommand en lugar de utilizar el proveedor SqlClient?

Con el proveedor SqlClient, debe utilizar parámetros con nombre como otros han sugerido.

Pero according to MSDN:

El proveedor de datos de .NET Framework para OLE DB y proveedor de datos de .NET Framework para ODBC no son compatibles con los parámetros con nombre para pasar parámetros a una instrucción SQL o un procedimiento almacenado. En este caso, debe usar el marcador de posición de interrogación (?), Como en el siguiente ejemplo.

Así que no estoy seguro de que los parámetros con nombre funcionen en este caso.

+0

La sintaxis del signo de interrogación funciona en todos los demás lugares. Además, traté de usar la sintaxis que sugirió y obtuve un nuevo error: "ERROR [42000] [Microsoft] [Controlador ODBC SQL Server] [SQL Server] Debe declarar la variable escalar" @USER_ID "." – Nili

Cuestiones relacionadas