DataSet & DataTable &DataRow 深入淺出

来源:https://www.cnblogs.com/wangbaicheng1477865665/archive/2018/01/10/8213917.html
-Advertisement-
Play Games

本篇文章適合有一定的基礎的人去查看 ,最好學習過一定net 編程基礎在來查看此文章。 1.概念 DataSet是ADO.NET的中心概念。可以把DataSet當成記憶體中的資料庫,DataSet是不依賴於資料庫的獨立數據集合。所謂獨立,就是說,即使斷開數據鏈路,或者關閉資料庫,DataSet依然是可用 ...


 

 

本篇文章適合有一定的基礎的人去查看 ,最好學習過一定net 編程基礎在來查看此文章。

1.概念

  DataSetADO.NET的中心概念。可以把DataSet當成記憶體中的資料庫,DataSet是不依賴於資料庫的獨立數據集合。所謂獨立,就是說,即使斷開數據鏈路,或者關閉資料庫,DataSet依然是可用的,DataSet在內部是用XML來描述數據的,由於XML是一種與平臺無關、與語言無關的數據描述語言,而且可以描述複雜關係的數據,比如父子關係的數據,所以DataSet實際上可以容納具有複雜關係的數據,而且不再依賴於資料庫鏈路。我們可以把DataSet當成記憶體資料庫,DataSet裡面可以存儲多個表(DataTable);我們稱DataSet為數據集對象。

  DataTable是一個臨時保存數據的網格虛擬表(表示記憶體中數據的一個表。)。DataTable是ADO dot net 庫中的核心對象。它可以被應用在 VB 和 ASP 上。它無須代碼就可以簡單的綁定資料庫。它具有微軟風格的用戶界面。 其他使用DataTable的對象包括DataSet和DataView,DataTable中存放的是一行行的數據,這一行行的數據就是DataRow 的數組(Array);我們稱DataTable 為數據表對象。         DataRow是DataTable中的數據行,他內部有包含多個數據列,每個列可以存儲不同類型的值。  

2.DataSet 的常見使用 

在C# 中 DataSet 存在於 System.Data 命名空間下,類似於java中包的路徑。DataSet 有兩種事列方式,代碼如下

using System;
using System.Data;

namespace testData
{
    class Program
    {
        static void Main(string[] args)
        {
            DataSet ds1 = new DataSet();//無構造實例,不指定DataSetName
            Console.WriteLine(ds1.DataSetName);
            DataSet ds2 = new DataSet("MySet");//一個構造實例,指定DataSetName
            Console.WriteLine(ds2.DataSetName);
            Console.ReadKey();
        }
    }
}

DataSet 常用的屬性就一個,Tables ,這裡就不過多解釋了,如下列出DataSet .Tables 如下常用屬性:

// ds.Tables.Count;//獲取數據集中存在的表的個數
// ds.Tables.Add(new DataTable());//添加一個表(DataTable)到數據集

//DataTable[] array = { new DataTable(), new DataTable(), new DataTable() };
//ds.Tables.AddRange(array);//添加一個表(DataTable)的數組(Array)到數據集

//ds.Tables.Remove();//刪除一個表
//ds.Tables.RemoveAt();//按照表的索引從數據集刪除一個表
//ds.WriteXml()//將xml 文件寫入到DataSet 數據集中
//ds.ReadXml()//將一個xml 文件讀取到數據集中
//ds.Tables.CanRemove()//驗證是否可以刪除一個集合中的對象。

 3.DataTable 的常見使用

 DataTable 和DataSet 命名空間一樣,實例化的方式有三種,但是常用的就兩種,第三種指定了表空間;這裡不過多解釋,現在我們來看下兩種常用實例方式;

實例化1                               DataTable dt0 = new DataTable();//沒有指定表名,預設表名為 NewDataTable
實例化2                               DataTable dt1 = new DataTable("User");//指定表名

using System;
using System.Data;

namespace testData
{
    class Program
    {
        static void Main(string[] args)
        {
            DataSet ds = new DataSet("Set");
            DataTable dt = new DataTable("User");
            ds.Tables.Add(dt);//把一個表加入到數據集中
            Console.WriteLine(ds.Tables.Count);
            Console.WriteLine(ds.Tables[0].TableName);
            Console.Read();
        }
    }
}

  通過上面的代碼,我們可以看出,我們使用DataSet 的Add方法將一個DataTable 加入數據集。

