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

时间:2009-03-17 03:56:17

标签: 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。我做错了什么?

6 个答案:

答案 0 :(得分:37)

请改为尝试:

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

答案 1 :(得分: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 :(得分:3)

您需要在查询中使用命名参数。 E.g:

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

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

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

答案 3 :(得分:2)

m.Parameters.AddWithValue("parameter",value) 

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

答案 4 :(得分:1)

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

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

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

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

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

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

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

答案 5 :(得分:1)

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

string

第一次没有" ExecuteNonQuery"只需使用伪值添加参数,然后在循环内添加实际值。

查看此链接: https://dev.mysql.com/doc/connector-net/en/connector-net-programming-prepared-preparing.html