首页 > 其他分享 >DataAdapter的Fill方法的连接是否会自动关闭的测试

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

时间:2023-11-16 14:04:16浏览次数:27  
标签:system appendtext textbox1 DataAdapter 关闭 Fill conn fill

关于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

相关文章

  • 强制关闭xxx进程
    目录基本语法举个......
  • UAC(用户账户控制)的关闭
    AC旨在帮助Windows用户默认使用标准用户权限,UAC包括多种技术来实现此目标。很多时候UAC机制的弹窗非常的烦人,我们可以关闭UAC。一种是临时“关闭”,仅仅是不再弹窗,达成“关闭”UAC的效果。方法是打开『控制面板』->『所有控制面板项』->『安全和维护』,在此界面下找到『更改用......
  • van-dialog弹窗异步关闭-校验表单
    van-dialog弹窗异步关闭有时候我们需要通过弹窗去处理表单数据,在原生微信小程序配合vant组件中有多种方式实现,其中UI美观度最高的就是通过van-dialog嵌套表单实现。通常表单涉及到是否必填,在van-dialog的确认事件中直接return是无法阻止对话框关闭的,你需要通过异步关闭对话框的......
  • Error: Component series.liquidFill not exists. Load it first.
    Error:Componentseries.liquidFillnotexists.Loaditfirst. 场景:使用水球图时,报错:Error:Componentseries.liquidFillnotexists.Loaditfirst.解决办法:1、先检查是否安装了echarts和echarts-liquidfill(注:echarts4.+的版本对应echarts-liquidfill2.+的版本)npmin......
  • input type=tel 控制输入数字点击数字键盘的回车确认无反应,无法关闭数字键盘
    input事件总结:1、onfocus当input获取到焦点时触发2、onblur当input失去焦点时触发,注意:这个事件触发的前提是已经获取了焦点再失去焦点的时候才会触发该事件,用于判断标签为空3、onchange当input失去焦点并且它的value值发生变化时触发4、onkeydown按下按键时的事件触发5......
  • win10关闭讲述人、粘滞键功能的快捷键启动
    简单记录下在win10关闭讲述人、粘滞键快速启动的快捷键,这两个功能对正常人没什么用。误触发很烦。禁用讲述人按windows键,输入“轻松使用设置”,点“讲述人”,如下图取消讲述人开关和快捷键的勾选。禁用粘滞键按windows键,输入“轻松使用设置”,左侧下滑找到点开“键盘”,如下图取......
  • 微软允许OEM对Win10不提供关闭Secure Boot
    用户可能将无法在Windows10电脑上安装其它操作系统了,微软不再要求OEM在UEFI中提供的“关闭SecureBoot”的选项。微软最早是在DesignedforWindows8认证时要求OEM的产品必须支持UEFISecureBoot。SecureBoot被设计用来防止恶意程序悄悄潜入到引导进程。问题是如果其它的......
  • centos7 关闭swap分区
    目录1.查看swap分区信息2.关闭swap分区 1.查看swap分区信息通过free-h命令查看[root@k8s-master-02~]#free-htotalusedfreesharedbuff/cacheavailableMem:1.8G131M1.4G8.9M212M1.5GSwap:2.0G0B2.0G 2.关闭swap分区2.1临时关闭( swapoff-a )[r......
  • c# 使用自写命令来一键控制无线和本地网络的开启关闭
    程序需要用管理员的身份运行,使用WMI(WindowsManagementInstrumentation)使用ManagementObjectSearcher对象获取适配器信息使用ManagementObject的InvokeMethod方法执行相应操作代码如下staticvoidMain(string[]args){Console.ForegroundColor=......
  • 朴素贝叶斯分类的简单解释 [已关闭]
    内容来自DOChttps://q.houxu6.top/?s=朴素贝叶斯分类的简单解释[已关闭]我发现很难理解朴素贝叶斯的过程,我想知道是否有人能够用简单的逐步过程以英语解释它。我理解它通过发生的次数进行概率比较,但我不知道训练数据如何与实际数据集相关联。请给我解释一下训练集扮演的角......