在前文概述中,我們就說了DataTable 是一個數據表,數據表就要有表頭,那麼如果創建一個表頭呢,上代碼

 DataSet ds = new DataSet("Set");
            DataTable dt = new DataTable("User");
            dt.Columns.Add(new DataColumn("ID", typeof(int)));//設定表頭ID
            dt.Columns.Add("Name", typeof(string));//設定表頭Name
            dt.Columns.Add("Age", Type.GetType("System.Int32"));//設定表頭Name
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                Console.WriteLine("遍歷表頭方式1_____"+dt.Columns[i]);
                
            }
            foreach (var item in dt.Columns)
            {
                Console.WriteLine("遍歷表頭方式2~~~" + item);
            }
            ds.Tables.Add(dt);//把一個表加入到數據集中
            Console.WriteLine("當前數據集中有“"+ ds.Tables.Count + "”個表   ");
            Console.WriteLine("當前數據集的表名   " + ds.Tables[0].TableName);
            Console.Read();

 這樣一張空的表格,我們就有了,下邊就是我們如何添加一個數據行了,別急,我們先來看下DataRow的使用。關於創建一個數據行我們會在高級部分分解。

 4.DataRow 的常見使用

DataRow 的創建方式,只有一種,因為我們net 中設定了DataRow不允許實例化,只能通過 DataTable.NewRow()來創建,如 DataRow dr = dt.NewRow();這樣我們就得到了一個空行對象。

4.1 如何給DataTable 增加行數據呢??看如下代碼

using System;
using System.Data;

namespace testData
{
    class Program
    {
        static void Main(string[] args)
        {
            DataSet ds = new DataSet("Set");
            DataTable dt = new DataTable("User");
            dt.Columns.Add(new DataColumn("ID", typeof(int)));//設定表頭ID
            dt.Columns.Add("Name", typeof(string));//設定表頭Name
            dt.Columns.Add("Age", Type.GetType("System.Int32"));//設定表頭Name
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                Console.WriteLine("遍歷表頭方式1_____"+dt.Columns[i]);
                
            }
            foreach (var item in dt.Columns)
            {
                Console.WriteLine("遍歷表頭方式2~~~" + item);
            }
            DataRow dr = dt.NewRow();
            dr["ID"] = 1;
            dr["Name"] = "xiaomeng";
            dr["age"] = 21;
            dt.Rows.Add(dr);
            ds.Tables.Add(dt);//把一個表加入到數據集中
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                DataRow item= dt.Rows[i];
                Console.WriteLine(item["name"]+"今年"+item["age"]+"歲了");
            }
            Console.WriteLine("當前數據集中有“"+ ds.Tables.Count + "”個表   ");
            Console.WriteLine("當前數據集的表名   " + ds.Tables[0].TableName);
            Console.Read();
        }
    }
}

我們很多程式員在開發的時候,都會認為這就把一個數據行添加到DataTable 裡面了,其實不是這樣的?具體看高級部分

 

5.綜合應用之CRUD(增刪改查)

5.1新增 

我們在DataRow中是有一個屬性叫RowState 叫做行狀態,行狀態主要有如下值:“UnChange”(無變化),“Added”(新增過後的數據),“Modified”(修改之後的數據),“Deleted” 刪除中的數據,如下圖,下圖為上面添加行數據的代碼,斷點調試。

通過上訴分析,我們會發現,添加的數據,並沒有提交到記憶體上,只是程式臨時存儲的。那麼我們怎麼提交呢,看如下代碼。

using System;
using System.Data;

