2009-03-17 16 views
15

Tengo el código de abajo (he incluido lo que creo son todas las secciones pertinentes):consulta parametrizada para MySQL con C#

private String readCommand = "SELECT LEVEL FROM USERS WHERE VAL_1 = ? AND [email protected] = ?;"; 
public bool read(string id) 
{ 
    level = -1; 
    MySqlCommand m = new MySqlCommand(readCommand); 
    m.Parameters.Add(new MySqlParameter("", val1)); 
    m.Parameters.Add(new MySqlParameter("", val2)); 
    MySqlDataReader r = m.ExecuteReader(); 
    if (r.HasRows) 
     level = Convert.ToInt32(r.GetValue(0).ToString()); 
    r.Close(); 
    return true; 
} 

Cuando ejecuto esto, me sale un IndexOutOfBoundsException en la adición del primer parámetro. ¿Qué he hecho mal?

Respuesta

28

probar este lugar:

private String readCommand = "SELECT LEVEL FROM USERS WHERE VAL_1 = @param_val_1 AND VAL_2 = @param_val_2;"; 
public bool read(string id) 
{ 
    level = -1; 
    MySqlCommand m = new MySqlCommand(readCommand); 
    m.Parameters.AddWithValue("@param_val_1", val1); 
    m.Parameters.AddWithValue("@param_val_2", val2); 
    level = Convert.ToInt32(m.ExecuteScalar()); 
    return true; 
} 
+0

gracias, yo supongo que tengo que nombrar mis parámetros. Oh bien. Podría haber sido peor, supongo. – Elie

+0

Ah, y @ funcionó bien. – Elie

+1

Gracias por informarme, es bueno saber que funcionó – Chris

3

Es necesario utilizar parámetros con nombre en la consulta. Ej .:

String readCommand = "SELECT LEVEL FROM USERS WHERE VAL_1 = ?param1 AND VAL_2 = ?param2"; 

A continuación, pasar los nombres de los parámetros cuando se ejemplariza sus objetos MySqlParameter así:

m.Parameters.Add(new MySqlParameter("param1", val1)); 
+0

¿Los parametros de mysql comienzan con '?' , a diferencia de '@' como en el servidor sql? Pensé que serían lo mismo. ¡Interesante! – Chris

+0

Comentario del usuario en http://dev.mysql.com/doc/refman/5.0/en/connector-net-examples-mysqlcommand.html dice eso. –

+0

@ funciona bien también. – Elie

1

No creo que las clases MySql.Data apoyan parámetros sin nombre. Si está interesado en usarlos, puede acceder a su base de datos MySql a través de los controladores Odbc, ellos lo respaldan.

Tendrá que nombrar los parámetros en su consulta: "?"

"SELECT LEVEL FROM USERS WHERE VAL_1 = @val1 AND VAL_2 = @val2;" 

he elegido el indicador parámetro "@", pero las versiones recientes de apoyo MySql.Data tanto "@" y .

A continuación, actualice su constructor de param para pasar el nombre de param correcto (no es necesario que incluya el indicador de parámetro aquí, aunque no hace ninguna diferencia si lo hace).

m.Parameters.Add(new MySqlParameter("val1", val1)); 

PS. Probablemente ya lo sepa, o simplemente se omitió en el fragmento, pero creo que olvidó llamar a Read en su instancia de ExecuteReader.

+0

De hecho, olvidé mi código y lo encontré tan pronto como la ruta de ejecución llegó allí.Estoy refabricando un montón de consultas antiguas, y parte del código se está moviendo, que es propenso a errores en sí mismo. ¡Gracias por la ayuda! – Elie

6
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) 
{ 
    MySqlConnection con = new MySqlConnection("server=localhost;User Id=root;database=result;password=1234"); 
    con.Open(); 

    MySqlCommand cmd = new MySqlCommand("Select * from users where username=?username and password=?password", con); 
    cmd.Parameters.Add(new MySqlParameter("username", this.Login1.UserName)); 
    cmd.Parameters.Add(new MySqlParameter("password", this.Login1.Password)); 

    MySqlDataReader dr = cmd.ExecuteReader(); 
    if (dr.HasRows ==true) 
    { 
     e.Authenticated = true; 
    } 
} 
2
m.Parameters.AddWithValue("parameter",value) 

será mejor opción para consulta parametrizada.

0

Si desea ejecutar el código SQL en muchas ocasiones, se debe usar la siguiente manera:

conn.Open(); 
cmd.Connection = conn; 

cmd.CommandText = "INSERT INTO myTable VALUES(NULL, @number, @text)"; 
cmd.Prepare(); 

cmd.Parameters.AddWithValue("@number", 1); 
cmd.Parameters.AddWithValue("@text", "One"); 

for (int i=1; i <= 1000; i++) 
{ 
    cmd.Parameters["@number"].Value = i; 
    cmd.Parameters["@text"].Value = "A string value"; 

    cmd.ExecuteNonQuery(); 
} 

La primera vez es sin "ExecuteNonQuery" simplemente añadiendo los parámetros con los valores falsos, a continuación, dentro del bucle se agrega el valores reales

ver este enlace: https://dev.mysql.com/doc/connector-net/en/connector-net-programming-prepared-preparing.html

Cuestiones relacionadas