当使用新行传递DataRow集合时,更新需要有效的InsertCommand

Ale*_*lex 11 c# database

我想在我的数据库中添加一个新行.这是我的代码:

ds1是我的数据集,da1是我的数据适配器

        dRow = ds1.Tables["localitati"].NewRow();
        dRow[1] = aux1.Replace(" ", "").Replace("-", "").ToLower();
        dRow[2] = aux2.ToLower().Replace(" ", "");
        dRow[3] = aux1;
        dRow[4] = e.X;
        dRow[5] = e.Y;
        ds1.Tables["localitati"].Rows.Add(dRow);

        da1.Update(ds1, "localitati");
Run Code Online (Sandbox Code Playgroud)

da1.update(ds1,"localitati");程序停止并给我错误:" Update requires a valid InsertCommand when passed DataRow collection with new rows."

与数据库的连接有效(我从数据库中检索了信息)

有任何想法吗 ?

Ali*_*eed 10

要添加DataRows:

SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

// add rows to dataset

builder.GetInsertCommand();

//Without the SqlCommandBuilder this line would fail
adapter.Update(dataSet);
Run Code Online (Sandbox Code Playgroud)

说明:

adapter.Update(dataset)将尝试将更改保存dataset到数据库中.它需要:

  1. InsertCommand(如果DataRows已添加)
  2. DeleteCommand(如果DataRows已删除)
  3. UpdateCommand(如果DataRows被修改)

你可以设置一个断点来检查你adapter.InsertCommandadapter.Update()行之前是否设置了它.

要设置这些参数,只需创建一个SqlCommandBuilder与火GetInsertCommand(),GetDeleteCommand()等等.

这应该解决错误:

  1. "当使用已修改的行传递DataRow集合时,更新需要有效的更新命令." 要么
  2. "当使用新行传递DataRow集合时,更新需要有效的插入命令."等.

有关详细信息,请参阅MSDN链接


小智 7

Ques解决了;你的问题:

dRow = ds1.Tables["localitati"].NewRow();
dRow[1] = aux1.Replace(" ", "").Replace("-", "").ToLower();
dRow[2] = aux2.ToLower().Replace(" ", "");
dRow[3] = aux1;
dRow[4] = e.X;
dRow[5] = e.Y;
ds1.Tables["localitati"].Rows.Add(dRow);

da1.Update(ds1, "localitati");
Run Code Online (Sandbox Code Playgroud)

回答:

你必须使用commandBuilder.那是在您使用dataAdapter更新之前(或在创建dataRow之前)添加代码:

SqlCommandBuilder cmdb = new SqlCommandBuilder(da);
Run Code Online (Sandbox Code Playgroud)


Ale*_*rMP 6

您必须为DataAdapter定义InsertCommand

http://www.codeproject.com/KB/database/relationaladonet.aspx

  • 在这种情况下,使用 DataAdapter 是没有意义的。这是一个关于什么是不正确的行为的纯粹例子。非参数化查询、无用的 DataAdapter、未关闭的连接、使用 null 的字符串初始化 - 所有这些都不应该存在于项目中。 (2认同)