关于vs2005中dataadapter的fill方法的连接是否会自动关闭的测试
此示例中所示的代码不显式打开和关闭 Connection。如果 Fill 方法发现连接尚未打开,它将隐式地打开 DataAdapter 正在使用的 Connection。如果 Fill 已打开连接,它还将在 Fill 完成时关闭连接。当处理单一操作(如 Fill 或 Update)时,这可以简化您的代码。但是,如果您在执行多项需要打开连接的操作,则可以通过以下方式提高应用程序的性能:显式调用 Connection 的 Open 方法,对数据源执行操作,然后调用 Connection 的 Close 方法。应尝试保持与数据源的连接打开的时间尽可能短,以便释放资源供其他客户端应用程序使用。
最初我也相信dbdataadapter.fill 方法关联的connection对象是会自动打开和自动关闭的,可在一次检测后台进程时,
发现我所有的连接都是显式关闭了(除了这个fill方法),但发现,oracle的进程并没有关闭。
一开始以为是oracle的反应时间慢,可是我退出程序时,进程马上就没了,
说明oracle关闭进程的速度是很快的,
那就是fill方法的问题。
好了,下面就开始讨论吧。
在msdn中有一段话是关于dbdataadapter.fill 方法 (dataset)的说明:
原文如下:
fill 方法使用 select 语句从数据源中检索数据。
与 select 命令关联的 idbconnection 对象必须有效,但不需要将其打开。
如果调用 fill 之前 idbconnection 已关闭,
则将其打开以检索数据,然后再将其关闭。
如果调用 fill 之前连接已打开,它将保持打开状态。
网址是:
http://msdn2.microsoft.com/zh-cn/library/zxkb3c3d(vs.80).aspx 这段话的意思很显然,
1、在调用fill方法时,如果idbconnection 对象已经是打开的,那么,保持打开状态,
在执行完fill方法后,再将其关闭。
2、如果调用fill方法时,如果idbconnection 对象是关闭状态的,则将其打开以检索数据,然后再将其关闭。
也就是说在调用fill方法时,是检索完数据后,就会自动关闭。
下面测试说明并非如此,在执行检索数据后,并没有关闭。不知道是我的测试方法有问题,还是vs2005的bug。
欢迎大家发言。
一、下面的代码很简单,就是打开执行fill方法,然后看connection的状态:
private void button2_click(object sender, eventargs e)
{
string cmdtext = "select * from bill_user";
this.textbox1.clear();
if (conn.state != connectionstate.open)
{
this.textbox1.appendtext("原连接是关闭的,现在打开连接成功");
conn.open();
}
this.textbox1.appendtext("\n\r\n\r");
system.data.oledb.oledbdataadapter adapter = new system.data.oledb.oledbdataadapter(cmdtext, this.conn); dataset ds = new dataset();
adapter.fill(ds, "dt");
if (this.conn.state != connectionstate.open)
{
this.textbox1.appendtext("执行完fill命令后的状态是关闭的");
}
else
{
this.textbox1.appendtext("执行完fill命令后的状态是打开的");
}
this.textbox1.appendtext("\n\r\n\r");
this.timer1.start();
}
测试结果: connection对象并没有关闭。
二、测试oracle多长时间会关闭fill方法打开的连接:
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.text;
using system.windows.forms;
using system.data.oledb;namespace 测试进程
{
public partial class form1 : form
{
public form1()
{
initializecomponent();
}
oledbconnection conn = new oledbconnection(oracletask.orahelper.conn_string_non_dtc);
/// <summary>
/// 测试连接多长时间oracle会自动释放
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_click(object sender, eventargs e)
{
conn.open();
this.textbox1.clear();
this.textbox1.appendtext("打开连接成功");
this.timer1.start();
// messagebox.show("");
// conn.close(); }
private void timer1_tick(object sender, eventargs e)
{
this.textbox1.appendtext("\n\r\n\r");
if (this.conn.state == connectionstate.open)
{
this.textbox1.appendtext("连接打开"+system.datetime.now.tolongtimestring());
}
else
{
this.textbox1.appendtext("连接关闭" + system.datetime.now.tolongtimestring());
this.timer1.stop();
} }
private void button2_click(object sender, eventargs e)
{
string cmdtext = "select * from bill_user";
this.textbox1.clear();
if (conn.state != connectionstate.open)
{
this.textbox1.appendtext("原连接是关闭的,现在打开连接成功");
conn.open();
}
this.textbox1.appendtext("\n\r\n\r");
system.data.oledb.oledbdataadapter adapter = new system.data.oledb.oledbdataadapter(cmdtext, this.conn); dataset ds = new dataset();
adapter.fill(ds, "dt");
if (this.conn.state != connectionstate.open)
{
this.textbox1.appendtext("执行完fill命令后的状态是关闭的");
}
else
{
// this.conn.close();
this.textbox1.appendtext("执行完fill命令后的状态是打开的");
}
this.textbox1.appendtext("\n\r\n\r");
this.timer1.start();
} }
}
在上面的基础上添加一个timer控件,看fill打开打开的连接多长时间能关闭。
测试结果:
10分钟后,连接仍是打开的。
本次测试环境:oracle 817+windows xp
http://msdn.microsoft.com/zh-cn/library/bh8kx08z(VS.80).aspx
标签:system,appendtext,textbox1,DataAdapter,关闭,Fill,conn,fill From: https://blog.51cto.com/emanlee/8418844