C# 数据操作系列 – 3. ADO.NET 离线查询

C# 数据操作系列 - 3. ADO.NET 离线查询

  1. 前语
    在上一篇中,我成心留下了查询的演示没讲。尽管说能够经过以下代码获取一个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.Rows2;
这是一种蚂蚁搬迁式的读取数据办法。C#为DataTable供给了一个扩展办法:

public static EnumerableRowCollection AsEnumerable(this DataTable source);
将表格转换成可枚举的DataRow调集。

所以咱们能够用foreach循环来遍历DataTable。

  1. 未完待续
    在这一节简略介绍了一下ADO.NET的离线查询支撑。当咱们能从数据库中获取到DataTable的时分,咱们就能经过这个做出更多的工作来。下一章我将带领我们结合之前介绍的反射,完成一个简略的ORM东西类。

原文地址https://www.cnblogs.com/c7jie/p/12874317.html