使用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
- 从任务并行库更新ProgressBar UI对象
- 如何在C#中使用WebBrowser控件清除浏览历史记录
- 不同FW的协方差导致代码中断?
- 使用Async和Await的ASP.NET C#5异步Web应用程序
- 为什么在VS2010中添加服务引用时,是否生成了客户端类?
- 这两个HttpContext.Current.Session和Session – asp.net 4.0有什么区别
- 从Silverlight中的不同ResourceDictionary引用ResourceDictionary中的资源
- 如果有引号,则从部署对话框(而不是PowerShell)进行MS部署不起作用
- 如何使用Ninject Conventions Extension进行绑定?