使用C#中的多个文本框更新Access数据库时出现异常
我的代码引发此异常: UPDATE语句中的语法错误 我的SQL语法有什么问题?我怎么修理它 我正在使用VisualStudio2010和Access数据库。这是我的密码:使用C#中的多个文本框更新Access数据库时出现异常,c#,sql,ms-access,C#,Sql,Ms Access,我的代码引发此异常: UPDATE语句中的语法错误 我的SQL语法有什么问题?我怎么修理它 我正在使用VisualStudio2010和Access数据库。这是我的密码: private void CBM_editButton_Click(object sender, EventArgs e) { try { // to edit or update already existing informations OleDbConnection con
private void CBM_editButton_Click(object sender, EventArgs e)
{
try
{
// to edit or update already existing informations
OleDbConnection con = new OleDbConnection();
con.ConnectionString =
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Sunquick\Desktop\c sharp project2\ContactBook2.mdb";
OleDbCommand com = new OleDbCommand();
com.CommandText = "UPDATE ContactList set Name='" + CBM_textbox1.Text +
"','" + CBM_textbox2.Text + "','" + CBM_textbox3.Text +
"','" + CBM_textbox4.Text + "','" + CBM_textbox5.Text + "'";
com.Connection = con;
con.Open();
com.ExecuteNonQuery();
MessageBox.Show("Data has been changed");
con.Close();
}
catch(Exception Error)
{
MessageBox.Show(Error.ToString());
}
CBM_textbox1.Text = "";
}
倒数第二个字符是“)”-这是从哪里来的
(另外,您没有where子句,因此正在更新整个表)
倒数第二个字符是“)”-这是从哪里来的
(另外,您没有where子句,因此您正在更新整个表)如果其中一个文本框包含带单引号的文本,这将创建无效的sql语句 正如其他人所指出的,您可以使用参数化查询。尽管如此,我还是向您展示了一个字符串版本 它使用这个辅助函数
private string SqlStr(string s)
{
if (String.IsNullOrEmpty(s)) {
return "NULL";
}
return "'" + s.Replace("'", "''") + "'";
}
试试这个:
string sql = String.Format(
"UPDATE ContactList SET Name={0}, Email={1}, Mobile={2}, Country={3}, City={4}",
SqlStr(CBM_textbox1.Text),
SqlStr(CBM_textbox2.Text),
SqlStr(CBM_textbox3.Text),
SqlStr(CBM_textbox4.Text),
SqlStr(CBM_textbox5.Text)
);
您的sql示例最后有一个多余的“)”,由于缺少WHERE语句,它将更新整个表!您应该添加如下内容:
"... WHERE id=77"
或者可能是您试图添加一个记录?在这种情况下,您应该使用以下内容:
INSERT INTO ContactList (Name, Email, City) VALUES ('John','jd@xx.com','LA')
如果其中一个文本框包含带有单引号的文本,这将创建无效的sql语句 正如其他人所指出的,您可以使用参数化查询。尽管如此,我还是向您展示了一个字符串版本 它使用这个辅助函数
private string SqlStr(string s)
{
if (String.IsNullOrEmpty(s)) {
return "NULL";
}
return "'" + s.Replace("'", "''") + "'";
}
试试这个:
string sql = String.Format(
"UPDATE ContactList SET Name={0}, Email={1}, Mobile={2}, Country={3}, City={4}",
SqlStr(CBM_textbox1.Text),
SqlStr(CBM_textbox2.Text),
SqlStr(CBM_textbox3.Text),
SqlStr(CBM_textbox4.Text),
SqlStr(CBM_textbox5.Text)
);
您的sql示例最后有一个多余的“)”,由于缺少WHERE语句,它将更新整个表!您应该添加如下内容:
"... WHERE id=77"
或者可能是您试图添加一个记录?在这种情况下,您应该使用以下内容:
INSERT INTO ContactList (Name, Email, City) VALUES ('John','jd@xx.com','LA')
在你的更新结束时,你有一个杂乱无章的<代码>,你也没有一个WHERE子句。安全提示:为了避免应用程序中的SQL注入攻击,考虑使用参数化查询。感谢“MU太短”和“Espen Burud”,你们真的帮助了我!这是我在c-Sherp中的第一个个人类项目!最后,它的工作与您的所有帮助,我将提交它!另一个快速提示。OleDbConnection和OleDbCommand是一次性的,您应该将它们包装在using块中。如果您查看MSDN上的任何一个类文档,它们都会给出如何正确包装它们的示例。在使用数据块时适当地释放一次性对象,这是一个很好的做法。在你的更新结束时,你有一个杂散<<代码> ,你也没有WHERE子句。安全提示:为了避免应用程序中的SQL注入攻击,考虑使用参数化查询。“埃斯本·布吕德“你们真的帮了我的忙!这是我在c-Sherp中的第一个个人类项目!最后,它的工作与您的所有帮助,我将提交它!另一个快速提示。OleDbConnection和OleDbCommand是一次性的,您应该将它们包装在using块中。如果您查看MSDN上的任何一个类文档,它们都会给出如何正确包装它们的示例。使用块包装一次性对象以正确释放其各自的资源是一种很好的做法。是的,我想这正是发生的事情。此外,由于您没有使用参数化查询,文本框中的文本也可以“注入”到查询中。如果他们(在CBM_文本框5中)加上“Canton;放下桌上联系人列表“谢谢你J.Vermeire和谢谢你Ray K!”!你们真的帮了我大忙!这是我们在c-Sherp中的第一个个人类项目!最后,它的工作与您的所有帮助,我将提交它!是的,我想这正是发生的事情。另外,由于您没有使用参数化查询,文本框中的文本也可以“注入”到查询中。如果他们(在CBM_文本框5中)加上“Canton;放下桌上联系人列表“谢谢你J.Vermeire和谢谢你Ray K!”!你们真的帮了我大忙!这是我们在c-Sherp中的第一个个人类项目!最后,它的工作与您的所有帮助,我将提交它!非常感谢“Olivier Jacot Descombes”你真的帮助了我!这是我们在c-Sherp中的第一个个人类项目!终于有你的帮助了!干得好!:)非常感谢“Olivier Jacot Descombes”你真的帮助了我!这是我们在c-Sherp中的第一个个人类项目!终于有你的帮助了!干得好!:)