Я делаю свою программу, и мне нужно войти и зарегистрироваться в системе. Моя система регистрации работает, но вход в систему не работает.
Я сделал систему регистрации
SqlConnection sqlCon = new SqlConnection("Data Source = (LocalDB)\\MSSQLLocalDB; Initial Catalog = ConnectionDb; Integrated Security = True");
SqlDataAdapter sda = new SqlDataAdapter("Select Count(*) From UsersConfig where Email='" + textBox1.Text.Trim() + "' and Password='" + textBox2.Text.Trim() + "'", sqlCon);
DataTable dtbl = new DataTable();
sda.Fill(dtbl);
if (dtbl.Rows[0][0].ToString() == "1")
{
SqlConnection sqlConn = new SqlConnection("Data Source = (LocalDB)\\MSSQLLocalDB; Initial Catalog = ConnectionDb; Integrated Security = True");
SqlDataAdapter sdaa = new SqlDataAdapter("Select Count(*) From UsersConfig where Email='" + textBox1.Text.Trim() + "' and Password='" + textBox2.Text.Trim() + "' and AdminYes='" + "1" + "'", sqlConn);
DataTable dtbll = new DataTable();
sdaa.Fill(dtbll);
if (dtbll.Rows[0][0].ToString() == "1")
{
MessageBox.Show("Has admin");
Form adminpanel = new AdminPanel();
adminpanel.Show();
this.Hide();
}
else
{
MessageBox.Show("Hasn't got admin");
}
}
else
{
MessageBox.Show("Not working!");
}
у меня нет сообщения об ошибке
Для этого не нужно использовать таблицу данных, передайте свой запрос в SqlCommand и выполните его, используя ExecuteScalar Это идеально подходит для возврата одного результата из запроса. Я также думаю, что вместо этого вы могли бы просто вернуть значение AdminYes, и если строка не возвращается, вход в систему не удался, если строка возвращается, вы знаете, является ли он администратором. Кроме того, при поиске двух вещей, которые я перечислил, также обратите внимание на использование параметров для ваших пользовательских входных значений. И в идеале вы должны сравнивать хэш пароля, а не хранить пароли в виде простого текста в своей таблице.
Посмотрите первый пример на этой странице Microsoft. Он использует хранимую процедуру, но показывает, как использовать оператор using для SqlConnection и как обрабатывать перехват ошибок с помощью try {} catch {} для SqlException ошибок. Возможно, у вас возникла ошибка подключения к базе данных. docs.microsoft.com/en-us/dotnet/api/…
Одинарные кавычки используются для обозначения того, что параметр является строкой. AdminYes должен быть нулем или единицей, и у вас есть одинарные кавычки вокруг единицы, что делает ее строкой. Итак, вы сравниваете «1» с 1.





Предложения из комментариев выше и ссылка Microsoft изменили бы код, чтобы он выглядел примерно так, как показано ниже. Кроме того, НАСТОЯТЕЛЬНО рекомендуется использовать параметры вместо построения строки вручную, так как построение строки SQL может привести к уязвимостям безопасности SQL-инъекций.
ПРИМЕЧАНИЕ. Я не думаю, что это исправит вашу ошибку, но может помочь найти проблему.
string connectionString = "Data Source = (LocalDB)\\MSSQLLocalDB; Initial Catalog = ConnectionDb; Integrated Security = True";
using (SqlConnection sqlCon = new SqlConnection(connectionString))
{
string email = textBox1.Text.Trim();
string pwd = textBox2.Text.Trim();
//NOTE: passwords shouldn't be stored in plain text.
//There should be an hashing step here like:
pwd = MyCustomPasswordHasher(email, pwd);
string sql = "Select [AdminYes] From UsersConfig where Email=@user and Password=@password";
SqlCommand command = new SqlCommand(sql, sqlCon);
command.Parameters.AddWithValue("@user", email);
command.Parameters.AddWithValue("@password", pwd);
try
{
command.Connection.Open();
object result = command.ExecuteScalar();
if (result == null)
{
MessageBox.Show("Invalid credentials!");
}
else if (result.ToString() == "1")
{
MessageBox.Show("Has admin");
Form adminpanel = new AdminPanel();
adminpanel.Show();
this.Hide();
}
else
{
MessageBox.Show("Hasn't got admin");
}
}
catch (SqlException ex)
{
MessageBox.Show("Database errors!");
}
}
@Навио отлично. Пожалуйста, убедитесь, что это ответ. Спасибо!
Почему вы открываете базу данных дважды? Вы должны использовать одно соединение с двумя адаптерами, а затем установить первый.