Создал таблицу в 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("Проверьте внесенные данные");
}
Для работы с хранилищем данных код лучше выносить в отдельный класс.
Передавать параметры лучше через 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
}
//...
}
По сути в комментарии вам все правильно сказали. Для этого у вас есть форма аутентификации.
Далее, вы делаете SqlCommand.ExecuteScalar
параметоризированных запрос к базе вида:
SELECT COUNT(*) Логин=@Login and Пароль=@Password
Параметоризированный запрос очень важен, так как позволяет избежать SQL-инъекции, которая может дать злоумышленнику прочитать то, что он не должен читать.
Если запрос вернул кол-во >0, то пользователь есть в базе и даете ему работать с приложением дальше, в противном случае даете ему работать дальше.
Новичок в веб-сервисах, наладил его, работает однако при обращении к нему выдается ошибка:
Помогите с реализацией, чтобы при запуске разработанных тестовНи один тест не должен пройти + произвести разработку кода, не прибегая к изменению...