namespace testData
{
    class Program
    {
        static void Main(string[] args)
        {
            DataSet ds = new DataSet("Set");
            DataTable dt = new DataTable("User");
            dt.Columns.Add(new DataColumn("ID", typeof(int)));//設定表頭ID
            dt.Columns.Add("Name", typeof(string));//設定表頭Name
            dt.Columns.Add("Age", Type.GetType("System.Int32"));//設定表頭Name
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                Console.WriteLine("遍歷表頭方式1_____"+dt.Columns[i]);
                
            }
            foreach (var item in dt.Columns)
            {
                Console.WriteLine("遍歷表頭方式2~~~" + item);
            }
            DataRow dr = dt.NewRow();
            dr["ID"] = 1;
            dr["Name"] = "xiaomeng";
            dr["age"] = 21;
            dt.Rows.Add(dr);
            dt.AcceptChanges();//提交數據
            ds.Tables.Add(dt);//把一個表加入到數據集中
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                DataRow item= dt.Rows[i];
                Console.WriteLine(item["name"]+"今年"+item["age"]+"歲了");
            }
            Console.WriteLine("當前數據集中有“"+ ds.Tables.Count + "”個表   ");
            Console.WriteLine("當前數據集的表名   " + ds.Tables[0].TableName);
            Console.Read();
        }
    }
}

  

 

 提交代碼DataTable.AcceptChanges();那麼有記憶體的提交是不是也應當有記憶體的回滾,這裡不過多介紹了,我們來看下

DataTable 新增行數據的時候狀態 為 Added ,這個時候可以使用DataTable的 .AcceptChanges()方法進行提交,可以使用RejectChanges()函數進行回滾。

DataTable 修改行數據的時候狀態 為 Modified ,這個時候可以使用DataTable的 .AcceptChanges()方法進行提交,可以使用RejectChanges()函數進行回滾。

DataTable 刪除行數據的時候狀態 為 Deleted,這個時候可以使用DataTable的 .AcceptChanges()方法進行提交,可以使用RejectChanges()函數進行回滾。

下麵來看下增刪改的代碼

using System;
using System.Data;

namespace testData
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            DataColumn[] arrayColumn = {
                new DataColumn("id", typeof(int)),
                new DataColumn("name", typeof(string)),
                new DataColumn("age", typeof(int)),
                new DataColumn("sex", typeof(string))
            };  
            dt.Columns.AddRange(arrayColumn);
            Console.WriteLine("---------------------------新增---------------------------");
            DataRow dr0 = null;
            for (int i = 0; i < 5; i++)
            {
                dr0 = dt.NewRow();
                dr0[0] = i;
                dr0[1] = "xiaoming"+i;
                dr0[2] = 20+i+new Random().Next(1,10);
                dr0[3] = new Random().Next(i, 200)%3==0?"":"";
               
                dt.Rows.Add(dr0);
            }
            Console.WriteLine("新增沒有提交列印");
            Print(dt);
            Console.WriteLine("狀態==================" + dr0.RowState);
            dt.AcceptChanges();//新增提交
            Console.WriteLine("新增提交後列印");
            Print(dt);
            Console.WriteLine("狀態==================" + dr0.RowState);
            Console.WriteLine("---------------------------修改---------------------------");
            DataRow dr1 = dt.Rows[0];
            dr1["name"] = "wbcsky";
            Console.WriteLine("修改沒有提交列印");
            Print(dt);
            Console.WriteLine("狀態==================" + dr1.RowState);
            dt.AcceptChanges();//新增提交
            Console.WriteLine("修改提交後列印");
            Print(dt);
            Console.WriteLine("狀態==================" + dr1.RowState);
            Console.WriteLine("---------------------------刪除---------------------------");
            DataRow dr2=dt.Rows[0]  ;//刪除第一條
            dr2.Delete();//這裡沒有使用dt.rmove 和dt.rmoveat,因為這兩個方法直接提交了
            Console.WriteLine("刪除沒有提交列印");
            Print(dt);
            Console.WriteLine("狀態==================" + dr2.RowState);
            dt.AcceptChanges();//新增提交
            Console.WriteLine("刪除提交後列印");
            Print(dt);
            Console.WriteLine("狀態==================" + dr2.RowState);
            Console.Read();
        }

        private static void Print(DataTable dt)
        {
            foreach (DataRow item in dt.Rows)
            {
                string msg = "";
                try
                {
                    msg = $"id={ item[0]},name={item[1]},age={item[2]},sex={item[3]}";
                }
                catch (Exception e)
                {
                     msg =e.Message;
                   
                }
              
                Console.WriteLine(msg);
            }
        }
    }
}

執行結果如下圖

6.綜合應用之篩選排序

我們如果想給上面的表排序,要怎麼排序呢?????,其實排序我們使用DataTable.Select 方法就可以,我們看下怎麼使用

我們會看到select 方法有四個重載,我們只用一個參數的和連個參數的,其中一個參數的是賽選,兩個參數的第一個參數為篩選,第二個為排序

using System;
using System.Data;

