程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 胡亂理解ADO.NET(二)

胡亂理解ADO.NET(二)

編輯:關於.NET

在上篇文章中說了程序對數據庫的操作後,我們通常要返回操作信息.例如:返回受影響的行數或者返回查詢的數據.SqlDataReader可以對返回的數據進行操作,但只是只讀的,而且必須要保持連接才行.那麼能不能更靈活的對返回的數據操作呢?答案是肯定的.

既然我要對返回的數據進行靈活的操作,那麼我們是不是要搞個東西來存放這些數據.要不然程序得到數據庫裡的數據後放哪?我們用什麼來存放這些數據呢?有個類叫做dataset官方的解釋叫做:表示數據在內存中的緩存.看這個解釋多少對我來說多少有點茫然.我個人把它通俗理解為:可以把數據存在裡面,而這些數據是以在內存中的形式存放的.也就是說不是放在硬盤上的.好了,dataset既然可以存放數據,那麼我們把從數據庫中返回的數據存放進去到dataset裡就行了.這個過程其實就是程序從數據庫裡得到數據,然後把數據放到dataset對象中,而dataset屬於程序裡的東西,當然程序就得到了這些數據.從另一個角度也可以說:程序從硬盤上(數據庫數據其實存放在硬盤上的)得到數據,然後把得到的數據放到內存中(dataset對象存在於內存中),並且程序能對這內存中的數據進行操作.現在我們知道了dataset可以作為存放數據的容器,那麼dataset為什麼能存放呢?那我們就自然的聯想到了dataset的內部"結構".

dataset其實相當於一個小型的數據庫,只不過是在內存中的.我們知道sqlsever數據是關系型的數據庫,裡面有一張一張的表,表裡可以存放數據,而表與表之間又有著聯系.這叫關系型數據庫.而dataset就類似一個關系型的數據庫.對比一下,dataset裡也會有一張一張的表,表與表之間也可以存在一定的關系.現在就知道了dataset有兩大部分組成.就是表與關系.表就是datatable了,關系就是Relation.當然一個dataset裡可以有很多表(datatable),所以才產生表與表之間的關系,如果只能有一個表,那也不存在表與表之間的關系了.那麼現在我們來看看表(datatable),datatable其實就是存放數據的地方.表嘛形象的想象成表格.那麼表格由什麼來組成呢?大家都知道行(row)和列(column).由於一個表(datatable)可能有很多行很多列,所以在datatable裡把所有的行統稱為:rows(行的集合),所有的列統稱為:columns(列的集合).具體每一行每一列叫什麼呢?具體的一行叫:DataRow.具體的一列叫:DataColumn.泛泛的說:在datatable中很多的DataRow在一起統稱為:rows;很多的DataColumn在一起統稱為:columns.現在知道了datatable中有行和列,是不是僅此而已呢?非也!其實還存在一個數據庫中也有的東西,叫做:約束(Constraint).datatable的約束都有些什麼呢?有兩個,一個叫做唯一鍵(UniqueConstraint),一個叫做外鍵(ForeignKeyConstraint).唯一鍵就是說,這個列被設為唯一鍵後,這列的每行數據是唯一的了,不能重復.就像數據庫裡自動增長的id.舉個例子我們把身份證好就需要設成唯一鍵,因為不能重復嘛.外鍵是什麼意思呢?和數據庫裡講的是一個意思.舉個例子,有兩張表,第一張表裡有個id字段是主鍵啊,這個id也是第二張表的一個字段,那麼我們就可以把第二張表中的id字段設為外鍵了.現在第一張表裡的一個id數據改了第二張表也相應的要改.這樣的形式就叫外鍵.

好了,上面基本說了dataset的內部構成了,總結如下:

dataset由datatable(表)和Relation(表之間的關系)組成,而datatable由DataRow,DataColumn和約束組成.約束有,唯一鍵和外鍵兩種.

既然dataset簡直就像個小型的關系型數據庫,那麼我們肯定能在裡面存放數據.現在我們用代碼來說明如果在dataset裡存放數據.

