【问题标题】:Inserting not committed to database插入未提交到数据库
【发布时间】:2011-03-21 01:30:31
【问题描述】:

我的 DataSet 无法正常工作。

我在后台有一个 MDB 数据库,并从中创建了一个数据集。现在我创建了一个新方法,让我可以在表中创建一个新用户。

但是当我调用它时,什么也没有发生。没有例外,没有错误,我什至得到“1”作为受影响的行数返回。但是当我查看数据库时,没有添加任何用户。

我有一种感觉,我想以某种方式告诉 DataSet 我想操作数据库本身,而不仅仅是内部 DataSet……我该如何实现呢?

// DataSet1 uses the connection to the Database.mdb
// Created by the Designer

// The Users table has 3 columns, id, name and password

DataSet1 set = new DataSet1();
UsersTableAdapter adap = new UsersTableAdapter();
DataSet1.UsersRow row = set.Users.AddUsersRow("asd", "asd");
int count = adap.Insert("das", "das");
MessageBox.Show(row.RowState.ToString() + ": " + count.ToString());
count = adap.Update(set.Users);
set.AcceptChanges();
MessageBox.Show(row.RowState.ToString() + ": " + count.ToString());

// The Messagebox shows: "Added: 1"
// The second one: "Unchanged: 1"

MessageBox.Show(set.Users.Rows.Count.ToString());

// Returns "2"...

【问题讨论】:

  • 你能发布一些DataSet插入方法的示例代码并调用它吗?
  • 其实没什么可看的,我在 Data.xsd 的设计器中创建了该方法作为适配器的查询,并在发生事件时调用它。事件被触发,我检查了,值不为空也不为 null ...
  • 如果内存够用,您需要在DataSet 或关联的适配器上调用Update。
  • 这样做了,什么都没发生...

标签: c# ms-access dataset oledb


【解决方案1】:

不太了解您的代码,请尝试从 MSDN 阅读此操作方法:

http://msdn.microsoft.com/en-us/library/ms233812(v=VS.80).aspx

更新:对于数据集,通常会发生的情况(假设数据集已被填充)是在代码中添加、编辑或删除行。这些行将具有相应的RowState,表示它们已添加、已编辑、已删除或未修改。在.Update 期间,关联的表适配器,连同关联的插入/更新/删除命令,将迭代行并根据行的状态在给定的行上执行命令。当行被迭代时,.AcceptChanges 被调用,将行状态恢复为默认值。

如果您在更新之前致电AcceptChanges,则不会发生任何事情。每行的RowState 将丢失,因此.Update 将没有执行数据库更新所需的信息。如果您有自定义代码将其全部包装在事务中,那么您需要确保提交事务。

在您的示例中,您似乎暗示您使用的是表适配器而不是数据集本身。我建议不要这样做 - 表适配器通常将方法放在您应该使用的数据集中的表上。

更新 2: 代码在我看来没问题,尽管您不需要在适配器上调用 Insert,或在更新后调用 AcceptChanges(后者是自动完成的)。这使我相信您的插入命令 SQL 中存在错误 - 尝试提取命令使用的 SQL 并针对数据库手动运行它。

更新 3:以下代码对我来说可以正常工作:

static void Main(string[] args)
    {
        db1DataSet set = new db1DataSet();
        set.Users.AddUsersRow("asd", "asd");

        foreach (DataRow row in set.Users.Rows)
        {
            object foo = row.RowState; // Confirm row state in debugger.
        }

        UsersTableAdapter adap = new UsersTableAdapter();
        adap.Update(set.Users);

        Console.Read();
    }

【讨论】:

  • 我做了完全相同的事情,但它仍然没有保存任何更改。我可以完美地使用 select 方法,但不能改变任何东西......
  • 您是否在使用任何交易?你有任何例外吗?在尝试更新 DataSet 之前是否调用 .AcceptChanges?
  • INSERT INTO `Users` (`name`, `password`) VALUES (?, ?) 那是适配器的“插入”查询的 SQL。如果我运行该数据库,则可以轻松添加值...
  • 好吧,我上传了一个显示错误的小TestApp...如果您能设法查看一下,我将非常感谢...vault.apoy2k.de/TestApp.zip
  • 好的,现在这真的很尴尬,但我发现了错误 - 这是我的愚蠢。我在项目资源管理器中检查了文件,而不是在编译时复制到调试目录的文件。一切都以正确的方式插入。不过,感谢您的帮助...
猜你喜欢
  • 2015-07-04
  • 2017-06-07
  • 2019-06-18
  • 2012-12-15
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 2020-05-15
相关资源
最近更新 更多