连接到应用程序C#的登录验证

时间:2013-12-18 12:33:57

标签: c# login sqldatareader sqlconnection sqlcommand

我创建了连接到应用程序的登录验证,但现在我遇到了一个问题,即在连接应用程序时说我关闭了连接错误。

我的验证脚本:

SQL:

CREATE TABLE [Login]
 (
   username varchar(30) CHECK (username is not null AND username <> ''),
   email varchar(30),
   [password] varchar(50),
   UNIQUE (username)
 )

 INSERT INTO dbo.Login values('admin', 'Email@seznam.cz', HASHBYTES('md5',convert(varchar(50),'root')))

C#:

class LoginValidation : Login
{
    public string connection = "Data Source=RADEK-PC\\SQLEXPRESS;Initial Catalog=Evidence;Integrated Security=True;";
    public string loginVal, passwordVal;

    public LoginValidation(string login, string password)
    {
        try
        {
            using (SqlConnection sql = new SqlConnection(connection))
            {
                sql.Open();


                using (SqlCommand selectLogin = new SqlCommand("SELECT * FROM dbo.Login WHERE username = @login", sql))
                {
                    selectLogin.Parameters.Clear();
                    SqlParameter subjektParam = new SqlParameter("@login", SqlDbType.VarChar, 30);
                    subjektParam.Value = login;
                    selectLogin.Parameters.Add(subjektParam);
                    selectLogin.Prepare();

                    using (SqlDataReader readerLogin = selectLogin.ExecuteReader())
                    {
                        while (readerLogin.Read())
                        {
                            if (readerLogin.IsDBNull(0) || readerLogin.IsDBNull(2))
                                continue;


                            loginVal = readerLogin.GetString(0);
                            passwordVal = readerLogin.GetString(2);
                        }
                    }
                    sql.Close();
                }
            }
        }
        catch (Exception e)
        {
            MessageBox.Show("Chyba: " + e);
        }

        if (login == loginVal && password == passwordVal)
        {
            Main main = new Main();
            main.Show();
        }
        else
            MessageBox.Show("Přihlašovací jméno nebo heslo neni správné");
    }
}

输出错误:

e   {"A fatal internal error connection."}  System.Exception {System.InvalidOperationException}

输入数据:

login - > admin
password - > root

拜托,你能帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

问题1:在调用ExecuteNonQuery()命令时,您需要重新调用select,这不是必需的。

删除此内容:

selectLogin.ExecuteNonQuery(); 

问题2:使用||进行逻辑OR操作。

试试这个:

if (readerLogin.IsDBNull(0) || readerLogin.IsDBNull(2))
continue;

解决方案2: Hashbytes不能是decrypted,因为它们是一个方向。解决问题的唯一方法是散列user password值并将其与数据库中现有的password value进行比较。

答案 1 :(得分:0)

使用此

更改您的try块语句
    try
    {
        using (SqlConnection sql = new SqlConnection(connection))
        {
            sql.Open();
            string query = "SELECT * FROM dbo.Login WHERE username = @login";
            SqlCommand selectLogin = new SqlCommand(query , sql);
            selectLogin.Parameters.Add(new SqlParameter("@login",login)); 
            SqlDataReader readerLogin = selectLogin.ExecuteReader())                    
            while (readerLogin.Read())
            {
               if (readerLogin.IsDBNull(0) || readerLogin.IsDBNull(2))
                  continue;
               loginVal = readerLogin.GetString(0);
               passwordVal = readerLogin.GetString(2);
            }
       }
    }
相关问题