专栏' [小组]'不属于表格

时间:2018-03-25 07:05:06

标签: c# sql-server ado.net

使用旧版SQL Server表,它显示了一个名为[Group]的可选col,如果完全从代码中省略,则insert命令运行正常。问题与特定的col相关。

我有什么:

daCust.InsertCommand = new SqlCommand("insert into dbo.TimeRouteTest ([Group], Route, Step_1) values (@Group, @Route, @Step_1)", con);

daCust.InsertCommand.Parameters.Add(new SqlParameter("[Group]", SqlDbType.Int, 4, "[Group]"));
daCust.InsertCommand.Parameters.Add(new SqlParameter("Route", SqlDbType.NVarChar, 100, "Route"));
daCust.InsertCommand.Parameters.Add(new SqlParameter("Step_1", SqlDbType.NVarChar, 50, "Step_1"));

然后

DataRow newRow = ds.Tables[0].NewRow();
newRow["[Group]"] = Convert.ToInt32(myGroup);
newRow["Route"] = mroute;
newRow["Step_1"] = mStep_1;

注意:我预先处理这些数据以确保它干净,我删除单引号等.mroute和mStep_1只是保存从另一个函数传递的文本数据的局部变量。 myGroup也是一个从webservice传递值的本地var。然后我跟进:

ds.Tables[0].Rows.Add(newRow);
daCust.Update(ds);

如果我注释掉[group]行,则命令正常。有关为什么会失败以及如何解决问题的任何帮助?我知道" group"是一个保留的关键字,但添加括号应该可以使它可用,或者我认为。有趣的是,我可以查询此表,并从其他行获取[group] col的值,因此我知道 col是真的存在。只是不确定为什么我无法在插入时找到它...

编辑:如果我使用此代码,它可以正常工作:

daCust.InsertCommand = new SqlCommand("insert into dbo.TimeRouteTest (Route, Step_1) values (@Route, @Step_1)", con);

daCust.InsertCommand.Parameters.Add(new SqlParameter("Route", SqlDbType.NVarChar, 100, "Route"));
daCust.InsertCommand.Parameters.Add(new SqlParameter("Step_1", SqlDbType.NVarChar, 50, "Step_1"));

DataRow newRow = ds.Tables[0].NewRow();
newRow["Route"] = mroute;
newRow["Step_1"] = mStep_1;

ds.Tables[0].Rows.Add(newRow);

daCust.Update(ds);

这几乎将问题与名为[Group]的特定col相隔离,并且没有我认为可以尝试的括号或其他组合将使其工作。从TimeRouteTest执行select *然后从dr [2]中提取值确实有效,这是该col的索引位置。除了报废表并使用更好的col名称,如何解决?好奇的注意,在Visual Studio中查看表定义,它显示col名称为[Group],但如果我查看表中的数据,它只显示Group作为结果中的标题/标签...

编辑:

该行:

daCust.InsertCommand.Parameters.Add(new SqlParameter("[Group]", SqlDbType.Int, 4, "[Group]"));

daCust.InsertCommand.Parameters.Add(new SqlParameter("@Group", SqlDbType.Int, 4, "[Group]"));

daCust.InsertCommand.Parameters.Add(new SqlParameter("@[Group]", SqlDbType.Int, 4, "[Group]"));

全部失败并出现错误:

  

System.ArguementException:Column' [Group]'不属于表格表。

编辑:发现(语法)错误。将我的头撞到墙上3个小时后,以下代码实际上有效:

 daCust.InsertCommand = new SqlCommand("insert into dbo.TimeRouteTest ([Group], Route, Step_1) values (@Group, @Route, @Step_1)", con);

 daCust.InsertCommand.Parameters.Add(new SqlParameter("Group", SqlDbType.Int, 4, "Group"));
 daCust.InsertCommand.Parameters.Add(new SqlParameter("Route", SqlDbType.NVarChar, 100, "Route"));
 daCust.InsertCommand.Parameters.Add(new SqlParameter("Step_1", SqlDbType.NVarChar, 50, "Step_1"));

 DataRow newRow = ds.Tables[0].NewRow();
 newRow["Group"] = Convert.ToInt32(myGroup);
 newRow["Route"] = mroute;
 newRow["Step_1"] = mStep_1;

在声明col名称时,唯一需要括号的地方是insert语句,在其他地方添加它们会导致各种错误。我最好的猜测是Visual Studio在遇到关键字col名称时会通过自动显示col name上的括号而导致部分混淆,因此在导出表定义时,括号似乎是名称的一部分,而实际上它们不是。

只有在使用某些SQL语句且col名称是保留的SQL Server关键字时才需要括号。最重要的是加重了!

1 个答案:

答案 0 :(得分:0)

在声明col名称时,唯一需要括号的地方是insert语句,在其他地方添加它们会导致各种错误。我最好的猜测是Visual Studio在遇到关键字col名称时会通过自动显示col name上的括号而导致部分混淆,因此在导出表定义时,括号似乎是名称的一部分,而实际上它们不是。只有在使用某些sql语句且col名称是保留的sql关键字时才需要括号。正确的代码显示在问题的底部。谢谢GSerg验证。我很抱歉,如果这是一个业余的错误,它让我感到难过了一段时间。

相关问题