C#  ADO.NET 离线查询的实现示例

0. 前言

在上一篇中,我故意留下了查询的示范没讲。虽然说可以通过以下代码获取一个DataReader:

IDataReader reader = command.ExecuteReader();

然后通过reader一行一行的读取数据,但是我并不推荐这样使用。

在查询这一高频需求上,C#为之做了很多工作,提供了更多的选择。这里介绍一个查询的另一套写法。

1. 离线查询

C#在查询上提供了另一种机制,可以一次性从数据库把结果读取到网络缓存区中,直到使用的时候才加载到程序中。

在离线查询里最关键的三个接口或类:

  • IDataAdapter 一种适配器,用来获取数据并填充或更新DataSet
  • DataSet 表示数据在内存中的缓存
  • DataTable 表示内存中一个数据表

IDataAdapter用来提供数据,DataSet表示adapter读取的结果集,其中有一个DataTable集合表示执行的SQL查询结果。至于为什么是集合,是因为IDataAdapter允许运行多条查询语句。

好,让我们粗略浏览一下这个三个关键点的属性和方法:

IDataAdapter:

public int Fill (System.Data.DataSet dataSet);//将查询出来的结果填充到DataSet里

在C#内部,其实不允许推荐直接继承该接口,推荐继承DataAdapter类,该类规定了数据库Adapter在初始化的时候,必须提供一个可以访问的数据库连接和要执行的命令文本。

当然其部分实现类允许以属性的形式后赋值这两个关键内容。

DataSet:

public DataSet ();
public DataSet (string dataSetName);//指定数据集的名称
public System.Data.DataTableCollection Tables { get; }//获取包含在 DataSet 中的表的集合

DataSet有很多有用的方法,但是在今天我们只用关系这些就可以了。

其中Tables 引入了一个没有提到的类型,DataTableCollection。那么我们可以顺藤摸瓜,来看看里面有什么关键的内容:

public System.Data.DataTable this[int index] { get; }// 获取指定下标的DataTable
public System.Data.DataTable this[string name] { get; }//获取具有指定名称的DataTable

可以看到提供了一种我们可以获取到里面的DataTable元素的索引访问方式。

DataTable :

public System.Data.DataSet DataSet { get; }//获取此表所属的 DataSet。
public System.Data.DataColumnCollection Columns { get; }//获取属于该表的列的集合
public System.Data.DataRowCollection Rows { get; }//获取属于该表的行的集合

又出现了两个新的类:DataColumnCollection、DataRowCollection。这是一种内部集合的实现类,功能类似于List,但又不等同于List。

我们大概看一下对我们有用的属性和方法:

DataColumnCollection:

public virtual int Count { get; }//获取集合中的元素总数
public System.Data.DataColumn this[int index] { get; }//从集合中获取位于指定索引位置的 DataColumn
public System.Data.DataColumn this[string name] { get; }//从具有指定名称的集合中获取 DataColumn。

DataRowCollection:

public override int Count { get; }
public System.Data.DataRow this[int index] { get; }// 获取索引处的行

嗯,好先到此为止。调转方向回到上个路口,重新来。让我们看看DataColumn和DataRow又有哪些值得我们现在关注的:

DataColumn:

public string ColumnName { get; set; }//获取或设置 DataColumnCollection 中的列的名称
public Type DataType { get; set; }//获取或设置存储在列中的数据的类型

DataRow:

public object this[System.Data.DataColumn column] { get; set; }//获取或设置指定 DataColumn 中存储的数据
public object this[int columnIndex] { get; set; }//获取或设置由索引指定的列中存储的数据
public object this[string columnName] { get; set; }//获取或设置由名称指定的列中存储的数据
public object[] ItemArray { get; set; }//通过数组获取或设置此行的所有值

到目前为止,离线查询的支持类和接口就介绍了个大概。那么我们看看如何进行一个离线查询吧

2.实践看看

以SQL Server数据库为例:

