为啥在尝试更新数据库时出现语法错误?

Posted

技术标签:

【中文标题】为啥在尝试更新数据库时出现语法错误?【英文标题】:Why am I getting syntax error while trying to update database?为什么在尝试更新数据库时出现语法错误? 【发布时间】:2018-11-10 06:27:10 【问题描述】:

我一直在尝试环顾四周并解决这个问题,并且我已经尝试了好几个小时,所以我决定问问其他人。 我得到了一个

'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();

【问题讨论】:

你知道SQL Injection攻击是什么吗? 我不知道,但我改变了。 例如,有人可以在textBox1 TextBox 中键入有效的 SQL,您的代码将允许他们的自定义 SQL 在服务器上运行。它可以查询敏感信息或删除数据库或在用户管理表中插入新记录。 哦,哇,这一切都将保存在用户本地的机器上,没有服务器或任何东西 使用参数来避免这种事情是个好习惯。那些原本只属于本地的代码最终投入生产的次数让我感到震惊。 【参考方案1】:

Where 声明之前,您有一个额外的逗号 ,

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

只需删除它。你应该将你的textBox7.Text 转换为int,如果它的类型是整数,ID= '" + Convert.ToInt32(textBox7.Text) + "'(不要忘记用单引号括起来)。此外,您应该始终使用parameterized queries 来避免使用SQL Injection。像这样的:

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 语句。

【讨论】:

现在我得到“条件表达式中的数据类型不匹配”。 @CadenBuckelew 你试过这个吗? where ID= '" + Convert.ToInt32(textBox7.Text) + "' @CadenBuckelew 也使用Add 代替AddWithValue 可以帮助你更多。再次检查我更新的答案。 @CadenBuckelew 你也应该在ID 中使用参数。检查我更新的答案,看看如何。 经过大量试验和错误,它成功了,非常感谢!抱歉,我是编码新手,这是我学习如何使用 C# 的第一周左右。非常感谢您的帮助!【参考方案2】:

另一个原因可能是,您从文本框中读取的值可能包含特殊字符,这些字符在连接到 SQL 字符串时会使语法无效。 使用参数查询时也可以避免这种情况。

【讨论】:

我添加了参数查询,我得到“条件表达式中的数据类型不匹配”。 请向我们展示您迄今为止的整个查询结果。一个有价值/必要的附加信息将是表字段的数据类型。 因为你得到了'Data type mismatch in criteria expression,所以我们仍然需要表字段的数据类型。而且您的标准仍然使用字符串连接。【参考方案3】:
CVV='" + textBox6.Text + "', where 

你必须在这里删除逗号。 由于您有多个参数,因此最好使用参数。像这样发送它们会在将来引起问题。所以我建议你使用cmd.Parameters.Add(); 而不是原始使用。如果 ID 是 Integer 你必须Convert.ToInt32(textBox7.Text);

【讨论】:

我现在收到此错误:“标准表达式中的数据类型不匹配。” 这是因为您将所有参数作为字符串发送。哪个 db 将其视为 nvarchar,因此它会发生。您必须将其全部转换为相关字段的数据类型。比如整数 Convert.ToInt32(textbox7.text);

以上是关于为啥在尝试更新数据库时出现语法错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥运行 yarn start 时出现语法错误

为啥在我的 Postgres 函数中使用 IF 语句时出现语法错误?

尝试使用触发器以将行插入另一个表时出现语法错误

尝试将项目添加到数据库时出现更新条目错误

更新时出现休眠错误:无法执行语句,在 'index=1' 附近使用正确的语法

为啥当我点击更新按钮时出现错误TypeError: r is undefined?