C# ADO.NET 離線查詢的實(shí)現(xiàn)示例
0. 前言
在上一篇中,我故意留下了查詢的示范沒講。雖然說可以通過以下代碼獲取一個(gè)DataReader:
IDataReader reader = command.ExecuteReader();
然后通過reader一行一行的讀取數(shù)據(jù),但是我并不推薦這樣使用。
在查詢這一高頻需求上,C#為之做了很多工作,提供了更多的選擇。這里介紹一個(gè)查詢的另一套寫法。
1. 離線查詢
C#在查詢上提供了另一種機(jī)制,可以一次性從數(shù)據(jù)庫把結(jié)果讀取到網(wǎng)絡(luò)緩存區(qū)中,直到使用的時(shí)候才加載到程序中。
在離線查詢里最關(guān)鍵的三個(gè)接口或類:
- IDataAdapter 一種適配器,用來獲取數(shù)據(jù)并填充或更新DataSet
- DataSet 表示數(shù)據(jù)在內(nèi)存中的緩存
- DataTable 表示內(nèi)存中一個(gè)數(shù)據(jù)表
IDataAdapter用來提供數(shù)據(jù),DataSet表示adapter讀取的結(jié)果集,其中有一個(gè)DataTable集合表示執(zhí)行的SQL查詢結(jié)果。至于為什么是集合,是因?yàn)镮DataAdapter允許運(yùn)行多條查詢語句。
好,讓我們粗略瀏覽一下這個(gè)三個(gè)關(guān)鍵點(diǎn)的屬性和方法:
IDataAdapter:
public int Fill (System.Data.DataSet dataSet);//將查詢出來的結(jié)果填充到DataSet里
在C#內(nèi)部,其實(shí)不允許推薦直接繼承該接口,推薦繼承DataAdapter類,該類規(guī)定了數(shù)據(jù)庫Adapter在初始化的時(shí)候,必須提供一個(gè)可以訪問的數(shù)據(jù)庫連接和要執(zhí)行的命令文本。
當(dāng)然其部分實(shí)現(xiàn)類允許以屬性的形式后賦值這兩個(gè)關(guān)鍵內(nèi)容。
DataSet:
public DataSet (); public DataSet (string dataSetName);//指定數(shù)據(jù)集的名稱 public System.Data.DataTableCollection Tables { get; }//獲取包含在 DataSet 中的表的集合
DataSet有很多有用的方法,但是在今天我們只用關(guān)系這些就可以了。
其中Tables 引入了一個(gè)沒有提到的類型,DataTableCollection。那么我們可以順藤摸瓜,來看看里面有什么關(guān)鍵的內(nèi)容:
public System.Data.DataTable this[int index] { get; }// 獲取指定下標(biāo)的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; }//獲取屬于該表的行的集合
又出現(xiàn)了兩個(gè)新的類:DataColumnCollection、DataRowCollection。這是一種內(nèi)部集合的實(shí)現(xiàn)類,功能類似于List,但又不等同于List。
我們大概看一下對我們有用的屬性和方法:
DataColumnCollection:
public virtual int Count { get; }//獲取集合中的元素總數(shù) 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; }// 獲取索引處的行
嗯,好先到此為止。調(diào)轉(zhuǎn)方向回到上個(gè)路口,重新來。讓我們看看DataColumn和DataRow又有哪些值得我們現(xiàn)在關(guān)注的:
DataColumn:
public string ColumnName { get; set; }//獲取或設(shè)置 DataColumnCollection 中的列的名稱 public Type DataType { get; set; }//獲取或設(shè)置存儲(chǔ)在列中的數(shù)據(jù)的類型
DataRow:
public object this[System.Data.DataColumn column] { get; set; }//獲取或設(shè)置指定 DataColumn 中存儲(chǔ)的數(shù)據(jù) public object this[int columnIndex] { get; set; }//獲取或設(shè)置由索引指定的列中存儲(chǔ)的數(shù)據(jù) public object this[string columnName] { get; set; }//獲取或設(shè)置由名稱指定的列中存儲(chǔ)的數(shù)據(jù) public object[] ItemArray { get; set; }//通過數(shù)組獲取或設(shè)置此行的所有值
到目前為止,離線查詢的支持類和接口就介紹了個(gè)大概。那么我們看看如何進(jìn)行一個(gè)離線查詢吧
2.實(shí)踐看看
以SQL Server數(shù)據(jù)庫為例:
獲取一個(gè)SqlDataAdapter,C#提供了四種方式獲?。?/p>
public SqlDataAdapter ();//構(gòu)造一個(gè)沒有連接和命令的Adapter對象 public SqlDataAdapter (System.Data.SqlClient.SqlCommand selectCommand);// 指定一個(gè)查詢命令 public SqlDataAdapter (string selectCommandText, System.Data.SqlClient.SqlConnection selectConnection);//指定查詢命令,和連接 public SqlDataAdapter (string selectCommandText, string selectConnectionString);//指定查詢命令和連接字符串
引用命名空間:
using System.Data; using System.Data.SqlClient;
那么,我們先構(gòu)造一個(gè)Adapter:
var connectStr = "Data Source=.;Initial Catalog=Old;Integrated Security=True"; var sql = "select * from Area_PostCode"; var adapter = new SqlDataAdapter(sql, connectStr);
然后創(chuàng)建一個(gè)用于保存數(shù)據(jù)的DataSet,并把數(shù)據(jù)填充進(jìn)去:
DataSet set = new DataSet(); adapter.Fill(set);
然后可以看到這個(gè)set中的數(shù)據(jù)應(yīng)該是這樣的:
上圖是在VS中的調(diào)試模式中,可以看到
根據(jù)上圖我們大概可以猜測一下DataTable內(nèi)部的數(shù)據(jù)結(jié)構(gòu),或者C#讓我們理解的結(jié)構(gòu)是什么。
其中DataColumn對應(yīng)著圖中列,ColumnName就是圖 所示的列名。而DataRow就是行,ItemArray則是一行行數(shù)據(jù)。
這樣一來,顯然就比直接使用IDataReader訪問數(shù)據(jù)要方便很多。
依據(jù)上例:
我們試著獲取一下第三行的Province列值,如果覺得這個(gè)表述別扭的話,看一下我的寫法,就知道我為什么這么表示了。
var table = set.Tables[0];// 先拿到第一個(gè)表 var value = table.Rows[2]["Province"];
這是一種螞蟻搬家式的讀取數(shù)據(jù)方式。C#為DataTable提供了一個(gè)擴(kuò)展方法:
public static EnumerableRowCollection<DataRow> AsEnumerable(this DataTable source);
將表格轉(zhuǎn)換成可枚舉的DataRow集合。
所以我們可以用foreach循環(huán)來遍歷DataTable。
3. 未完待續(xù)
在這一節(jié)簡單介紹了一下ADO.NET的離線查詢支持。當(dāng)我們能從數(shù)據(jù)庫中獲取到DataTable的時(shí)候,我們就能通過這個(gè)做出更多的事情來。下一章我將帶領(lǐng)大家結(jié)合之前介紹的反射,實(shí)現(xiàn)一個(gè)簡單的ORM工具類。
到此這篇關(guān)于C# ADO.NET 離線查詢的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)C# ADO.NET 離線查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- ADO.NET實(shí)體數(shù)據(jù)模型詳細(xì)介紹
- ADO.NET中的五個(gè)主要對象的詳細(xì)介紹與應(yīng)用
- ADO.NET 連接數(shù)據(jù)庫字符串小結(jié)(Oracle、SqlServer、Access、ODBC)
- ADO.NET 讀取EXCEL的實(shí)現(xiàn)代碼((c#))
- ADO與ADO.NET的區(qū)別與介紹
- 一個(gè)經(jīng)典的ADO.NET入門例子
- ADO.NET數(shù)據(jù)庫訪問技術(shù)
- ADO.NET之連接池技術(shù)的使用詳解
- ADO.NET實(shí)現(xiàn)對SQL Server數(shù)據(jù)庫的增刪改查示例
- ASP.NET中實(shí)現(xiàn)把Json數(shù)據(jù)轉(zhuǎn)換為ADO.NET DataSet對象
- 用C#對ADO.NET數(shù)據(jù)庫完成簡單操作的方法
相關(guān)文章

C#利用ScriptControl動(dòng)態(tài)執(zhí)行JS和VBS腳本

c#文件的復(fù)制,移動(dòng),創(chuàng)建(實(shí)例代碼)

C#程序連接數(shù)據(jù)庫及讀取數(shù)據(jù)庫中字段的簡單方法總結(jié)