Почему я получаю синтаксическую ошибку при попытке обновить базу данных? - PullRequest
0 голосов
/ 10 ноября 2018

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

'Синтаксическая ошибка в выражении UPDATE.'

При нажатии на кнопку сохранения.

Вот мой код:

OleDbCommand command = new OleDbCommand();
command.Connection = connection;

string query = "update Profiles set [PROFILE NAME]='" + textBox1.Text + "', [LOGIN EMAIL]='" + textBox2.Text + "', [PASSWORD]='" + textBox3.Text + "', [FULL NAME]='" + textBox4.Text + "', [CARD NUMBER]='" + textBox5.Text + "', [EXP MONTH]='" + comboBox1.Text + "', [EXP YEAR]='" + comboBox2.Text + "', CVV='" + textBox6.Text + "', where ID=" + textBox7.Text + "";
command.CommandText = query;
command.ExecuteNonQuery();
connection.Close();
MessageBox.Show("Profile Saved");
RefreshDBConnection();

Обновленный код:

ConnectToDataBase();
OleDbCommand command = new OleDbCommand();
command.Connection = connection;

//string query = "update Profiles set [PROFILE NAME]='" + textBox1.Text + "', [LOGIN EMAIL]='" + textBox2.Text + "', [PASSWORD]='" + textBox3.Text + "', [FULL NAME]='" + textBox4.Text + "', [CARD NUMBER]='" + textBox5.Text + "', [EXP MONTH]='" + comboBox1.Text + "', [EXP YEAR]='" + comboBox2.Text + "', CVV='" + textBox6.Text + "' where  ID='" + Convert.ToInt32(textBox7.Text) + "'";
string query = "update Profiles set [PROFILE NAME]= @Profile, [LOGIN EMAIL]= @Email, [PASSWORD]= @Pass, [FULL NAME]= @Name, [CARD NUMBER]= @Card, [EXP MONTH]= @EXPM, [EXP YEAR]= @EXPY, CVV= @CVV where ID = '" +textBox7.Text+ "'";
command.Parameters.AddWithValue("@Profile", textBox1.Text);
command.Parameters.AddWithValue("@Email", textBox2.Text);
command.Parameters.AddWithValue("@Pass", textBox3.Text);
command.Parameters.AddWithValue("@Name", textBox4.Text);
command.Parameters.AddWithValue("@Card", Convert.ToInt32(textBox5.Text));
command.Parameters.AddWithValue("@EXPM", Convert.ToInt32(comboBox1.Text));
command.Parameters.AddWithValue("@EXPY", Convert.ToInt32(comboBox2.Text));
command.Parameters.AddWithValue("@CVV", Convert.ToInt32(textBox6.Text));
command.CommandText = query;
command.ExecuteNonQuery();
connection.Close();
MessageBox.Show("Profile Saved");
RefreshDBConnection();
this.Close();

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018
CVV='" + textBox6.Text + "', where 

Вы должны удалить запятую здесь. Также лучше использовать параметры, так как у вас есть несколько. отправка их таким образом вызовет проблемы в будущем. поэтому я предлагаю вам использовать cmd.Parameters.Add(); вместо необработанного использования. также, если ID является целым числом, вы должны Convert.ToInt32(textBox7.Text);

0 голосов
/ 10 ноября 2018

Другая причина может заключаться в том, что значения, которые вы читаете из текстовых полей, могут содержать специальные символы, которые делают синтаксис недопустимым при присоединении к строке SQL. Этого также можно избежать при использовании запросов параметров.

0 голосов
/ 10 ноября 2018

У вас есть одна дополнительная запятая , перед вашим Where заявлением:

CVV='" + textBox6.Text + "', where 

Просто удали это. И вы должны конвертировать textBox7.Text в int, если его тип целочисленный, ID= '" + Convert.ToInt32(textBox7.Text) + "' (не забудьте заключить его в одинарные кавычки). Также вы всегда должны использовать параметризованные запросы , чтобы избежать SQL-инъекция . Примерно так:

string query = "update Profiles set [PROFILE NAME]= @Profile,... where ID = @Id";
command.Parameters.AddWithValue("@Profile", textBox1.Text);
command.Parameters.AddWithValue("@Id", textBox7.Text);//Or Convert.ToInt32(textBox7.Text)

Хотя указывать тип напрямую и использовать свойство Value лучше, чем AddWithValue:

command.Parameters.Add("@Profile", SqlDbType.VarChar).Value = textBox1.Text;
command.Parameters.Add("@Id", SqlDbType.Int).Value = Convert.ToInt32(textBox7.Text);

И, конечно, рекомендуется всегда использовать оператор using.

...