namespace testData
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            DataColumn[] arrayColumn = {
                new DataColumn("id", typeof(int)),
                new DataColumn("name", typeof(string)),
                new DataColumn("age", typeof(int)),
                new DataColumn("sex", typeof(string))
            };  
            dt.Columns.AddRange(arrayColumn);
           
            DataRow dr0 = null;
            for (int i = 0; i < 5; i++)
            {
                dr0 = dt.NewRow();
                dr0[0] = i;
                dr0[1] = "xiaoming"+i;
                dr0[2] = 20+i+new Random().Next(1,5);
                dr0[3] = new Random().Next(i, 200)%3==0?"":"";
               
                dt.Rows.Add(dr0);
            }
            Console.WriteLine("---------------------------篩選之前---------------------------");
            Print(dt);
            DataRow[] rowArr=   dt.Select("age >25", " age desc");
            Console.WriteLine("---------------------------篩選之後按年齡排序---------------------------");
            PrintRow(rowArr);
            Console.Read();
        }
        private static void PrintRow(DataRow[] rowArr)
        {
            foreach (DataRow item in rowArr)
            {
                string msg = "";
                try
                {
                    msg = $"id={ item[0]},name={item[1]},age={item[2]},sex={item[3]}";
                }
                catch (Exception e)
                {
                    msg = e.Message;

                }

                Console.WriteLine(msg);
            }
        }
        private static void Print(DataTable dt)
        {
            foreach (DataRow item in dt.Rows)
            {
                string msg = "";
                try
                {
                    msg = $"id={ item[0]},name={item[1]},age={item[2]},sex={item[3]}";
                }
                catch (Exception e)
                {
                     msg =e.Message;
                   
                }
              
                Console.WriteLine(msg);
            }
        }
    }
}

 


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

-Advertisement-
Play Games
更多相關文章
  • 一、Wtform WTForms是一個支持多個web框架的form組件,主要用於對用戶請求數據進行驗證。 安裝: pip3 install wtform 用途: 1. 用戶登錄註冊 當用戶登錄時候,需要對用戶提交的用戶名和密碼進行多種格式校驗。如: 用戶不能為空;用戶長度必須大於6; 用戶不能為空; ...
  • 前幾天遇到一個約瑟夫環演算法的問題,因為當時時間緊,而且之前也沒接觸過這個演算法,也就沒有太深究。今天有時間想起來這個問題了,就研究了一下,寫了一段代碼,試了一下,結果應該是正確的,記錄一下,以後用的時候也好找。下麵一段摘自百度百科。 約瑟夫環(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2 ...
  • "回到目錄" 職責鏈模式 它是一種設計模塊,主要將操作流程與具體操作解耦,讓每個操作都可以設置自己的操作流程,這對於工作流應用是一個不錯的選擇! 下麵是官方標準的定義:責任鏈模式是一種設計模式。在責任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一 ...
  • 基於WebImage封裝圖片上傳工具類,支持縮略圖和水印及其簡單的配置。 ...
  • 最近在做一部分Pyhton代碼轉c#代碼的工作,以下案例親自都測試過,現整理出來希望對有幫助的同學提供參考: Python | C# ...
  • 命令(Command) 2018/1/10 19:06:35 命令可以約束代碼,還可以約束步驟邏輯。(事件的作用是發佈和傳播一些消息,對如何響應事件不做規定,每個接收者可以使用自己的行為來響應事件。也就是說事件不具有約束力) 命令系統的基本元素 ·命令(Command):實際上就是實現了IComma ...
  • 一. 準備工作 1. 點擊此下載支持.Net4.0的 iBatis.Net,工程中引用release文件夾下的dll 最新版(目前已不再更新),有稍作修改使其支持.NET4.0 2. 點擊此可查看 iBatis.Net 的幫助文檔 3. 點擊此下載 iBatis in Action 的中文版電子書, ...
  • 前言 經過前面幾章,我們的網站已經最基本的功能,接下來就是繼續拓展其他的功能,這期一起來實現一個該網站流量分析的工具,統計出這個網站每天用戶相關數據,不僅要滿足了我們對流量統計數字的基本要求,並且用更簡單的圖形顯示方式,讓我們一目瞭然地獲取頁面熱度、點擊率信息等等。有了這個想法以後,那怎麼實現呢,跟 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...