关于VS2005中DataAdapter的Fill方法的连接是否会自动关闭的测试

来源:互联网 发布:java多线程的应用场景 编辑:程序博客网 时间:2024/04/28 12:28

关于VS2005中DataAdapter的Fill方法的连接是否会自动关闭的测试

更多文章参见:

http://hi.csdn.net/xjzdr/profile

最初我也相信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

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 京东购物非自营货没到降价了怎么办 实体店商家不承认卖的是假货怎么办 衣服上的装饰圆扣掉下来了怎么办 没在京东买东西却收到退款怎么办 小米分期付款买的手机不要了怎么办 唯品会在线支付后商品有问题怎么办 红米手机把时间删了怎么办 红米桌面上的时间删了怎么办 华为手机玩游戏老是闪退怎么办 别人家无线网距离太远信号差怎么办 微信公众号交话费交错了怎么办 手机卡里还有话费销户的话怎么办 号码忘记交话费变成空号怎么办 多屏互动没办法隔空播放怎么办? 一个人长期受一件事的打击怎么办 物流信息显示快递被别人签收怎么办 现在打工的人被领导骂怎么办 加密狗丢了打不开软件了怎么办 手机微信可以打开网页打不开怎么办 手机中国网打开网速慢该怎么办 在韩国用中国软件网速特别慢怎么办 淘宝退货快递一直没显示到货怎么办 高二美术生集训时文化课怎么办 唯品会不支持7天无理由退货怎么办 sy来4am了孤存怎么办 淘宝网买的电器坏了怎么办 在闲鱼上买的电器是坏的怎么办 打开时全屏不知变成小屏怎么办 苹果6s原装数据线不充电怎么办 vivo手机安卓系统耗电快怎么办 电视机机顶盒插了电源开不了怎么办 苹果手机更新系统后老是闪退怎么办 16g苹果6s手机内存不足怎么办 苹果以前浏览器页面忽然没了怎么办 白衬衣被别的衣服染了怎么办 把宝贝标题改了没访客了怎么办 微信公众号看不到评论时间了怎么办 微店退款退货买家发空快递怎么办 微信二维码收款顾客少付款了怎么办 江西高考二本差5分上线怎么办 湖南文科考生二本上线差两分怎么办