0

在尝试更新我的数据库时,我收到了这个异常:

解析查询时出错:[Token line number = 1,Token line offset = 28,Token in error = Group]

我的代码如下:

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

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

4

4 回答 4

4

GROUP保留关键字,您需要将它们括在括号中。对于带有空格的列也是如此:

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首先使用。

旁注:使用带空格的列名肯定不是一个好习惯。总是不得不使用 [ ] 很痛苦,不是吗?

于 2013-10-18T07:29:54.480 回答
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();
}

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

于 2013-10-18T07:29:45.260 回答
1

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

于 2013-10-18T07:32:04.920 回答
-1

请试试这个

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

Main 和 Group 之间有一个空格

于 2013-10-18T07:31:14.250 回答