使用C#进行MySQL的参数化查询

我有下面的代码(我已经包含了我认为的所有相关部分):

private String readCommand = "SELECT LEVEL FROM USERS WHERE VAL_1 = ? AND VAL_@ = ?;"; 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; } 

当我运行它时,我在添加第一个参数时得到IndexOutOfBoundsException。 我做错了什么?

试试这个:

 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; } 
 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; } } 

您需要在查询中使用命名参数。 例如:

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

然后,在实例化MySqlParameter对象时传递参数名称,如下所示:

 m.Parameters.Add(new MySqlParameter("param1", val1)); 
 m.Parameters.AddWithValue("parameter",value) 

将是参数化查询的更好选择。

我不认为MySql.Data类支持未命名的参数。 如果您热衷于使用它们,可以通过Odbc驱动程序访问MySql数据库,它们支持此function。

您需要在查询中命名参数:

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

我选择了param指示符“@”,但最新版本的MySql.Data支持“@”和“?”。

然后更新你的param构造函数以传递正确的param名称(你不需要在这里包含param指示符,尽管如果你这样做,它没有任何区别)。

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

PS。 你已经知道这个,或者它只是在代码片段中被省略了,但我想你忘了在你的ExecuteReader实例上调用Read。

如果你想多次执行sql,那么你应该使用这种方式:

 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(); } 

第一次没有“ExecuteNonQuery”只是添加伪造值的参数,然后在循环内添加实际值。

请看以下链接: https : //dev.mysql.com/doc/connector-net/en/connector-net-programming-prepared-preparing.html