Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Mysql中使用C#中的Prepared语句_C#_Mysql_Prepared Statement - Fatal编程技术网

在Mysql中使用C#中的Prepared语句

在Mysql中使用C#中的Prepared语句,c#,mysql,prepared-statement,C#,Mysql,Prepared Statement,我试着在程序中编写语句,但不起作用 评论的部分是准备好的声明部分。当我把它变成正常的陈述,一切都是正确的 有人能告诉我我错过了什么吗 非常感谢 private void btnLogin_Click(object sender, EventArgs e) { MySqlCommand cmd = MySqlConn.cmd; //cmd = new MySqlCommand("SELECT * FROM admin WHERE admin_username='@val1' AND

我试着在程序中编写语句,但不起作用

评论的部分是准备好的声明部分。当我把它变成正常的陈述,一切都是正确的

有人能告诉我我错过了什么吗

非常感谢

private void btnLogin_Click(object sender, EventArgs e)
{
    MySqlCommand cmd = MySqlConn.cmd;
    //cmd = new MySqlCommand("SELECT * FROM admin WHERE admin_username='@val1' AND admin_password=PASSWORD('@val2')", MySqlConn.conn);
    //cmd.Prepare();
    //cmd.Parameters.AddWithValue("@val1", tboxUserName.Text);
    //cmd.Parameters.AddWithValue("@val2", tboxPassword.Text);
    cmd = new MySqlCommand("SELECT * FROM admin WHERE admin_username='"+tboxUserName.Text+"' AND admin_password=PASSWORD('"+tboxPassword.Text+"')", MySqlConn.conn);

    MySqlDataReader res = cmd.ExecuteReader();
    if (!res.HasRows) { MessageBox.Show("Error! "); res.Close(); return; }
    else
    {
        //do something
    }
    res.Close();
}

尝试从查询中删除
,并在添加参数后使用
Prepare

cmd = new MySqlCommand("SELECT * FROM admin WHERE admin_username=@val1 AND admin_password=PASSWORD(@val2)", MySqlConn.conn);
cmd.Parameters.AddWithValue("@val1", tboxUserName.Text);
cmd.Parameters.AddWithValue("@val2", tboxPassword.Text);
cmd.Prepare();

您的解决方案几乎是正确的。然而,由于这是一个登录过程,因此是一个面向安全性的任务,因此我还想提出一些建议

首先,考虑让您的按钮事件处理程序出现如下:

private void btnLogin_Click(object sender, EventArgs e)
{
    if (Login(tboxUserName.Text, tboxPassword.Text))
    {
        // Log in was successful, do something...
    }
    else
    {
        // Log in was NOT successful, inform the user...
    }
}
这将使应用程序的维护和可读性更容易。然后声明一个名为
Login()
的函数来执行重载:

private bool Login(string username, string password)
{
    try
    {
        MySqlCommand cmd = MySqlConn.cmd;
        cmd = new MySqlCommand(
            "SELECT count(*) FROM admin " + 
            "WHERE admin_username=@username " + 
            "AND admin_password=PASSWORD(@passwd)",
            MySqlConn.conn);
        cmd.Prepare();
        cmd.Parameters.AddWithValue("@username", username);
        cmd.Parameters.AddWithValue("@passwd", password);
        int result = (int)cmd.ExecuteReader();

        // Returns true when username and password match:
        return (result > 0);
    }
    catch (Exception e)
    {
        // Optional: log exception details

        // Deny log in if an error has occurred:
        return false;
    }
}

在这里你会注意到一些事情。首先,从原始查询字符串中删除了引号,这些引号使命名参数无法正常工作。此外,查询将返回
count()
函数结果,而不是尝试创建包含管理员用户名和密码的结果集。最后,该方法被封装在一个try-catch块中,以便在发生错误时,该方法返回
false
,并且拒绝登录。为了便于阅读,我还将查询分解为一个串联字符串

什么不起作用?是否显示错误?