【问题标题】:how to save the DataSet after making changes to the database?更改数据库后如何保存DataSet?
【发布时间】:2023-12-31 03:55:01
【问题描述】:

如果我有一个名为 myDs 的数据集,并且我通过在如下循环中直接访问来编辑其中的一个字段:

for (int i = 0; i < myDS.Tables[TableName].Rows.Count; i++)
{

    //some function or web method to get the id value of the record being updated
    int n = getNewNumber();

    //updating the dataset record according to some condition
    if (n == 0)
    {
        myDS.Tables[TableName].Rows[i]["id"] = n;
        myDS.Tables[TableName].Rows[i]["description"] = "some data";
    }
    else
    {
        myDS.Tables[TableName].Rows[i]["id"] = n;
        myDS.Tables[TableName].Rows[i]["description"] = "new data";
    }
}

我如何在数据库中完成这些更改,因为当我执行 databind() 时可以在 GridView 中看到它,但数据库不受影响,我尝试使用 OdbcDataAdapter 和 OdbcCommandBuilder 的填充和更新方法?

【问题讨论】:

  • 什么数据库以及您使用的是哪个版本??
  • 数据库是sybase,我使用odbc进行数据库连接,所以数据库引擎本身并不重要,因为使用了ODBC。

标签: c# ado.net dataset odbc dataadapter


【解决方案1】:

由于是 odbc,你可以使用OdbcDataAdapter;然后调用:

adapter.Update(myDS.Tables[TableName]);

免责声明:就个人而言,我从不将 DataSet 用于....任何事情。 YMMV。

【讨论】:

  • 我这样做了,但是数据库没有根据新的更新而改变,我的更新不能写为更新命令,因为数据应该在循环中更新,因为主键 (id) 也是更新了,我不能在 Where 子句中使用它。
【解决方案2】:

尝试本文中显示的 TableAdapter.Update 过程:How to: Update Records in a Database

另外,请确保您不仅拥有对尝试连接的数据库的必要访问权限,而且还拥有更新所需表中记录的权限。您可能遇到阻止代码更新的 SQL Server 配置问题。

【讨论】:

  • 这个链接很好,但我发现更新语句中的问题,因为我不应该更改主键,因为我在 set 子句和 where 子句中都使用了它。
【解决方案3】:

你应该在循环后输入两行

myDS.AcceptChanges();
adapter.Update(myDS.Tables[TableName]);

【讨论】:

  • 但是适配器在哪里呢?正如我在代码中看到的,OP 只使用 DataSet。如果适配器不可用,或者内部适配器不可用怎么办? (DataSet 可能由 Visual Studio 自动生成,例如在将 ListBox 绑定到新数据源时)。如果只有 DataSet 对象可用,如何保存数据库?