【问题标题】:Help with DataAdapter - DB doesn't update?帮助 DataAdapter - DB 不更新?
【发布时间】:2010-12-05 00:31:40
【问题描述】:

我有一个数据适配器。当我在运行时检查函数时,我看到了更改,但数据库中没有任何反应。我该如何调试?出了什么问题?

OleDbDataAdapter adapter = new OleDbDataAdapter();
string queryString = "SELECT * FROM tasks";
OleDbConnection connection = new OleDbConnection(cn.ConnectionString);
adapter.SelectCommand = new OleDbCommand(queryString, connection);
OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);

connection.Open();

adapter.Fill(ds.Tables["Tasks"]);                      

adapter.Update(ds);

return ds;

【问题讨论】:

  • 在您的代码示例中,我没有看到数据有任何变化?
  • 我在这个函数中得到的ds是修改后的。可以吗?

标签: c# ado.net dataset


【解决方案1】:

数据库中没有发生任何事情,因为您正在运行 SELECT 查询。你期望发生什么?

【讨论】:

  • 我使用了命令生成器,我认为不需要编写其他命令。如果我错了请解释
  • 您是对的,但是,您必须在数据集填充适配器之后(而不是之前)修改数据集,以便命令生成器实际检测更改。
【解决方案2】:

好吧,除非你剪掉很多代码,否则你不会改变数据集中的任何东西。

你想达到什么目的?

在这里,您正在选择一些数据,用它填充数据集,然后将 未更改 数据集放回数据库中。

在调用 adapter.Update(ds) 之前,您应该先更改数据集本身的内容

干杯, 弗洛里安

【讨论】:

  • 我得到这个函数的 ds 是在更改之后(我在运行时看到它,当我调试时)
【解决方案3】:

您正在通过 SelectCommand 选择数据。如果要更新数据,则需要运行 UpdateCommand。

【讨论】:

  • 你能解释一下我该怎么做吗?
【解决方案4】:

我假设您没有发布完整的源代码,因为它看起来好像您没有修改数据集。但是,我只是稍微调整了您的代码(请参阅我的 cmets)。

希望这会有所帮助...

string queryString = "SELECT * FROM tasks";
OleDbConnection connection = new OleDbConnection(cn.ConnectionString);
connection.Open(); // open connection first

SqlCommand cmd = new SqlCommand(queryString, connection);
OleDbDataAdapter adapter = new OleDbDataAdapter(cmd); // use the cmd above when instantiating the adapter
OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);

adapter.Fill(ds.Tables["Tasks"]);                      

// Modify your dataset here.
// Don't call AcceptChanges() as this will prevent the update from working.

adapter.Update(ds);

connection.Close(); // Close connection before ending the function

return ds;

这应该允许 OleDbCommandBuilder 通过自动编写数据库更新脚本来完成它的工作。

【讨论】:

  • 函数获得的 ds ,已经在更改之后。也许我不需要填充?我更改了其他层中的 ds 并将更改 ds 发送到此函数。我查看了运行时,发现更改已在 ds 中完成
  • 您需要找到一种方法在填充之后和更新之前进行更改(我在其中添加了该评论)。这是 DataAdapter、CommandBuilder 和 Update 魔法发生的唯一方式。
  • 我认为你不需要做connection.open(),它会被数据适配器自动处理.. :)
【解决方案5】:

据我所知,您实际上并未更改任务表的任何内容。当您调用 adapter.Fill 时,您会使用数据库中的记录填充空数据集。然后您调用 adapter.Update 而不更改数据集中的任何记录。 update 命令仅在数据集 > 数据表 > 数据行被编辑并标记为脏时执行更改。

【讨论】:

  • ds 被标记为脏。当我填写时,ds 是否再次被填充?我在这个函数中得到的 ds 是 after 改变
【解决方案6】:

您只是指定了选择命令。您还需要指定插入命令...即: DataAdapter.InsertCommand = new OleDbCommand....

【讨论】:

  • 即使我使用命令生成器?起初我做了,但迷失了所有参数的东西......你有样品吗?只看到sqlserver,它不像访问一样
  • 不,当您使用命令生成器时,这不是必需的。但是......关于命令生成器的某些事情可能会让您感到困惑。详情见我的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 2016-01-31
  • 2010-11-19
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 2019-07-13
相关资源
最近更新 更多