获取一个SqlDataAdapter,C#提供了四种方式获取:

public SqlDataAdapter ();//构造一个没有连接和命令的Adapter对象
public SqlDataAdapter (System.Data.SqlClient.SqlCommand selectCommand);// 指定一个查询命令
public SqlDataAdapter (string selectCommandText, System.Data.SqlClient.SqlConnection selectConnection);//指定查询命令,和连接
public SqlDataAdapter (string selectCommandText, string selectConnectionString);//指定查询命令和连接字符串

引用命名空间:

using System.Data;
using System.Data.SqlClient;

那么,我们先构造一个Adapter:

var connectStr = "Data Source=.;Initial Catalog=Old;Integrated Security=True";
var sql = "select * from Area_PostCode";
var adapter = new SqlDataAdapter(sql, connectStr);

然后创建一个用于保存数据的DataSet,并把数据填充进去:

DataSet set = new DataSet();
adapter.Fill(set);

然后可以看到这个set中的数据应该是这样的:

上图是在VS中的调试模式中,可以看到

根据上图我们大概可以猜测一下DataTable内部的数据结构,或者C#让我们理解的结构是什么。

其中DataColumn对应着图中列,ColumnName就是图 所示的列名。而DataRow就是行,ItemArray则是一行行数据。

这样一来,显然就比直接使用IDataReader访问数据要方便很多。

依据上例:

我们试着获取一下第三行的Province列值,如果觉得这个表述别扭的话,看一下我的写法,就知道我为什么这么表示了。

var table = set.Tables[0];// 先拿到第一个表
var value = table.Rows[2]["Province"];

这是一种蚂蚁搬家式的读取数据方式。C#为DataTable提供了一个扩展方法:

public static EnumerableRowCollection<DataRow> AsEnumerable(this DataTable source);

将表格转换成可枚举的DataRow集合。

所以我们可以用foreach循环来遍历DataTable。

3. 未完待续

在这一节简单介绍了一下ADO.NET的离线查询支持。当我们能从数据库中获取到DataTable的时候,我们就能通过这个做出更多的事情来。下一章我将带领大家结合之前介绍的反射,实现一个简单的ORM工具类。

