最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#  ADO.NET 離線查詢的實(shí)現(xiàn)示例

 更新時間:2020年05月18日 16:11:36   作者:月影西下  
這篇文章主要介紹了C# ADO.NET 離線查詢的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

0. 前言

在上一篇中,我故意留下了查詢的示范沒講。雖然說可以通過以下代碼獲取一個DataReader:

IDataReader reader = command.ExecuteReader();

然后通過reader一行一行的讀取數(shù)據(jù),但是我并不推薦這樣使用。

在查詢這一高頻需求上,C#為之做了很多工作,提供了更多的選擇。這里介紹一個查詢的另一套寫法。

1. 離線查詢

C#在查詢上提供了另一種機(jī)制,可以一次性從數(shù)據(jù)庫把結(jié)果讀取到網(wǎng)絡(luò)緩存區(qū)中,直到使用的時候才加載到程序中。

在離線查詢里最關(guān)鍵的三個接口或類:

  • IDataAdapter 一種適配器,用來獲取數(shù)據(jù)并填充或更新DataSet
  • DataSet 表示數(shù)據(jù)在內(nèi)存中的緩存
  • DataTable 表示內(nèi)存中一個數(shù)據(jù)表

IDataAdapter用來提供數(shù)據(jù),DataSet表示adapter讀取的結(jié)果集,其中有一個DataTable集合表示執(zhí)行的SQL查詢結(jié)果。至于為什么是集合,是因?yàn)镮DataAdapter允許運(yùn)行多條查詢語句。

好,讓我們粗略瀏覽一下這個三個關(guān)鍵點(diǎn)的屬性和方法:

IDataAdapter:

public int Fill (System.Data.DataSet dataSet);//將查詢出來的結(jié)果填充到DataSet里

在C#內(nèi)部,其實(shí)不允許推薦直接繼承該接口,推薦繼承DataAdapter類,該類規(guī)定了數(shù)據(jù)庫Adapter在初始化的時候,必須提供一個可以訪問的數(shù)據(jù)庫連接和要執(zhí)行的命令文本。

當(dāng)然其部分實(shí)現(xiàn)類允許以屬性的形式后賦值這兩個關(guān)鍵內(nèi)容。

DataSet:

public DataSet ();
public DataSet (string dataSetName);//指定數(shù)據(jù)集的名稱
public System.Data.DataTableCollection Tables { get; }//獲取包含在 DataSet 中的表的集合

DataSet有很多有用的方法,但是在今天我們只用關(guān)系這些就可以了。

其中Tables 引入了一個沒有提到的類型,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)了兩個新的類: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)方向回到上個路口,重新來。讓我們看看DataColumn和DataRow又有哪些值得我們現(xiàn)在關(guān)注的:

DataColumn:

public string ColumnName { get; set; }//獲取或設(shè)置 DataColumnCollection 中的列的名稱
public Type DataType { get; set; }//獲取或設(shè)置存儲在列中的數(shù)據(jù)的類型

DataRow:

public object this[System.Data.DataColumn column] { get; set; }//獲取或設(shè)置指定 DataColumn 中存儲的數(shù)據(jù)
public object this[int columnIndex] { get; set; }//獲取或設(shè)置由索引指定的列中存儲的數(shù)據(jù)
public object this[string columnName] { get; set; }//獲取或設(shè)置由名稱指定的列中存儲的數(shù)據(jù)
public object[] ItemArray { get; set; }//通過數(shù)組獲取或設(shè)置此行的所有值

到目前為止,離線查詢的支持類和接口就介紹了個大概。那么我們看看如何進(jìn)行一個離線查詢吧

2.實(shí)踐看看

以SQL Server數(shù)據(jù)庫為例:

獲取一個SqlDataAdapter,C#提供了四種方式獲?。?/p>

public SqlDataAdapter ();//構(gòu)造一個沒有連接和命令的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;

那么,我們先構(gòu)造一個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)建一個用于保存數(shù)據(jù)的DataSet,并把數(shù)據(jù)填充進(jìn)去:

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

