Ошибка синтаксиса SQL в операторе обновления VB.net - PullRequest
4 голосов
/ 12 марта 2010

При запуске в VB я получаю странную синтаксическую ошибку:

        SQLString = "UPDATE Login SET Password = '" + PasswordTextBox.Text + "'"
        SQLString += " WHERE UserName = '" + UserNameTextBox.Text + "'"

Username проверяется перед переходом к этой части и определенно находится в базе данных Это дает исключение, говорящее, что в операторе обновления есть синтаксическая ошибка. Кто-нибудь есть идеи, что не так?

Ответы [ 7 ]

5 голосов
/ 12 марта 2010

LOGIN - зарезервированное слово в SQL Server (используется для управления учетной записью для входа в систему), поэтому для использования его в запросе (т. Е. Имени столбца) необходимо экранировать его с помощью [], поэтому используйте [LOGIN] в качестве имени поля.

Никогда не следует использовать конкатенацию строк и передавать ее в базу данных SQL, поскольку вы подвергаете себя SQL-инъекциям атакам.

Вы должны использовать объект SqlCommand и передавать параметры. См. эту статью о том, как это сделать.

SQLString = "UPDATE [Login] SET Password = @password "
SQLString += " WHERE UserName = @userName"

...

dbCommand.Parameters.Add("@password", SqlDbType.VarChar, 50)
dbCommand.Parameters["@password"].Value = PasswordTextBox.Text

dbCommand.Parameters.Add("@userName", SqlDbType.VarChar, 50)
dbCommand.Parameters["@userName"].Value = UserNameTextBox.Text
2 голосов
/ 12 марта 2010

Я уверен, что Логин является зарезервированным словом, попробуйте изменить Логин на [Логин]

1 голос
/ 12 марта 2010

Пароль - зарезервированное слово, поэтому [Пароль] исправляет его, мой лектор исправил для меня :)

0 голосов
/ 12 марта 2010

Я бы рекомендовал заключать слова «логин» и «пароль» в галочки, чтобы обработчик знал, что они не должны отображаться как зарезервированные слова.

Итак:

Обновить 'логин' SET 'пароль'

Но вместо одинарных кавычек используйте галочку (левая верхняя клавиша на клавиатуре). Я не могу продемонстрировать это правильно, так как StackOverflow будет обрабатывать его как класс, если он окружен галочками.

0 голосов
/ 12 марта 2010

Я согласен с некоторыми из предыдущих ответов об использовании параметров (я дал + 1 для @Oded) и использовании [] с именами таблиц и полей (я дал +1 для SQLMenace).

В заключение, я думаю, что это самый правильный способ запустить ваш запрос:

using(SqlConnection connection = new SqlConnection("<your connection string>"))
    {
        connection.Open();
        SqlCommand command = new SqlCommand();

        command.Connection = connection;

        command.CommandText = "UPDATE [Login] SET [Password] = @PasswordParameter WHERE [UserName] = @UserNameParameter";
        command.Parameters.AddWithValue("@PasswordParameter", PasswordTextBox.Text);
        command.Parameters.AddWithValue("@UserNameParameter", UserNameTextBox.Text);

        command.ExecuteNonQuery();
    }
0 голосов
/ 12 марта 2010

Не зная, что вы используете для своего действительного пароля и имени пользователя, я предполагаю, что некоторые символы в одном (или обоих) из них приводят к преждевременному завершению оператора sql. Вы должны действительно использовать параметры при выполнении sql следующим образом.

Взгляните на это: http://msdn.microsoft.com/en-us/library/ms998271.aspx

0 голосов
/ 12 марта 2010

Вместо того, чтобы показывать, как вы строите оператор, покажите нам, что находится в SQLString при выполнении оператора.

Также попробуйте заключить имена столбцов и таблиц в символы кавычек идентификаторов, которые [и] для Microsoft, и `(для клавиши тильды) для многих других баз данных.

...