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