中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中怎么實現ADO.NET離線查詢

發布時間:2020-07-23 15:38:59 來源:億速云 閱讀:171 作者:小豬 欄目:編程語言

這篇文章主要講解了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中的數據應該是這樣的:

C#中怎么實現ADO.NET離線查詢

上圖是在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離線查詢有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

ne %d
AI

西乌| 闽侯县| 石狮市| 潼南县| 从化市| 西丰县| 左权县| 万州区| 沭阳县| 乐至县| 宁化县| 临沧市| 万全县| 青神县| 桃园县| 靖安县| 岳池县| 曲松县| 永宁县| 山西省| 长海县| 彰武县| 新民市| 收藏| 基隆市| 台湾省| 彰化县| 得荣县| 开江县| 庐江县| 沙湾县| 南江县| 三明市| 江口县| 阜宁县| 新竹县| 安仁县| 磴口县| 镇平县| 天祝| 玉龙|