C# 數據操作系列 - 3. ADO.NET 離線查詢

来源:https://www.cnblogs.com/c7jie/archive/2020/05/12/12874317.html
-Advertisement-
Play Games

0. 前言 在上一篇中,我故意留下了查詢的示範沒講。雖然說可以通過以下代碼獲取一個DataReader: 然後通過reader一行一行的讀取數據,但是我並不推薦這樣使用。 在查詢這一高頻需求上,C 為之做了很多工作,提供了更多的選擇。這裡介紹一個查詢的另一套寫法。 1. 離線查詢 C 在查詢上提供了 ...


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中的數據應該是這樣的:

image-20200512004118597

上圖是在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工具類。

更多內容煩請關註我的博客《高先生小屋》

file


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Attribute(特性)的概念不在此贅述了,相信有點.NET基礎的開發人員都明白,用過Attribute的人也不在少數,畢竟很多框架都提供自定義的屬性,類似於Newtonsoft.JSON中JsonProperty、JsonIgnore等 自定義特性 .NET 框架允許創建自定義特性,用於存儲聲明 ...
  • 隨著 .NET 5 發佈日期的日益臨近,其對應的 C# 新版本已確定為 C# 9.0,其中新增加的特性(或語法糖)也已基本鎖定,本系列文章將向大家展示它們。 ...
  • 基於 .NET 的一個全新的、好用的 PHP SDK + Runtime: PeachPie 來啦! ...
  • 一、數據準備 在SQL Server中創建記錄日誌的數據表LogDetail: CREATE TABLE [dbo].[LogDetail]( [LogID] [INT] IDENTITY(1,1) NOT NULL, --自增ID [LogDate] [DATETIME] NULL, --日誌時間 ...
  • ASP.NET Core 入門 本教程介紹如何使用 .NET Core CLI 創建並運行 ASP.NET Core Web 應用。 你將瞭解如何: 創建 Web 應用項目。 信任開發證書。 運行應用。 編輯 Razor 頁面。 最後,在本地電腦上運行工作 Web 應用。 先決條件 .NET Co ...
  • 大家習慣將服務註冊寫進Startup中的Configure管道配置,用來在服務啟動時進行Consul服務註冊,如圖: 然後由於某些原因,我更適合將服務部署在IIS,部署好之後,點擊啟動網站,卻發現服務並沒有註冊進Consul,然後我就查其原因: 使用 IIS 在 Windows 上托管 ASP.NE ...
  • 《ASP.NET MVC 4 實戰》 [作者] (美) Jeffrey Palermo (美) Jimmy Bogard (美) Eric Hexter (美) Matthew Hinze (英) Jeremy Skinner[譯者] (中) 徐燕萍 李萍 林逸[出版] 人民郵電出版社[版次] 20 ...
  • 視頻:https://www.bilibili.com/video/BV15x411x7WN?p=7 ChartControl圖表控制項的運用。 選擇一種圖表類型,先不考慮各種圖表的疊加。 綁定數據,設置橫坐標和縱坐標。 private void XtraForm1_Load(object sende ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...