【问题标题】:Adding New Row Data from C1FlexGrid to Access 97 .mdb Database C#从 C1FlexGrid 添加新行数据到 Access 97 .mdb 数据库 C#
【发布时间】:2013-04-16 21:25:30
【问题描述】:

作为快速背景知识,我是数据库编程的初学者,如果我在这里发布的任何内容没有意义或完全愚蠢,请原谅我。

我正在尝试制作一个 WinForm 应用程序,它允许用户连接到他们选择的 .mdb Access 97 数据库,允许用户进行更改(例如,在 WinForm 上添加新数据行,然后将其应用于原始 .mdb 数据库),并根据需要在不同的 .mdb Access 97 数据库中同步这些更改。

让您了解我目前的情况。我已使用 C# 成功连接到 .mdb Access 97 数据库,并将数据库表内容输出到 DataSet 对象中,然后我将其转储到 C1FlexGrid 中(代码稍后会跟随)。现在在任何人提及之前,我无法将数据库文件升级到更新版本,因此它必须保留为 Access 97 版本文件。

这是我用来连接的代码:

dbConnection  = new OleDbConnection(@"Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + path);
dbCommand     = new OleDbCommand("SELECT * from MAIN", dbConnection);
dbDataAdapter = new OleDbDataAdapter(dbCommand);

dbDataSet = new DataSet("MasterLanguageDB");
dbConnection.Open();
dbConnectionIsOpen = true;

// connection is successful, unlock connected mode features
EnterDatabaseConnectedMode();

dbDataAdapter.Fill(dbDataSet);
flexGrid.DataSource = dbDataSet.Tables[0];

我的问题是:我现在用 .mdb 数据库文件内容填充的 C1FlexGrid 是否“绑定”到 .mdb 文件?因为 1,我没有按照 Microsoft 建议的方式绑定数据源,即通过 Visual Studio 2008 中的“添加数据源”向导进行绑定(因为用户可以连接到他们选择的任何 .mdb 数据库——而不仅仅是一个)和 2,我希望对 C1FlexGrid 所做的任何更改都应用于原始数据库。

如果答案是否定的,我该如何创建该“绑定”或将行添加到数据库中?

【问题讨论】:

    标签: c# oledb ms-access-97


    【解决方案1】:

    Dataset 或 DataTable 等 ADO.NET 类是断开连接的对象。
    这意味着他们不能直接更新数据库。

    OleDbDataAdapter 有一个名为Update 的方法,它负责将所有修改后的数据发送到数据库。 因此,假设您在某处有一个按钮来保存更改,那么您需要调用 click 事件

      dbDataAdapter.Update(dbDataSet);
    

    但是,这要求您将对象实例保持在类全局级别
    还有一点是需要准备dbDataAdapter.InsertCommand, dbDataAdapter.UpdateCommand and dbDataAdapter.DeleteCommand

    这些命令可以在您设置 SelectCommand 后使用OleDbCommandBuilder 的实例简单地创建

      dbDataAdapter = new OleDbDataAdapter(dbCommand);
      OleDbCommandBuilder cb = new OleDbCommandBuilder(dbDataAdapter);
    

    【讨论】:

    • 嗨,史蒂夫,感谢您的意见。真的很翔实!所以在这里帮助我,让我了解更多。我的 WinForm 上的新记录条目是通过在两个文本框中键入然后单击添加记录按钮来完成的。所以单击添加记录按钮应该调用将新数据行添加到 DataSet 而不是 C1FlexGrid 的操作是否正确? (因为我将调用 dbDataAdapter.Update(dbDataSet) )
    • 我不知道 C1FlexGrid 的内部工作原理,但是,如果它像网络世界中的所有其他网格一样工作,那么您将新数据添加到网格(如何添加行和填充单元格应在其文档中描述)。此时,网格应将此新行传递给绑定的 DataTable 对象。在更新时,DataSet 包含带有添加行的表。您可以检查调用ds.Tables[0].GetChanges(DataRowState.Added); 的调试器。它返回 state=Added 的 DataRow 数组。当然是在调用 Update 方法之前。
    • 史蒂夫,您是天赐之物!非常感谢你的帮助!我希望我能更多地了解如何将我的思路从对项目的具体操作迁移到更抽象的意义上,因为在整个过程中,我在每次醒来和转弯时都直接访问数据库。不知道我什么时候会弄清楚如何采取另一种方法......但尽管如此,你提供的东西给了我我需要的洞察力。我像你说的那样做了OleDbCommandBuilder,几乎把dbDataAdapter.Update(dbDataSet)放在任何地方。我现在可以看到 C1FlexGrid 所做的更改。
    • 很高兴能帮上忙,继续努力,迟早会变得自然
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2011-03-15
    相关资源
    最近更新 更多