Какие возможные ошибки при подключении к SQL Server из C #? - PullRequest
1 голос
/ 01 апреля 2019

Я создал форму входа в C # для подключения к SQL Server 2008. И у программы чтения данных есть ошибка.Что мне делать?

Это мой проект для финала

SqlConnection con = new SqlConnection(@"Data Source=SAMSUNG-PC\SQLEXPRESS;Initial Catalog=LOGIN;Integrated Security=True");//this is my sql pc server name
SqlDataReader dr;

SqlCommand cmd = new SqlCommand("Select * from tbl_log where Username ='" + textBox1.Text + "' and Password = '", con);

con.Open();

cmd.Parameters.AddWithValue("un", textBox1.Text);
cmd.Parameters.AddWithValue("pw", textBox2.Text);

dr = cmd.ExecuteReader();//this is my problem//

if (dr.HasRows)//and this//
{
    menu menu = new menu();
    menu.Show();
    this.Hide();
}
else
{
    MessageBox.Show("error");
}
con.Close();

Я ожидаю такой вывод: если пароль правильный, перейдите в новую форму и, если пароль неправильный, окно сообщения будетпоявляются и говорят "ошибка".

Ответы [ 2 ]

2 голосов
/ 01 апреля 2019

Здесь так много всего, что должно быть другим. Большие вещи:

  • Правильная параметризация запроса (избегайте атак с использованием SQL-инъекций)
  • Не храните пароли в виде простого текста. Даже не делайте этого в коде обучения / практики! Пароли должны быть односторонним хэшированием (не шифруйте их тоже) с использованием надежного алгоритма.
  • using блокирует, чтобы не оставлять соединения открытыми при возникновении исключения, чтобы избежать создания ситуации отказа в обслуживании для вашей базы данных
  • Не смешивайте пользовательский интерфейс и доступ к базе данных. Действительно, даже мой код ниже должен иметь два уровня, где код авторизации находится в отдельном классе от кода базы данных

Что-то вроде этого намного лучше:

public static class DB 
{
    private static string ConnectionString = @"Data Source=SAMSUNG-PC\SQLEXPRESS;Initial Catalog=LOGIN;Integrated Security=True";

    public static bool ValidateUserCredentials(string username, string password)
    {
                        //PwdHash column should be Char(60) (not VarChar, not NChar)
        string sql = "Select PwdHash from tbl_log where Username = @User";

        string hash = "";
        using (var cn = new SqlConnection(ConnectionString))
        using (var cmd = new SqlCommand(sql, cn))
        {
            //use actual column types and lengths from the database here
            // Do NOT use AddWithValue()!
            cmd.Parameters.Add("@User", SqlDbType.NVarChar, 20).Value = username;

            //keep the connection active for as brief a time as possible
            cn.Open();
            using (var rdr = cmd.ExecuteReader())
            {
                if (!rdr.Read()) return false;    
                hash = (string)rdr["PwdHash"];
            }
        }
        //based on this NuGet bcrypt library:
        //https://www.nuget.org/packages/BCrypt-Official/
        if (BCrypt.Net.BCrypt.Verify(password, hash)) return true;
        return false;
    }
}

Тогда вы можете использовать его из пользовательского интерфейса следующим образом:

if (DB.ValidateUserCredentials(textBox1.Text, textBox2.Text))
{
    menu mu = new menu(); //can't give a variable the same name as it's type
    mu.Show();
    this.Hide();
}
else
{
    MessageBox.Show("error");
}
1 голос
/ 01 апреля 2019

После всех правильных замечаний, которые вы получили от @Marc Gravell и других ...

Чтобы обратиться именно к вашему актуальному вопросу, Вы должны исправить

SqlCommand cmd = new SqlCommand("Select * from tbl_log where Username ='" + textBox1.Text + "' and Password = '", con);

//Here you're trying to add parameters that don't exist    
cmd.Parameters.AddWithValue("un", textBox1.Text);
cmd.Parameters.AddWithValue("pw", textBox2.Text);

до

SqlCommand cmd = new SqlCommand("Select * from tbl_log where Username = @UserName and Password = @Password", con);

cmd.Parameters.AddWithValue("@UserName", textBox1.Text);
cmd.Parameters.AddWithValue("@Password", textBox2.Text);

Также, чтобы помочь вам понять ошибку (и потому что это вызов SQL), Вы должны обернуть код с try-catch

И последнее замечание, так как вы начинающий ... Используйте значимые имена. Старайтесь избегать сокращений, это вредная привычка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...