使用C#中的多个文本框更新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

我的代码引发此异常:

UPDATE语句中的语法错误

我的SQL语法有什么问题?我怎么修理它

我正在使用VisualStudio2010和Access数据库。这是我的密码:

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中的第一个个人类项目!终于有你的帮助了!干得好!:)