Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
C#Mysql datareader-如何使用datareader获取其他Column_C#_Mysql_Winforms_Datareader - Fatal编程技术网

C#Mysql datareader-如何使用datareader获取其他Column

C#Mysql datareader-如何使用datareader获取其他Column,c#,mysql,winforms,datareader,C#,Mysql,Winforms,Datareader,我正在尝试验证我的数据库中的密码,该数据库已经过哈希和盐处理。我在用户表username、hash和salt中创建了一列。现在我想知道我是否可以使用datareader访问其他列的值 我试过这个方法,但我得到了一条红线。这也是我失败的尝试 public static bool VerifyPassword(string enteredPassword, string storedHash, string storedSalt) { var saltBytes = Convert

我正在尝试验证我的数据库中的密码,该数据库已经过哈希和盐处理。我在用户表username、hash和salt中创建了一列。现在我想知道我是否可以使用datareader访问其他列的值

我试过这个方法,但我得到了一条红线。这也是我失败的尝试

    public static bool VerifyPassword(string enteredPassword, string storedHash, string storedSalt)
{

    var saltBytes = Convert.FromBase64String(storedSalt);
    var rfc2898DeriveBytes = new Rfc2898DeriveBytes(enteredPassword, saltBytes, 10000);
    return Convert.ToBase64String(rfc2898DeriveBytes.GetBytes(256)) == storedHash;

}


private void bunifuFlatButton1_Click(object sender, EventArgs e)
{

    string userhash;
    string usersalt;

    MySqlConnection mysqlCon = new MySqlConnection(connectionString);
    MySqlCommand cmd = new MySqlCommand("SELECT * FROM login.info WHERE username = @user", mysqlCon);
    MySqlDataReader rd;
    rd = cmd.ExecuteReader();
    cmd.Parameters.Add("@user", MySqlDbType.VarChar).Value = username.Text;
    mysqlCon.Open();

    while (rd.Read())
    {

        userhash = rd.GetString("hash");
        usersalt = rd.GetString("salt");

        bool isPasswordMatched = VerifyPassword(textpass.Text, userhash.Hash, usersalt.Salt);
// i got redline error in here. i only follow instruction.. link below
        if (isPasswordMatched)
        {
            //Login Successfull
        }
        else
        {
            //Login Failed
        }
    }
}

顺便说一句,我只是按照这个线程的指示

这里是另一种编写代码的方法,不是真正的答案,但…不是完美的头脑,但至少它会处理对象,并按正确的顺序调用它们。请阅读IDisposable和Sql注入

private void bunifuFlatButton1_Click(object sender, EventArgs e)
{
    using (MySqlConnection mysqlCon = new MySqlConnection(connectionString))
    {
                               // Use a named list of fields please. And cleanse the text.
        using (MySqlCommand cmd = new MySqlCommand("SELECT * FROM login.info WHERE username = @user", mysqlCon))
        {
            cmd.Parameters.Add("@user", MySqlDbType.VarChar).Value = username.Text; // Let's hope user name is not Jimmy DropTables!!
            mysqlCon.Open();

            using (MySqlDataReader rd = cmd.ExecuteReader())
            {
                while (rd.Read())
                {
                    string userhash = rd.GetString("hash");
                    string usersalt = rd.GetString("salt");

                    bool isPasswordMatched = VerifyPassword(textpass.Text, userhash, usersalt);
                    // Note that we are passing in strings, not props of an unknown object
                    if (isPasswordMatched)
                    {
                        //Login Successfull
                    }
                    else
                    {
                        //Login Failed
                    }
                }
            }

            mysqlCon.Close();
        }
    }
}

这是另一种编写代码的方法,不是真正的答案,但…不是完美的想法,但至少它会处理对象并按正确的顺序调用它们。请阅读IDisposable和Sql注入

private void bunifuFlatButton1_Click(object sender, EventArgs e)
{
    using (MySqlConnection mysqlCon = new MySqlConnection(connectionString))
    {
                               // Use a named list of fields please. And cleanse the text.
        using (MySqlCommand cmd = new MySqlCommand("SELECT * FROM login.info WHERE username = @user", mysqlCon))
        {
            cmd.Parameters.Add("@user", MySqlDbType.VarChar).Value = username.Text; // Let's hope user name is not Jimmy DropTables!!
            mysqlCon.Open();

            using (MySqlDataReader rd = cmd.ExecuteReader())
            {
                while (rd.Read())
                {
                    string userhash = rd.GetString("hash");
                    string usersalt = rd.GetString("salt");

                    bool isPasswordMatched = VerifyPassword(textpass.Text, userhash, usersalt);
                    // Note that we are passing in strings, not props of an unknown object
                    if (isPasswordMatched)
                    {
                        //Login Successfull
                    }
                    else
                    {
                        //Login Failed
                    }
                }
            }

            mysqlCon.Close();
        }
    }
}

哪一行是“红色的”?与GetSign hash和saltOh类似,顺便说一句,在添加参数并打开连接之前,您正在执行读取器。这是因为您正在传递对象的属性。把你收到的字符串传过来就行了<代码>验证密码(textpass.Text、userhash、usersalt)@bradbury9 OP没有发布实际的编译错误,但它与在同一类中声明的公共静态方法没有任何关系。但是,试图调用
字符串上不存在的
哈希
Salt
属性是一个明显的编译错误,哪一行特别是“红色”?顺便说一下,这与您调用Hash和saltOh的方式类似,在添加参数并打开连接之前,您正在执行读取器。这是因为您正在传递对象的属性。把你收到的字符串传过来就行了<代码>验证密码(textpass.Text、userhash、usersalt)
@bradbury9 OP没有发布实际的编译错误,但它与在同一类中声明的公共静态方法没有任何关系。但是,试图调用
字符串上不存在的
散列
Salt
属性显然是一个编译错误,我认为我可以。。我可以使用原始密码登录,但在数据库中是散列和盐。。我会测试更多。但是非常感谢你我想我能工作。。我可以使用原始密码登录,但在数据库中是散列和盐。。我会测试更多。但是非常感谢你。。