天天看點

java datarow_DataSet & DataTable &DataRow 深入淺出

本篇文章适合有一定的基礎的人去檢視 ,最好學習過一定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 有兩種事列方式,代碼如下

usingSystem;usingSystem.Data;namespacetestData

{classProgram

{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();

}

}

}

java datarow_DataSet & DataTable &DataRow 深入淺出

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 indt.Columns)

{

Console.WriteLine("周遊表頭方式2~~~" +item);

}

ds.Tables.Add(dt);//把一個表加入到資料集中

Console.WriteLine("目前資料集中有“"+ ds.Tables.Count + "”個表");

Console.WriteLine("目前資料集的表名" + ds.Tables[0].TableName);

Console.Read();

這樣一張空的表格,我們就有了,下邊就是我們如何添加一個資料行了,别急,我們先來看下DataRow的使用。關于建立一個資料行我們會在進階部分分解。

這裡簡要說明下DataTable 的其他用法

1 DataTable的複制和數組複制是一樣的使用,就是完全Copy 一個方法。

2.DataTable 的克隆,克隆指的是克隆表結構,含主鍵列

3.我們使用Merge 合并連個表

下列出上訴簡要代碼

static void Main(string[] args)

{

DataTable dt= newDataTable();

dt.Columns.AddRange(newDataColumn[]

{new DataColumn("ID",typeof(int)),new DataColumn("UserName",typeof(string)),new DataColumn("Age",typeof(int))

}

);

dt.Rows.Add(1, "xiaoli", 33);

dt.PrimaryKey= new DataColumn[] { dt.Columns[0] };//給哪一列設定主鍵

DataTable dtCopy = dt.Copy();//複制表,連資料和表結構一起複制

DataTable dtClone = dt.Clone();//克隆一個表的結構,不包含資料

DataRow dr=dtClone.NewRow();

dr[0] = 2;

dr[1] = "xiaomei";

dr[2] = 23;

dtClone.Rows.Add(dr);

dt.Merge(dtClone);//當主鍵不同的時候,就會出現合并到一起,如果相同以被合并的表為主,表結構不一緻也可以合并,這裡就不掩飾了

Console.WriteLine(dt.Rows.Count);

Console.Read();

; }

4.DataRow 的常見使用

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

4.1 如何給DataTable 增加行資料呢??看如下代碼

usingSystem;usingSystem.Data;namespacetestData

{classProgram

{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 indt.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” 删除中的資料,如下圖,下圖為上面添加行資料的代碼,斷點調試。

java datarow_DataSet &amp; DataTable &amp;DataRow 深入淺出

通過上訴分析,我們會發現,添加的資料,并沒有送出到記憶體上,隻是程式臨時存儲的。那麼我們怎麼送出呢,看如下代碼。

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();

}

}

}

java datarow_DataSet &amp; DataTable &amp;DataRow 深入淺出

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

DataTable 新增行資料的時候狀态 為 Added ,這個時候可以使用DataTable的 .AcceptChanges()方法進行送出,可以使用RejectChanges()函數進行復原。

DataTable 修改行資料的時候狀态 為 Modified ,這個時候可以使用DataTable的 .AcceptChanges()方法進行送出,可以使用RejectChanges()函數進行復原。

DataTable 删除行資料的時候狀态 為 Deleted,這個時候可以使用DataTable的 .AcceptChanges()方法進行送出,可以使用RejectChanges()函數進行復原。

下面來看下增删改的代碼

usingSystem;usingSystem.Data;namespacetestData

{classProgram

{static void Main(string[] args)

{

DataTable dt= newDataTable();

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 voidPrint(DataTable dt)

{foreach (DataRow item indt.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);

}

}

}

}

執行結果如下圖

java datarow_DataSet &amp; DataTable &amp;DataRow 深入淺出

6.綜合應用之篩選排序

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

java datarow_DataSet &amp; DataTable &amp;DataRow 深入淺出

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

usingSystem;usingSystem.Data;namespacetestData

{classProgram

{static void Main(string[] args)

{

DataTable dt= newDataTable();

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 voidPrintRow(DataRow[] rowArr)

{foreach (DataRow item inrowArr)

{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 voidPrint(DataTable dt)

{foreach (DataRow item indt.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);

}

}

}

}