SqlCeException未处理

时间:2013-10-18 07:26:34

标签: c# sql exception ado.net sql-server-ce

在尝试更新我的数据库时,我遇到了这个例外:

  

解析查询时出错:[令牌行号= 1,令牌行偏移= 28,错误令牌=组]

我的代码如下:

private void btnUpdate_Click(object sender, EventArgs e)
{
    con.Open();          
    string strQuery = "UPDATE test_group SET Main Group = '" + comboBox1.Text + "', Sub Group = '" + richTextBox2.Text + "' WHERE Group Id = '" + richTextBox1.Text + "'";

    System.Data.SqlServerCe.SqlCeCommand cmdSelect = new System.Data.SqlServerCe.SqlCeCommand();
    cmdSelect.Connection = con;
    cmdSelect.CommandType = CommandType.Text;
    cmdSelect.CommandText = strQuery;

    cmdSelect.ExecuteNonQuery();
    updatedb();

    con.Close();
}

Plz帮助我。 提前感谢你的帮助。

4 个答案:

答案 0 :(得分:4)

GROUPreserved keyword,您需要将它们括在括号中。具有空格的列也是如此:

UPDATE test_group SET [Main Group] = @group, [Sub Group] = @subGroup ...

但是你应该使用sql-parameters来阻止sql-injection

using (var con = new SqlCeConnection("ConnectionString"))
{ 
    string strQuery = @"UPDATE test_group SET [Main Group] = @group, 
                                              [Sub Group]  = @subGroup 
                        WHERE [Group Id] = @groupID";
    using(var command = new SqlCeCommand(strQuery, con))
    {
        command.Parameters.AddWithValue("@group", comboBox1.Text);
        command.Parameters.AddWithValue("@subGroup", richTextBox2.Text );
        command.Parameters.AddWithValue("@groupID", richTextBox1.Text );
        con.Open();
        int updated = command.ExecuteNonQuery();
    }
}

请注意,AddWithValue需要从值中检测类型,因此如果Group Id是int,则应首先使用int.Parse

旁注:使用带空格的列名称当然不是一个好习惯。总是要使用[]是一种痛苦,不是吗?

答案 1 :(得分:2)

主要问题是包含空格的字段名称。在这种情况下,您的字段名称应该用方括号括起来,但是您还有另一个危险的问题。连接字符串以构建sql命令是一种非常糟糕的做法,可能导致称为Sql Iniection的危险安全问题,更不用说如果一个或多个字符串包含单引号,则非常可能出现语法错误。执行查询的正确方法是使用参数化查询

string strQuery = "UPDATE test_group SET [Main Group] = @grp, [Sub Group] = @sub " + 
                  "WHERE [Group Id] = @grpID";
using(SqlCeCommand cmdSelect = new System.Data.SqlServerCe.SqlCeCommand(strQuery, con))
{
   cmdSelect.Parameters.AddWithValue("@grp", comboBox1.Text);
   cmdSelect.Parameters.AddWithValue("@sub", richTextBox2.Text);
   cmdSelect.Parameters.AddWithValue("@grpID", richTextBox1.Text);
   cmdSelect.ExecuteNonQuery();
   updatedb();
   con.Close();
}

我真的建议您更改删除空格的字段名称(如果可能在应用程序的上下文中),因为每次尝试使用此表时都会遇到此类问题

答案 2 :(得分:1)

您的列名中有空格,您应该在它们周围添加大括号:[column name]

答案 3 :(得分:-1)

请试试这个

 string strQuery = "UPDATE test_group SET [Main Group] = '" + comboBox1.Text + "', Sub Group = '" 
  + richTextBox2.Text + "' WHERE Group Id = '" + richTextBox1.Text + "'";

Main和Group之间有一个空格