C# OleDbDataReader快速数据读取方式(3种)

查询得到OleDbDataReader后,有三种方式支持数据读取,如下:

//方法一**速度中等
OleDbDataReader reader = command.ExecuteReader();
while (reader.Read())
{
  var t1 = reader[0];
}

//方法二**速度最慢
OleDbDataReader reader = command.ExecuteReader();
while (reader.Read())
{
  var t1 = reader["字段名"];
}

//方法三**速度最快
OleDbDataReader reader = command.ExecuteReader();
while (reader.Read())
{
  var t1 = reader.GetValue(0);
}

关于速度的描述,下面我们来简单验证一下。

有一个数据库,数据库中的表TEST有105945行数据,设计一个循环读取来测试他们的读取速度。

测试源码如下:

static void Main(string[] args)
    {
      string connstr = string.Format("Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source={0};", "F:\\2.mdb");
      string s1 = "ID";
      string s2 = "探测号";
      string s3 = "X";
      string s4 = "Y";
      string s5 = "H";
      string sql = string.Format("SELECT {0},{1},{2},{3},{4} FROM 管点表", s1, s2, s3, s4, s5);
      TimeSpan time1 = new TimeSpan();
      TimeSpan time2 = new TimeSpan();
      TimeSpan time3 = new TimeSpan();

      int count = 50;

      //数据库中查询的表有105945行
      for (int i = 0; i < count; i++)
      {
        using (OleDbConnection conn = new OleDbConnection(connstr))
        {
          #region
          conn.Open();
          OleDbCommand command = conn.CreateCommand();
          command.CommandText = sql;
          OleDbDataReader reader = command.ExecuteReader();
          DateTime now = DateTime.Now;
          while (reader.Read())
          {
            var t1 = reader[0]; var t2 = reader[1]; var t3 = reader[2]; var t4 = reader[3]; var t5 = reader[4];
          }
          time1 = time1 + (DateTime.Now - now);
          #endregion
        }
      }
      for (int i = 0; i < count; i++)
      {
        using (OleDbConnection conn = new OleDbConnection(connstr))
        {
          #region
          conn.Open();

          OleDbCommand command2 = conn.CreateCommand();
          command2.CommandText = sql;
          OleDbDataReader reader = command2.ExecuteReader();
          DateTime now = DateTime.Now;
          while (reader.Read())
          {
            var t1 = reader[s1]; var t2 = reader[s2]; var t3 = reader[s3]; var t4 = reader[s4]; var t5 = reader[s5];
          }
          time2 = time2 + (DateTime.Now - now);
          #endregion
        }
      }
      for (int i = 0; i < count; i++)
      {
        using (OleDbConnection conn = new OleDbConnection(connstr))
        {
          #region
          conn.Open();

          OleDbCommand command3 = conn.CreateCommand();
          command3.CommandText = sql;
          OleDbDataReader reader = command3.ExecuteReader();
          DateTime now = DateTime.Now;
          while (reader.Read())
          {
            var t1 = reader.GetValue(0); var t2 = reader.GetValue(1); var t3 = reader.GetValue(2); var t4 = reader.GetValue(3); var t5 = reader.GetValue(4);
          }
          time3 = time3 + (DateTime.Now - now);
          #endregion
        }
      }
      Console.WriteLine(string.Format("方法一:\r\n耗时:{0}s", time1.TotalSeconds));
      Console.WriteLine(string.Format("方法二:\r\n耗时:{0}s", time2.TotalSeconds));
      Console.WriteLine(string.Format("方法三:\r\n耗时:{0}s", time3.TotalSeconds));
      Console.ReadKey();
    }

循环50次结果,即50*105945:

