Как проверить пользователя по базе?

242
02 февраля 2018, 19:07

Создал таблицу в Access, куда с формы заносятся данные (регистрируются пользователи):

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        OleDbConnection oleDbConn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Desktop\База\V3\database.mdb");
        oleDbConn.Open();
        string sql = "INSERT INTO Пользователи (Логин, Пароль, Имя, Фамилия) VALUES ('" + textBox1.Text + "', '" + textBox4.Text + "', '" + textBox2.Text + "', '" + textBox3.Text + "');";
        OleDbCommand oleComm = new OleDbCommand(sql, oleDbConn);
        oleComm.ExecuteNonQuery(); 
        MessageBox.Show("Пользователь успешно зарегистрирован");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Добавил ещё одну таблицу, куда пользователь будет вводить логин и пароль, и соответственно если такие существуют в базе, пускает его в программу, а если нет, то указывает, что он ввёл не существующие данные. Подскажите, как правильно осуществить проверку в базе о зарегистрированных пользователях, спасибо.

private void button1_Click(object sender, EventArgs e)
{
    if (//?)
    {
        //?
        //Открываю форму с основной программой
    }
    else
        MessageBox.Show("Проверьте внесенные данные");
}
Answer 1

Для работы с хранилищем данных код лучше выносить в отдельный класс.

Передавать параметры лучше через Parameters, это защищает от атак типа SQL Injection.

Нужно всегда закрывать все объекты, которые реализуют интерфейс IDisposable, если они больше не нужны. В нашем случае это OleDbConnection и OleDbCommand.

public static class DataProvider
{
    static string ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Desktop\База\V3\database.mdb";
    public static void InsertUser(string login, string password, string firstName, string lastName)
    {
        using (var oleDbConn = new OleDbConnection(ConnectionString))
        {
            oleDbConn.Open();
            var sql = "INSERT INTO Пользователи (Логин, Пароль, Имя, Фамилия) VALUES (?, ?, ?, ?)";
            using (var oleComm = new OleDbCommand(sql, oleDbConn))
            {
                oleComm.AddWithValue("@Login", login);
                oleComm.AddWithValue("@Password", password);
                oleComm.AddWithValue("@lastName", lastName);
                oleComm.AddWithValue("@lastName", lastName);
                oleComm.ExecuteNonQuery();
            }
        }
    }
    public static bool UserExists(string login, string password)
    {
        using (var oleDbConn = new OleDbConnection(ConnectionString))
        {
            oleDbConn.Open();
            var sql = $"SELECT COUNT(*) FROM Пользователи WHERE Логин = ? AND Пароль = ?";
            using (var oleComm = new OleDbCommand(sql, oleDbConn))
            {
                oleComm.AddWithValue("@Login", login);
                oleComm.AddWithValue("@Password", password);
                var result = oleComm.ExecuteScalar() as int?;
                return result == 1;
            }
        }
    }
}

Добавляем удобные обертки

public static class OleDbExtensions
{
    public static OleDbParameter AddWithValue(this OleDbCommand command, string name, object value)
    {
        return command.Parameters.Add(new OleDbParameter { ParameterName = name, Value = value });
    }
}

Что можно улучшить еще?

Убрать ConnectionString в app.config:

<configuration>
    <connectionStrings>
        <add name="Main" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Desktop\База\V3\database.mdb" />
    </connectionStrings>
</configuration>

Немного изменяем наш класс

using System.Configuration; // добавить сборку System.Configuration.dll
public static class DataProvider
{
    static string ConnectionString = "";
    static DataProvider()
    {
        ConnectionString = ConfigurationManager.ConnectionStrings["Main"].ConnectionString
    }
    //...
}
Answer 2

По сути в комментарии вам все правильно сказали. Для этого у вас есть форма аутентификации.

Далее, вы делаете SqlCommand.ExecuteScalar параметоризированных запрос к базе вида:

SELECT COUNT(*) Логин=@Login and Пароль=@Password

Параметоризированный запрос очень важен, так как позволяет избежать SQL-инъекции, которая может дать злоумышленнику прочитать то, что он не должен читать.

Если запрос вернул кол-во >0, то пользователь есть в базе и даете ему работать с приложением дальше, в противном случае даете ему работать дальше.

READ ALSO
C# Web сервис ошибка

C# Web сервис ошибка

Новичок в веб-сервисах, наладил его, работает однако при обращении к нему выдается ошибка:

215
unit тест не должен пройти [требует правки]

unit тест не должен пройти [требует правки]

Помогите с реализацией, чтобы при запуске разработанных тестовНи один тест не должен пройти + произвести разработку кода, не прибегая к изменению...

229
Найти максимум по полю

Найти максимум по полю

Как сделать ф-цию красивее?

203