.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.

"Выберите имя пользователя из таблицы, где имя пользователя = имя пользователя"

  1. Таблица является зарезервированным ключевым словом. Используйте другое имя для таблицы или [Таблица].
  2. Последняя часть, Имя пользователя = имя пользователя, также неверна. Если вы хотели, чтобы там была постоянная строка, вам следует рассмотреть возможность ввода имени пользователя в кавычки \ 'username \'. Не забывайте о символе побега. И если вы хотите передать параметр в SQLCommand, используйте @username в запросе и передайте значение таким образом

    cmd.Parameters["@username"].Value = "Bob";

Другие вопросы по тегам