我們知道了dataset的內部構成,我們只要把裡面的"零部件"一個一個裝上就行了.首先,我們需要創建dataset對象,然後再創建datatable對象,想要幾個表就創建幾個datatable.此時把創建好的datatable對象裝到dataset裡.現在有了dataset,dataset裡也有了datatable,我們再把datatable裡加上列和行並填充上數據就可以了.那麼我們是先創建datatable中行還是列呢?我們想想在sqlserver數據庫裡我們建一個表,先要干什麼?當然是先設置字段,字段也就是列啊,字段設置好了我們表就建好了,接下來往裡加數據就行了.同理,在datatable裡我們要先設置字段,也就是列,然後就創建行,而創建行的過程其實也就是往裡加數據的過程.

我們來看看下面的代碼

此代碼創建個dataset,然後用gridview去綁定到dataset裡的datatable上.我們在dataset裡面放兩個datatable,分別用兩個gridview綁定啊.

Code1

1  static DataSet ds;
2  protected void Button1_Click(object sender, EventArgs e)
3  {
4    //創建個dataset對象
5    ds = new DataSet();
6
7    //創建一個表,名字叫:table1
8    DataTable tb1 = new DataTable("table1");
9
10    //又創建一個表,名字叫:table2
11    DataTable tb2 = new DataTable("table2");
12
13    //把剛才創建的兩個表都加到dataset裡,這樣,dataset裡就有表了
14    ds.Tables.Add(tb1);
15    ds.Tables.Add(tb2);
16
17    /**//////////////表添加好了,我們就要往表裡添加字段了(列),我們先操作table1表
18
19    //創建一個字段,也就是列。字段名叫:id
20    DataColumn dc = new DataColumn("id");
21
22    //設置字段的類型為int型
23    dc.DataType = typeof(int);
24
25    //字段創建好後就把它添加到table1表中,用ds.Tables["table1"]得到
26    //ds.Tables["table1"].Columns表示對表中列的操作
27    ds.Tables["table1"].Columns.Add(dc);
28
29    //上面我們就在dataset的一個表(table1)中加一個字段:id
30    //下面我們再往table1表中加個字段名字叫:name,我們不按上面的寫法,換個簡潔點的代碼,也可以這麼寫
31    ds.Tables["table1"].Columns.Add("name", typeof(string));
32
33    /**//////////////好了,我們已經在dataset中的表table1裡加個兩個字段了,下面就往裡加行了,也就是填充數據了
34
35    //創建一個datatable中的行對象:dr。
36    DataRow dr = ds.Tables["table1"].NewRow();
37
38    //得到id列,並賦值
39    dr["id"] = 1;
40    //得到name列,並賦值
41    dr["name"] = "張三";
42    //把行添加到表中,當然數據就填充到表裡了
43    ds.Tables["table1"].Rows.Add(dr);
44
45    //上面我們添加了一行,下面我們再添加加一行數據
46
47
48    dr = ds.Tables["table1"].NewRow();
49    //得到id列,並賦值
50    dr["id"] = 2;
51    //得到name列,並賦值
52    dr["name"] = "李四";
53    //把行添加到表中,當然數據就填充到表裡了
54    ds.Tables["table1"].Rows.Add(dr);
55
56
57    //到此為止,把dataset裡的table1表就創建完成了,總設置為兩列,並且添加了兩行。
58
59    //下面我們再把table2表完善
60
61    ds.Tables["table2"].Columns.Add("table1_id",typeof(int));//添加列:table1_id
62    ds.Tables["table2"].Columns.Add("sex",typeof(string));//添加列:sex
63
64    dr = ds.Tables["table2"].NewRow();
65    dr["table1_id"] = 1;
66    dr["sex"] = "男";
67
68    ds.Tables["table2"].Rows.Add(dr);
69
70    //現在dataset裡的兩個表都完成了,也就可以用了。我們分別將datatable綁定到兩個gridview中
71    //運行一下是沒有問題的
72
73    GridView1.DataSource = ds.Tables["table1"].DefaultView;
74    GridView1.DataBind();
75
76    GridView2.DataSource = ds.Tables["table2"].DefaultView;
77    GridView2.DataBind();
78 
79  }
80

