.NET SqlDataReader: SqlException не обрабатывается кодом пользователя.
Работа над созданием простого веб-приложения.NET с использованием созданной таблицы SQL Server. Я продолжаю получать ошибки в отношении SqlDataReader, и застрял на том, где я иду не так.
Вот моя ошибка: Дополнительная информация: Неверный синтаксис рядом с ключевым словом "Таблица".
Вот мой код:
РЕДАКТИРОВАТЬ:
bool authenticated = AuthenticateMe(txtUsername.Text, txtPassword.Text);
if (authenticated)
{
Response.Redirect("Home.aspx");
}
else
{
Response.Redirect("Default.aspx");
}
}
private bool AuthenticateMe(string username, string password)
{
// string ErrorMessage = "";
string connectionString = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;Connect Timeout=30";
string commandText = "SELECT Username from [Table] where Username = @name AND Password = @pwd";
// try
// {
using (SqlConnection sqlConnection1 = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand(commandText, sqlConnection1))
{
sqlConnection1.Open();
cmd.Parameters.AddWithValue("@name", username);
cmd.Parameters.AddWithValue("@pwd", password);
int result = (int)cmd.ExecuteNonQuery();
if (result > 0)
{
return true;
}
else
{
return false;
}
}
}
1-я версия (до редактирования):
protected void bnLogin_Click(object sender, EventArgs e)
{
bool authenticated = AuthenticateMe(txtUsername.Text, txtPassword.Text);
if (authenticated)
{
Response.Redirect("Home.aspx");
}
else
{
Response.Redirect("Default.aspx");
}
}
private bool AuthenticateMe(string userName, string password)
{
string connectionString = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;Connect Timeout=30";
SqlConnection sqlConnection1 = new SqlConnection(connectionString);
sqlConnection1.Open();
SqlCommand cmd = new SqlCommand("SELECT Username from Table where Username = userName");
cmd.Connection = sqlConnection1;
SqlDataReader reader = cmd.ExecuteReader();
Response.Write("Entered Sucessfully");
reader = cmd.ExecuteReader();
string localUserName = (string)reader["Username"];
sqlConnection1.Close();
if (userName.Equals(localUserName))
{
return true;
}
else
{
return false;
}
4 ответа
Ваш метод AuthenticateMe кажется немного неправильным и неэффективным для аутентификации пользователя
- Вы используете зарезервированное ключевое слово (таблица) без правильных разделителей (квадратные скобки)
- Вы не передаете имя пользователя и пароль в запрос, который проверяет, присутствует ли пользователь
- Вы вызываете два раза ExecuteReader (?)
- Вы проверяете возвращенное значение из запроса с тем же значением, которое использовалось для поиска (бесполезно)
Таким образом, вы можете переписать код таким образом
private bool AuthenticateMe(string userName, string password)
{
string connectionString = @".....";
string commandText = "SELECT COUNT(*) from [Table] where Username = @name AND Pass = @pwd");
using(SqlConnection sqlConnection1 = new SqlConnection(connectionString))
using(SqlCommand cmd = new SqlCommand(commandText, sqlConnection1))
{
sqlConnection1.Open();
cmd.Parameters.AddWithValue("@name", username);
cmd.Parameters.AddWithValue("@pwd", password);
int result = Convert.ToInt32(cmd.ExecuteScalar());
return (result > 0);
}
}
Кроме того, имейте в виду, что считается плохой практикой хранить пароли в базе данных в виде простого текста. К запомненному паролю следует применить некую хэш-функцию, чтобы запретить любые проблемы с безопасностью, если кто-то получит копию базы данных.
Таблица является зарезервированным ключевым словом в SQL. Попробуйте поставить вокруг него квадратные скобки:
SqlCommand cmd = new SqlCommand("SELECT Username from [Table] where Username = userName");
Таблица является ключевым словом. Если ваша таблица называется Table
Ваш sql должен избежать этого. Пытаться [Table]
,
Также обратите внимание, что вы захотите использовать параметр для имени пользователя - т.е. where Username = @userName
где вы также добавляете параметр с таким именем в команду с соответствующим значением.
Я думаю, что есть 2 проблемы с вашим запросом SQL.
"Выберите имя пользователя из таблицы, где имя пользователя = имя пользователя"
- Таблица является зарезервированным ключевым словом. Используйте другое имя для таблицы или [Таблица].
Последняя часть, Имя пользователя = имя пользователя, также неверна. Если вы хотели, чтобы там была постоянная строка, вам следует рассмотреть возможность ввода имени пользователя в кавычки \ 'username \'. Не забывайте о символе побега. И если вы хотите передать параметр в SQLCommand, используйте @username в запросе и передайте значение таким образом
cmd.Parameters["@username"].Value = "Bob";