这是我在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的断开模型 - 我只是在更新数据库时对对象范围感到困惑.如果有人能给我一些关于这个场景的最佳实践的指示,我将不胜感激!
提前致谢...
1) 您不需要相同的 DataAdapter,但如果您创建一个新的 DataAdapter,它必须使用相同的查询作为其基础。
2) 如果连接关闭,DataAdapter 将打开其连接。在这种情况下,它将在完成后再次关闭连接。如果连接已经打开,即使连接完成后也会保持连接打开状态。
通常你会像你的例子一样工作。创建一个 Conneciton 和一个 DataAdapter,填充一个 DataTable,然后处理 Connection 和 DataAdapter。
对您的代码的两条注释:
尝试将您的代码更改为:
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 :-)
| 归档时间: |
|
| 查看次数: |
3087 次 |
| 最近记录: |