gpt4 book ai didi

连接和 DataAdaptor 对象范围的 ADO.NET 最佳实践

转载 作者:行者123 更新时间:2023-12-04 12:44:22 25 4
gpt4 key购买 nike

这是我在 StackOverflow 上的第一篇文章,所以请温柔...

我对 ADO.NET 的对象范围有一些疑问。

当我连接到数据库时,我通常使用如下代码:

OleDbConnection conn = new OleDbConnection("my_connection_string");
conn.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * from Employees", conn);
OleDbCommandBuilder cb = new OleDbCommandBuilder(adapter);
DataTable dt = new DataTable();
adapter.Fill(dt);
conn.Close();
conn.Dispose();

假设我将生成的 DataTable 绑定(bind)到一个网格控件并允许我的用户编辑网格内容。现在,当我的用户按下保存按钮时,我需要调用此代码:
adapter.Update(dt);

以下是我的问题:

1)我是否需要保留我最初加载数据表时创建的适配器对象,或者我可以在保存按钮单击事件中创建另一个适配器对象来执行更新?

2)如果我确实需要保留原始适配器对象,我是否还需要保持连接对象可用并打开?

我了解 ADO.NET 的断开连接模型 - 当需要更新数据库时,我只是对对象范围感到困惑。如果有人能给我一些关于这种情况的最佳实践的建议,我将不胜感激!

提前致谢...

最佳答案

1) 您不需要相同的 DataAdapter,但如果您创建一个新的,它必须使用相同的查询作为其基础。

2) 如果连接关闭,DataAdapter 将打开其连接。在这种情况下,它会在完成后再次关闭连接。如果连接已经打开,即使完成后连接也会保持打开状态。

通常你会像你的例子一样工作。创建一个 Conneciton 和一个 DataAdapter,填充一个 DataTable,然后处理掉 Connection 和 DataAdapter。

对您的代码的两条评论:

  • 您在这里不需要 CommandBuilder,因为您只进行选择。只有当您想自动生成插入、更新或删除语句时,才需要命令生成器。在这种情况下,您还需要从 CommandBuilder 手动设置 DataAdapter 上的 InsertCommand、UpdateCommand 或 DeleteCommand。
  • 第二。您应该使用 Using 子句,而不是手动调用 Dispose。即使抛出异常,它也确保您的对象将被处理掉。

  • 尝试将您的代码更改为:
    DataTable dt = new DataTable();
    using (OleDbConnection conn = new OleDbConnection("my_connection_string"))
    using (OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * from Employees", conn))
    {
    adapter.Fill(dt);
    }

    请注意,我在 using 子句之外定义了 DataTable。当您离开 usings 时,需要这样做以确保该表在范围内。另请注意,您不需要 DataAdapter 上的 Dispose 调用或 Connection 上的 Close 调用。当您离开 usings 时,两者都是隐式完成的。

    哦。欢迎来到 SO :-)

    关于连接和 DataAdaptor 对象范围的 ADO.NET 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/594053/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com