Синтаксическая ошибка в операторе UPDATE OleDbException

Я пишу приложение, которое хранит информацию о пользователе. В настоящее время пользователь должен обновить свое имя, рост, вес и день рождения.

string height = TB_ClientHeight.Text;
    string weight = TB_ClientWeight.Text;
    string name = TB_ClientName.Text;
    string bday = dateTimePicker1.Value.ToString("dd-MM-yyyy");
    int heightint = Convert.ToInt32(height);
    int weightint = Convert.ToInt32(weight);

Он обновляется путем вызова переменной имени пользователя public static string из другой формы и использования ее в качестве переменной WHERE UserName = @username.

usernamestringo = Login.usernameFromLogin;

Я следил за другими ответами SO в этом контексте и исправил некоторые проблемы (например, предотвращение SQL-инъекций). Однако я все еще получаю синтаксическую ошибку при обновлении этих полей, как утверждает OleDbException.

using (OleDbConnection myCon = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=O:\Repos\Database\Database.accdb;Persist Security Info=False"))
using (OleDbCommand cmd = new OleDbCommand())
{
    cmd.CommandType = CommandType.Text;
    string query = "UPDATE TPersons SET Name=@Name, SET Height=@Height, SET Weight=@Weight, SET Bday=@Bday " + " WHERE FirstName= @username";
    cmd.CommandText = query;
    cmd.Parameters.AddWithValue("@Name", name.ToString());
    cmd.Parameters.AddWithValue("@Height", heightint.ToString());
    cmd.Parameters.AddWithValue("@Weight", weightint.ToString());
    cmd.Parameters.AddWithValue("@Bday", bday.ToString());
    cmd.Parameters.AddWithValue("@username", usernamestringo);

    cmd.Connection = myCon;
    myCon.Open();
    cmd.ExecuteNonQuery();
    MessageBox.Show("Updated!", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
    cmd.Parameters.Clear();
}

OleDbException это:

Индекс #0 NativeError: -526847407 Источник: ядро ​​базы данных Microsoft Access SQLState: 3000 Описание (сообщение): Синтаксическая ошибка в операторе UPDATE.

Может ли кто-нибудь указать мне, где мой синтаксис неверен? Благодарю вас!


person kkmonlee    schedule 02.05.2015    source источник
comment
Я думаю, вам просто нужно одно SET, за которым следует все имя поля, разделенное запятыми, для присвоения значений.   -  person Asad Saeeduddin    schedule 03.05.2015
comment
вы искали, как использовать оператор SET.. вы могли бы сэкономить массу времени, просто выполнив простой оператор msdn Update Set`.. вам нужен только один оператор SET, разделяющий остальные значения, следующие за ,   -  person MethodMan    schedule 03.05.2015
comment
Я только что понял о SET заявлении. Кроме того, по-видимому, имя является зарезервированным словом, поэтому я также сделал [Name]. Теперь код работает отлично! Спасибо.   -  person kkmonlee    schedule 03.05.2015


Ответы (1)


Синтаксис ОБНОВЛЕНИЯ

 UPDATE <tablename> SET field1=Value1, field2=Value2 WHERE primarykeyname=Value3

Ключевое слово SET предшествует только первому обновляемому столбцу, и у вас есть еще одна проблема со столбцом NAME. В Access это зарезервированное ключевое слово. Используйте квадратные скобки вокруг имени столбца (или лучше измените его на что-то менее хлопотное)

So:

string query = @"UPDATE TPersons SET [Name]=@Name, 
                 Height=@Height, Weight=@Weight, Bday=@Bday 
                 WHERE FirstName= @username";

Не имеет строгого отношения к вашей текущей проблеме, но вам также следует ознакомиться с этой статьей Можем ли мы отказаться от использования AddWithValue? DbCommand.AddWithValue — это ярлык с многочисленными недостатками. Лучше избегать этого.

person Steve    schedule 02.05.2015
comment
Пропустил проблему со столбцом Name. +1 - person Asad Saeeduddin; 03.05.2015
comment
Да, я понял проблему [Name], когда опубликовал свой вопрос. Большое спасибо за вашу помощь! - person kkmonlee; 03.05.2015