到此这篇关于C#  ADO.NET 离线查询的实现示例的文章就介绍到这了,更多相关C#  ADO.NET 离线查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • ADO与ADO.NET的区别与介绍

    1. ADO与ADO.NET简介ADO与ADO.NET既有相似也有区别,他们都能够编写对数据库服务器中的数据进行访问和操作的应用程序,并且易于使用.高速度.低内存支出和占用磁盘空间较少,支持用于建立基于客户端/服务器和 Web 的应用程序的主要功能.但是ADO使用OLE DB接口并基于微软的COM技术,而ADO.NET拥有自己的ADO.NET接口并且基于微软的.NET体系架构.众所周知.NET体系不同于COM体系,ADO.NET接口也就完全不同于ADO和OLE DB接口,这也就是说ADO.NET

  • ASP.NET中实现把Json数据转换为ADO.NET DataSet对象

    Json数据转换为ADO.NET DataSet其实方法有很多,Newtonsoft.Json也提供了DataSet的Converter用以转换Json数据.但是有些情况下DataSet Converter并不管用,而且也不一定能够满足项目需要.这里介绍另一种简单有效的方法,能够方便快速地将Json数据转为ADO.NET DataSet. 设计 事实上Newtonsoft.Json已经提供了一套完整的Json数据文档结构,Newtonsoft.Json.Linq命名空间下提供了这种文档结构的对象

  • ADO.NET实体数据模型详细介绍

    OleDbConnection,OracleConnection 或者SqlConnection这种连接,直接执行sql语句.现在的连接方式执行sql语句有了很大的不同,下面先看看简单的单表的增删改查操作,然后再看多表的关联查询,带参数查询等.一.ADO.NET Entity对单表的增删改查有一个表,即在工程中是一个实体user,为了测试方便,所有字段为string型. 1.增加新记录增加一条记录如下: [csharp] using (OracleEntities entities = new

  • ADO.NET中的五个主要对象的详细介绍与应用

    首先看一个例子 配置文件 复制代码 代码如下: <configuration> <connectionStrings> <add name=connStr" connectionString="Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\SS.mdf;Integrated Security=true;User Instance=True"/> </connecti

  • ADO.NET 读取EXCEL的实现代码((c#))

    // 连接字符串 复制代码 代码如下: // 连接字符串                     string xlsPath = Server.MapPath("~/app_data/somefile.xls"); // 绝对物理路径         string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +                         "Extended Properties=Exc

  • ADO.NET 连接数据库字符串小结(Oracle、SqlServer、Access、ODBC)

    ADO.NET 连接到 SQL Server SQL Server .NET Framework 数据提供程序支持类似于 OLE DB (ADO) 连接字符串格式的连接字符串格式. 复制代码 代码如下: using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); // Do work here. } 连接到 OLE DB 数据源 OLE DB .NET Framework

  • 一个经典的ADO.NET入门例子

    众所周知,ADO.NET相对于ADO的最大优势在于对于数据的更新修改可以在与数据源完全断开联系的情况下进行,然后再把数据更新情况传回到 数据源.这样大大减少了连接过多对于数据库服务器资源的占用.下面是我在<ADO.NET实用指南>这本书上看到的一个例子,比较清楚的讲解 了ADO.NET的使用方法.  Imports System.Data.SqlClient  Imports System.Data  Imports System.Data.Common Public Class Form1 

  • ADO.NET数据库访问技术

    一. ADO.NET的定义 ADO.NET来源于COM组件库ADO(即ActiveX Data Objects),是微软公司新一代.NET数据库的访问模型,是目前数据库程序设计人员用来开发基于.NET的数据库应用程序的主要接口.它利用.NET Data Provider(数据提供程序)进行数据库的连接和访问,通过ADO.NET数据库程序能够使用各种对象来访问符合条件的数据库内容,让提供数据库管理系统的各个厂商可以根据此标准开放对应的.NET Data Provider,这样设计数据库应用程序人员

  • 用C#对ADO.NET数据库完成简单操作的方法

    数据库访问是程序中应用最普遍的部分.随着C#和ADO.NET的引入,这种操作变得更简单.这篇文章将示范四种最基础的数据库操作.  ● 读取数据.其中包括多种数据类型:整型,字符串,日期型.  ● 写数据.如读数据一样,我们也需要写入多种类型的数据.这可以通过SQL语句来完成.  ● 更新或修改数据.我们将再次用到SQL语句.  ● 删除数据.用SQL实现.  上述的操作都要基于Microsoft Access 2000数据库,但是,我们要对连接字符串进行简单的修改才能使用SQL或其他ADO数据.

  • ADO.NET之连接池技术的使用详解

    连接到数据库服务器通常需要一定的时间,且服务器也需要一定的资源来处理连接.Web应用程序有时处理成千上万的连接,需要相当多的资源来处理连接.ADO.NET具有连接池的特性,连接池的功能是保留一定数量的连接,当用户使用相同的连接字符串再次连接服务器时,ASO.NET将使用连接池中的连接而不用重新发起一次连接过程.当调用Close方法关闭连接时,ADO.NET将使用连接池中的连接而不用重新发起一次连接过程.当调用Close方法关闭连接时,连接将会返回到连接池中,下次再次调用Open方法时,将从连接池

  • ADO.NET实现对SQL Server数据库的增删改查示例

    了解了上一篇的ADO.NET简介,我们就可以来对数据库进行增删改查等基本操作了!下面是每种操作的具体实现. 先在自定义类的头部定义好数据库连接对象和连接字符串: string connectionString = "Data Source=SC-201607131829;Initial Catalog=Animal;Integrated Security=True"; SqlConnection conn; 1.数据库的查询操作,返回一个DataTable public DataTab

随机推荐