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

Mar*_*own 7 ado.net

这是我在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();
Run Code Online (Sandbox Code Playgroud)

假设我将生成的DataTable绑定到网格控件,并允许我的用户编辑网格内容.现在,当我的用户按下"保存"按钮时,我需要调用此代码:

adapter.Update(dt);
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

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

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

我理解ADO.NET的断开模型 - 我只是在更新数据库时对对象范围感到困惑.如果有人能给我一些关于这个场景的最佳实践的指示,我将不胜感激!

提前致谢...

Run*_*tad 3

1) 您不需要相同的 DataAdapter,但如果您创建一个新的 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);    
}
Run Code Online (Sandbox Code Playgroud)

请注意,我在 using 子句之外定义了 DataTable。这是为了确保当您离开 usings 时该表在范围内。另请注意,您不需要对 DataAdapter 进行 Dispose 调用,也不需要对 Connection 进行 Close 调用。当您离开使用时,两者都会隐式完成。

哦。欢迎来到 SO :-)