100次循环结果:,即100*105945:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • VS中C#读取app.config数据库配置字符串的三种方法

    关于VS2008或VS2005中数据库配置字符串的三种取法 VS2008建立Form程序时,如果添加数据源会在配置文件 app.config中自动写入连接字符串,这个字符串将会在你利用DataSet,SqlDataAparter,SqlConnection等控件时如影随行地提示你让去选择,或者是新建字符串.如果要用代码的方式取得这个字符串则有三种方式: app.config内容: <?xml version="1.0" encoding="utf-8" ?&g

  • C#操作Clipboard读取剪切板中数据实例详解

    本文实例讲述了C#操作Clipboard读取剪切板中数据的方法.分享给大家供大家参考.具体分析如下: 1 自定义一个类,并且保证它的可序列化的:实现ISerializable接口:或者用[Serializable]标记(如果有父类,则父类也需要被标记:可以[NonSerialized()]标记类中不想被序列化的字段) 2 注册自定义数据格式:调用静态方法DataFormats.GetFormat() 3 保存数据到clipboard:利用IdataObject接口,创建一个数据对象,并设置数据:

  • c#异步读取数据库与异步更新ui的代码实现

    异步读取数据库,在数据绑定的时候会出现点问题,就是窗体界面会无法关闭,要结束任务才能结束进程.例如下面代码 首先按习惯的方法,设定线程更新UI a2.CheckForIllegalCrossThreadCalls = false;  //a2为窗体名称 下面的代码就是从数据库里取得数据并绑定 复制代码 代码如下: private void button1_Click(object sender, EventArgs e)        {            SqlConnection con

  • C#使用FileStream循环读取大文件数据的方法示例

    本文实例讲述了C#使用FileStream循环读取大文件数据的方法.分享给大家供大家参考,具体如下: 今天学习了FileStream的用法,用来读取文件流,教程上都是读取小文件,一次性读取,但是如果遇到大文件,那么我们就需要循环读取文件. 直接上代码. 引用命名空间 using System.IO; 下面就是循环读取大文件的代码 class Program { static void Main(string[] args) { //循环读取大文本文件 FileStream fsRead; //获

  • C# 文件保存到数据库中或者从数据库中读取文件

    其实,方法非常的简单,只是可能由于这些朋友刚刚开始编程不久,一时没有找到方法而已.下面介绍一下使用C#来完成此项任务. 首先,介绍一下保存文件到数据库中. 将文件保存到数据库中,实际上是将文件转换成二进制流后,将二进制流保存到数据库相应的字段中.在SQL Server中该字段的数据类型是Image,在Access中该字段的数据类型是OLE对象. 复制代码 代码如下: //保存文件到SQL Server数据库中 FileInfo fi=new FileInfo(fileName); FileStr

  • C#从数据库读取数据到DataSet并保存到xml文件的方法

    本文实例讲述了C#从数据库读取数据到DataSet并保存到xml文件的方法.分享给大家供大家参考.具体实现方法如下: DataSet有一个WriteXml方法可以直接将数据保存到xml文件 using System; using System.Data; using System.Xml; using System.Data.SqlClient; using System.IO; public class TestWriteXML { public static void Main() { St

  • C#在MySQL大量数据下的高效读取、写入详解

    前言 C#操作MySQL大量数据最常见的操作便是 select 读取数据,然后在C#中对数据进行处理, 完毕后再插入数据库中.  简而言之就 select -> process -> insert 三个步骤. 对于数据量小的情况下(百万级别 or 几百兆)可能 最多1个小时就处理完了.但是对于千万级数据可能几天,甚至更多. 那么问题来了,如何优化?? 第一步 解决读取的问题 跟数据库打交道的方式有很多,我来列举下吧: 1. [重武器-坦克大炮]使用重型ORM框架,比如 EF,NHibernat

  • C#程序连接数据库及读取数据库中字段的简单方法总结

    连接Access数据库 string connStr = @"Data Source=D:\database.mdb; Provider=Microsoft.Jet.OleDb.4.0;"; //数据库连接字符串 OleDbConnection conn = new OleDbConnection(connStr); 连接Oracle数据库 //数据库和客户端在同一台机器上 using System.Data.OracleClient; string connStr = "d

  • C#保存图片到数据库并读取显示图片的方法

    复制代码 代码如下: private void button2_Click_1(object sender, System.EventArgs e) { string pathName; if (this.openFileDialog1.ShowDialog()==System.Windows.Forms.DialogResult.OK) { pathName = this.openFileDialog1.FileName; System.Drawing.Image img = System.D

  • C#实现把txt文本数据快速读取到excel中

    今天预实现一功能,将txt中的数据转到excel表中,做为matlab的数据源.搜集一些c#操作excel的程序.步骤如下: 下载一个Microsoft.Office.Interop.Excel.dll   在项目中引用. 编写代码如下: string path = "c://date//xyu.txt"; StreamReader sr = new StreamReader(path); string strLine = sr.ReadLine(); int rowNum = 1;

随机推荐