Неверный синтаксис в SQL?

1

Я делаю экран входа пользователя в С# winforms, я хочу иметь возможность проверять имя пользователя и пароль пользователя по записям в базе данных SQL в соответствии с этой ссылкой, однако мой код генерирует исключение "Неверный синтаксис рядом с пользователем".

Может ли кто-нибудь помочь мне выяснить, что случилось с моим кодом, пожалуйста? код нарушения ниже.

 private bool CompareStrings(string string1, string string2)
    {
        return String.Compare(string1, string2, true, System.Globalization.CultureInfo.InvariantCulture) == 0 ? true : false;
    }

    private void LoginBtn_Click(object sender, EventArgs e)
    {
        //var username = textBox1.Text;
        //var password = maskedTextBox1.Text;
        try
        {
            SqlConnection Conn = new SqlConnection("Data Source=***********;Initial Catalog=*********;Persist Security Info=True;User ID=*********;Password=*******");
            SqlCommand com = new SqlCommand();
            com.Connection = Conn;
            Conn.Open();

            com.CommandText = ("SELECT (Username) AS User, (Password) as Pass FROM dbname WHERE User='" + textBox1.Text + "'");
            SqlDataReader reader = com.ExecuteReader();
            var username = textBox1.Text;
            var password = maskedTextBox1.Text;
            while (reader.Read())
            {
                if (this.CompareStrings(reader["User"].ToString(), username) &&
                    this.CompareStrings(reader["Pass"].ToString(), password))
                {
                    MessageBox.Show("Login Authenticated!");

                }
                else
                {
                    MessageBox.Show("Login failed!");

                }
                Conn.Close();
                reader.Close();
            }
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
  • 1
    попробуйте написать пользовательский как [пользователь] в запросе
  • 0
    Пожалуйста, используйте параметризованные запросы. Ваш код уязвим для инъекций SQL, создавая этот запрос с неанизированным пользовательским вводом. Выглядит так, как будто вы храните учетные данные пользователя в виде обычного текста ...
Теги:
sqlcommand

2 ответа

7
Лучший ответ

USER - зарезервированное ключевое слово в T-SQL. Вы должны использовать его с квадратными скобками, например [USER]. Однако лучшим решением является изменение имени на незарезервированное слово.

Всегда используйте параметризованные запросы. Этот тип конкатенаций строк открыт для атак SQL Injection.

USER - псевдоним для столбца Username. Вы должны использовать это оригинальное имя в своем WHERE.

И using инструкцию using для размещения ваших SqlConnection и SqlCommand и SqlDataReader.

using(SqlConnection Conn = new SqlConnection(connString))
using(SqlCommand com = Conn.CreateCommand())
{
    com.CommandText = "SELECT (Username) AS [User], (Password) as Pass FROM dbname WHERE Username = @user";
    com.Parameters.AddWithValue("@user", textBox1.Text);
    Conn.Open();
    using(SqlDataReader reader = com.ExecuteReader())
    {
       ...
    }
}
  • 0
    Спасибо Сонер, это решило мою первоначальную проблему, но прежде чем я пометил как ответивший, вы могли бы помочь мне с другой проблемой? Похоже, что мой цикл while в приведенном выше коде не сработает, когда я попытаюсь установить точку останова. Можете ли вы увидеть какие-либо ошибки, которые могут вызвать такое поведение?
  • 0
    @Reece Проверьте мой ответ, в предложении where есть ошибка
Показать ещё 2 комментария
2

Вы должны использовать квадратные скобки, если вы используете любое ключевое слово, которое предопределено ИЛИ зарезервировано Sql Server

например, здесь вы используете USER вы должны использовать [USER]

а также ваш запрос неверен, вы должны использовать имя пользователя вместо пользователя в where clause

Вы должны использовать это

 com.CommandText = ("SELECT (Username) AS [User], (Password) as Pass FROM dbname WHERE Username='" + textBox1.Text + "'");

Ещё вопросы

Сообщество Overcoder
Наверх
Меню