然后可以看到這個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列值,如果覺得這個表述別扭的話,看一下我的寫法,就知道我為什么這么表示了。

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

這是一種螞蟻搬家式的讀取數(shù)據(jù)方式。C#為DataTable提供了一個擴(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的時候,我們就能通過這個做出更多的事情來。下一章我將帶領(lǐng)大家結(jié)合之前介紹的反射,實(shí)現(xiàn)一個簡單的ORM工具類。

到此這篇關(guān)于C#  ADO.NET 離線查詢的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)C#  ADO.NET 離線查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#動態(tài)查詢之巧用Expression組合多條件表達(dá)式的方法和步驟

    C#動態(tài)查詢之巧用Expression組合多條件表達(dá)式的方法和步驟

    在C#中,可以使用AndAlso和OrElse方法組合兩個Expression<Func<T, bool>>類型的表達(dá)式,下面通過實(shí)例代碼給大家分享C#動態(tài)查詢之巧用Expression組合多條件表達(dá)式,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • C#?時間戳轉(zhuǎn)換實(shí)例

    C#?時間戳轉(zhuǎn)換實(shí)例

    本文主要介紹了C#?時間戳轉(zhuǎn)換實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • c#使用EPPlus將圖片流嵌入到Excel實(shí)現(xiàn)示例

    c#使用EPPlus將圖片流嵌入到Excel實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了c#使用EPPlus將圖片流嵌入到Excel實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 基于C#檢測敏感詞功能

    基于C#檢測敏感詞功能

    這篇文章主要為大家詳細(xì)介紹了如何基于C#實(shí)現(xiàn)檢測敏感詞功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • 解析C#中@符號的幾種使用方法詳解

    解析C#中@符號的幾種使用方法詳解

    本篇文章是對C#中@符號的幾種使用方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Unity shader實(shí)現(xiàn)移動端模擬深度水效果

    Unity shader實(shí)現(xiàn)移動端模擬深度水效果

    這篇文章主要為大家詳細(xì)介紹了Unity shader實(shí)現(xiàn)移動端模擬深度水效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 基于Unity實(shí)現(xiàn)2D邊緣檢測

    基于Unity實(shí)現(xiàn)2D邊緣檢測

    這篇文章主要介紹了如何利用Unity實(shí)現(xiàn)2D邊緣檢測,從而達(dá)到人物描邊效果。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-04-04
  • C#使用OpenCvSharp4庫讀取電腦攝像頭數(shù)據(jù)并實(shí)時顯示

    C#使用OpenCvSharp4庫讀取電腦攝像頭數(shù)據(jù)并實(shí)時顯示

    OpenCvSharp4庫是一個基于.Net封裝的OpenCV庫,本文主要給大家介紹了C#使用OpenCvSharp4庫讀取電腦攝像頭數(shù)據(jù)并實(shí)時顯示的詳細(xì)方法,感興趣的朋友可以參考下
    2024-01-01
  • unity使用射線實(shí)現(xiàn)貼花系統(tǒng)

    unity使用射線實(shí)現(xiàn)貼花系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了unity使用射線實(shí)現(xiàn)貼花系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 如何使用C# 捕獲進(jìn)程輸出

    如何使用C# 捕獲進(jìn)程輸出

    這篇文章主要介紹了如何使用C# 捕獲進(jìn)程輸出,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-08-08

最新評論

富锦市| 益阳市| 城市| 长垣县| 伊金霍洛旗| 新宁县| 海兴县| 宜丰县| 彭山县| 桃园市| 宁河县| 灵丘县| 新巴尔虎右旗| 炉霍县| 墨玉县| 台安县| 嵊州市| 老河口市| 柞水县| 观塘区| 新民市| 辽宁省| 策勒县| 日土县| 万源市| 凤凰县| 海安县| 循化| 龙井市| 门源| 高陵县| 建宁县| 孟村| 永善县| 星子县| 乌兰察布市| 灵寿县| 衡东县| 武清区| 东明县| 昌吉市|