上述代碼就詳細說明了如果構建一個dataset,並綁定到gridview上.但是我們只是簡單的對於datatable中數據的填充.現在我們要求table1中id列為唯一列怎麼做?還有當我把table1中的一個id值改變了,那麼table2中的table1_id的值也要相應的改變.(table1.id=table2.table1_id),這個又怎麼做?那麼就要對於datatable中的約束進行處理了.

我們先看看如何設置一個唯一鍵,看如下代碼:

Code2

1  protected void Button2_Click(object sender, EventArgs e)
2  {
3    //將表table1中的id列設置成唯一鍵
4    System.Data.UniqueConstraint uc = new UniqueConstraint("unique", ds.Tables["table1"].Columns["id"]);
5
6    //添加唯一鍵到table1表中約束中
7    ds.Tables["table1"].Constraints.Add(uc);
8  }
9

上面代碼就說明了如何添加一個約束(唯一鍵),當我們設置好唯一鍵後就不能對唯一鍵的列中的數據進行隨意修改了,當然是不能改為已經有的數據了.

列如:tabal1中有兩行,第一行id的值為1,第二行id的值為2,我們就不能把第一行的id改為2了,顯示第二行也不能改為1了.改成其他的數值當然是沒問題的.

忘了講怎麼改datatable中的數據,很簡單ds.Tables["table1"].Rows[0][0] = 3,就表示讓ds中的表table1的第0行第0列等於3.datatable中行與列都是從0開始的.當然通過ds.Tables["table1"].Rows[0][0]也可以到第0行第0列的值.

我們看如下一段代碼:

Code3

1  //修改table1中第0行第0列的值
2  protected void Button3_Click(object sender, EventArgs e)
3  {
4    try
5    {
6      //修改table1中第0行第0列的值為TextBox1.Text中的值
7      ds.Tables["table1"].Rows[0][0] = int.Parse(TextBox1.Text);
8
9      GridView1.DataSource = ds.Tables["table1"].DefaultView;
10      GridView1.DataBind();
11
12      GridView2.DataSource = ds.Tables["table2"].DefaultView;
13      GridView2.DataBind();
14    }
15    catch (Exception ex)
16    {
17      Response.Write(ex.Message);
18    }
19  }
20

上面代碼,就可以對tabal1的第0行第0列進行修改了,當然第0行第1列.....都可以修改.你可以用兩個textbox分別用來輸入行號與列號的.......

當我們未把id列設為唯一鍵時候(也就是未點那個設唯一鍵的按鈕),我們可以對ds.Tables["table1"].Rows[0][0]任意賦值的,當然要是數字才行.而當我們點擊設為唯一鍵後,就不能任意的改數值了.改成2就會報錯,因為2已經存在了,唯一鍵要求不能重復的.所以我們搞個try..catch語句來處理異常.錯誤信息為:列“id”被約束為是唯一的。值“2”已存在。

下面我們再來看看約束中的外鍵,當我們改動tabel1中的id值的時候,table2中的table1_id也要相應改變,因為它們是相等的.那麼此時我們只要在table2中把table1_id設為外鍵就行了.這樣tabel1中的id值變了,table2中的table1_id也就跟著變了.

如何設置外鍵呢,看下面代碼:

Code4

1  protected void Button4_Click(object sender, EventArgs e)
2  {
3    //設置主鍵/外鍵
4    System.Data.ForeignKeyConstraint fk=new ForeignKeyConstraint("fk",ds.Tables["table1"].Columns["id"],ds.Tables["table2"].Columns["table1_id"]);
5
6    //添加到約束
7    ds.Tables["table2"].Constraints.Add(fk);
8  }
9

上面代碼就設置了外鍵,運行後發現,改了tabel1中的id值,table2中的table1_id也就跟著變了.

好了羅嗦到現在,對於dataset裡的datatable介紹很多了,而dataset裡的關系(表與表的關系)有什麼用呢?另外我們發現像這樣的GridView1.DataSource = ds.Tables["table1"].DefaultView代碼,gridview對於datatable的綁定為什麼要有個DefaultView這個東西,當我們直接用GridView1.DataSource = ds.Tables["table1"],也沒問題的.那DefaultView究竟是什麼呢?帶著這些疑問我們下回再說.

如有錯誤請及時指正,謝謝!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved