ADO.NET Managed Provider | ADO.NET SQL Managed Provider | |
需要引入的Namespace | System.Data.ADO | System.Data.SQL |
Connection對(duì)象 | ADOConnection | SQLConnection |
Command對(duì)象 | ADODatasetCommand | SQLDatasetCommand |
Dataset對(duì)象 | Dataset | Dataset |
DataReader | ADODataReader | SQLDataReader |
連接數(shù)據(jù)庫(kù)例子 | String sConnectionString = "Provider= SQLOLEDB.1; Data Source=localhost; uid=sa; pwd=; Initial Catalog=pubs";
ADOConnection con = new ADOConnection(sConnectionString); con.Open(); | String sConnectionString = "server=localhost;uid=sa;pwd=;database=pubs"; SQLConnection con = new SQLConnection(sConnectionString); con.Open();
|
執(zhí)行SQL語(yǔ)句例子 | ADOCommand cmd = new ADOCommand("SELECT * FROM Authors", con); ADODataReader dr = new ADODataReader(); cmd.Execute(out dr); | SQLCommand cmd = new SQLCommand(("SELECT * FROM Authors", con); SQLDataReader dr = new SQLDataReader(); cmd.Execute(out dr); |
使用存儲(chǔ)過程例子 | ADOCommand cmd = new ADOCommand ("spGetAuthorByID", con); cmd.CommandType = CommandType.StoredProcedure;
ADOParameter prmID = new ADOParameter("AuthID", ADODataType.VarChar, 11);
prmID.Value = "111-11-1111";
cmd.SelectCommand.Parameters.Add(prmID);
ADODataReader dr; cmd.Execute (out dr); | SQLCommand cmd = new SQLCommand("spGetAuthorByID", con); cmd.CommandType = CommandType.StoredProcedure;
SQLParameter prmID = new SQLParameter("@AuthID", SQLDataType.VarChar,11);
prmID.Value = "111-11-1111" cmd.SelectCommand.Parameters.Add(prmID); SQLDataReader dr; cmd.Execute(out dr); |
使用一個(gè)從數(shù)據(jù)庫(kù)獲得的DataSets較為復(fù)雜,它的步驟大概如下:
1. 使用SQLDataSetCommand命令(SQL方式)或者ADODataSetCommand命令(ADO方式)從數(shù)據(jù)庫(kù)管理系統(tǒng)中獲取一個(gè)表結(jié)構(gòu)及其數(shù)據(jù)填充到本地內(nèi)存的DataSet的一個(gè)表中。
例如:
·Ado方式
Dim MyDsComm As New ADODataSetCommand
Dim MyComm As ADOCommand
Dim MyConn As ADOConnection
MyConn = New ADOConnection _
("Provider=SQLOLEDB.1;Initial Catalog=Northwind;" & _
"Data Source=(local);User ID=sa;")
MyComm = New ADOCommand("SELECT * FROM Customers", MyConn)
MyDsComm.SelectCommand = MyComm
·SQL方式
Dim MyConn as SQLConnection
Dim MyComm as SQLDataSetCommand
Dim MyDs as New DataSet
MyConn=New SQLConnection(“server=localhost;uid=sa;pwd=;database=pubs”)
MyComm=New SQLDataSetCommand(“Select * from authoers”,MyConn)
MyComm.FillDataSet(Myds,”authers”)
2.對(duì)DataSet中的表對(duì)象DataTable的數(shù)據(jù)進(jìn)行操作,包括增加、刪除、修改它的DataRow對(duì)象
3.使用GetChanges方法產(chǎn)生一個(gè)DataSet修改后的對(duì)象的DataSet集合。
代碼如下:
Dim changedDataSet As DataSet
changedDataSet = ds.GetChanges(DataRowState.Modified)
4.通過對(duì)產(chǎn)生的DataSet對(duì)象的HasErrors屬性的監(jiān)控,查看是否DataSet中的表有錯(cuò)誤發(fā)生。
5.如果有錯(cuò)誤發(fā)生,就要對(duì)DataSet中的各個(gè)表進(jìn)行錯(cuò)誤檢查,方法一樣,也是根據(jù)各個(gè)DataTable的HasErrors屬性。如果表中有錯(cuò)誤發(fā)生,那么GetErrors方法就會(huì)被激活,并且會(huì)返回一個(gè)含有錯(cuò)誤的DataRow對(duì)象的數(shù)組。
6.當(dāng)表出錯(cuò)時(shí),對(duì)于每一個(gè)DataRow對(duì)象的RowError屬性進(jìn)行檢測(cè)。
7.如果可能,處理發(fā)生的錯(cuò)誤。
8.使用DataSet對(duì)象的Merge方法把檢測(cè)無(wú)錯(cuò)誤發(fā)生的修改后的DataSet合并入原先的DataSet中,代碼如下:
ds.Merge(changedDataSet)
9.使用DataSetCommand對(duì)象的update方法,把合并后的DataSet對(duì)象送往數(shù)據(jù)庫(kù)端進(jìn)行修改,代碼如下:
MyDataSetCommand.Update(ds)
10.使用DataSet對(duì)象的AcceptChanges方法對(duì)數(shù)據(jù)庫(kù)修改進(jìn)行確認(rèn),或者使用RejectChanges方法撤消對(duì)數(shù)據(jù)庫(kù)的修改,代碼如下:
Ds.AcceptChanges
1.使用DataSet()創(chuàng)建器創(chuàng)立一個(gè)DataSet對(duì)象。
DataSet()可以跟一個(gè)字符串用以指明創(chuàng)建的DataSet名字
Dim ds1 as New DataSet
Dim ds2 as New DataSet(“MyDataSet”)
2.增加一個(gè)DataTable到DataSet中。
具體操作是,首先在DataSet對(duì)象的Tables集合中,增加一個(gè)表
ds.Tables.Add(New DataTable(表名))
然后,再在該表中的Columns集合中增加相應(yīng)的列
ds.Tables(表名).Columns.Add(列名,列類型)
例如:我們?cè)?/span>ds對(duì)象中建立一個(gè)訂購(gòu)表(Order),它有三個(gè)字段,客戶名(CUNM)、訂貨編號(hào)(ORNO)、訂貨數(shù)量(ORNM)
ds.Tables.Add(New DataTable(“Order”))
ds.Tables(“Order”).Columns.Add(“CUNM”,GetType(String))
ds.Tables(“Order”).Columns.Add(“ORNO”,GetType(String))
ds.Tables(“Order”).Columns.Add(“ORNM”,GetType(int32))
ds.Tables(“Order”).PrimaryKey=
New DataColumn(ds.Tables(“Order”).Columns(“ORNO”)
在上面的例子中,我們還設(shè)置了訂購(gòu)表的鍵值,這是通過對(duì)它的PrimaryKey的屬性設(shè)置來得到的,設(shè)置鍵值的好處在于可以防止相同記錄的輸入,保證數(shù)據(jù)的唯一性。
3.設(shè)置表間的關(guān)系
由于DataSet對(duì)象中可以含有多個(gè)DataTable,而事實(shí)上每一個(gè)表又不可能與其他的表沒有任何的關(guān)系,這樣就帶來了一個(gè)問題,我們?nèi)绾蚊枋鰞蓚€(gè)不同的表之間的關(guān)系?asp.net提供了DataRelation對(duì)象來描述表和表之間的關(guān)系。DataRelation對(duì)象至少需要兩個(gè)參數(shù)才能確定兩個(gè)表之間的關(guān)系,這是因?yàn)樵趦蓚€(gè)表的關(guān)系中,至少需要一個(gè)主鍵列和一個(gè)外鍵列,才能確定兩者之間的對(duì)應(yīng)關(guān)系。
例如:關(guān)于客戶購(gòu)物有兩個(gè)表,一個(gè)是客戶信息表(Customer),一個(gè)是購(gòu)物信息表(Order),很顯然它們兩者之間存在著某種聯(lián)系。經(jīng)過分析,我們發(fā)現(xiàn)客戶編號(hào)(CUNO)在兩個(gè)表中都存在,它使我們能夠把兩個(gè)表的信息連接起來,告訴我們這樣一個(gè)事實(shí),誰(shuí)訂購(gòu)了什么物品。因此需要建立關(guān)于客戶信息表和購(gòu)物信息表的一個(gè)聯(lián)系,用Asp.net語(yǔ)言表達(dá)如下:
Dim ds as DataSet
…
ds.Relations.Add(“CustomerOrder”,ds.Tables(“Customer”).Columns(“CUNO”),
ds.Tables(“Order”).Columns(“CUNO”))
4.在關(guān)系表間的瀏覽
通過DataRelaiton的設(shè)置,我們可以在同一個(gè)DataSet中,由對(duì)一個(gè)表操作,找到可能引起的相關(guān)表的變化。例如,對(duì)于客戶信息表中的對(duì)應(yīng)于某個(gè)人的一條記錄,我們可以在購(gòu)貨信息表中找到所有屬于他的購(gòu)貨信息,演示代碼如下:
dim orderRows() as DataRow
orderRows=ds.Tables(“Customer”).ChildRelations(“CustomerOrder”).GetChildRows(
ds.Tables(“Customer”).Rows(0))
5.?dāng)?shù)據(jù)約束的使用
在關(guān)系數(shù)據(jù)庫(kù)中,使用數(shù)據(jù)約束的目的是為了使數(shù)據(jù)庫(kù)的一致性得到保證。當(dāng)數(shù)據(jù)發(fā)生改變時(shí),數(shù)據(jù)約束被執(zhí)行,用以檢查對(duì)數(shù)據(jù)的修改,是否和已經(jīng)定義的規(guī)則相符合,如果不符合修改將不能生效。在asp.net中提供了兩種數(shù)據(jù)約束,ForeignKeyConstraint和UniqueConstraint。
ForeignKeyConstraint,外鍵值一致性約束,定義當(dāng)表中的一條記錄被刪除或者是增加一條記錄時(shí),與該表相關(guān)的其他表的相應(yīng)記錄如何處理。例如,當(dāng)一個(gè)客戶被人從客戶信息表中刪去,那么在購(gòu)物信息表中的關(guān)于他的購(gòu)物信息的記錄如何處理等等。
ForeignKeyConstraint有五個(gè)可能的值如下:
·Cascade 當(dāng)表中記錄被刪除或者更新以后,對(duì)應(yīng)表中的記錄相應(yīng)被刪除和更新
·SetNull 當(dāng)表中記錄被刪除或者更新以后,對(duì)應(yīng)表中的記錄被置為Null
·SetDefault 當(dāng)表中記錄被刪除或者更新以后,對(duì)應(yīng)表中的記錄被置為缺省值
·None 當(dāng)表中記錄被刪除或者更新以后,對(duì)應(yīng)表中的記錄不做任何處理
·Default 當(dāng)表中記錄被刪除或者更新以后,ForeignKeyConstraint采用其缺省值,通常該值為Cascade
具體使用ForeigKeyConstraint時(shí),首先應(yīng)創(chuàng)建它,然后設(shè)置DeleteRule和UpDateRule屬性,指明當(dāng)刪除和更新記錄時(shí),對(duì)應(yīng)表的處理規(guī)則。
例子:我們對(duì)客戶信息表定義一個(gè)外鍵定義,它定義當(dāng)客戶信息表中記錄刪除時(shí),其關(guān)聯(lián)表—購(gòu)物信息表中的數(shù)據(jù)也應(yīng)刪除(意味著用戶不存在,自然也不應(yīng)該有他的購(gòu)物信息),當(dāng)客戶信息表中記錄被修改時(shí),購(gòu)物信息置為缺省的特殊值(意味著,當(dāng)銷售人員發(fā)生差錯(cuò),記錯(cuò)購(gòu)物用戶,那么以他的名義購(gòu)物的定單不應(yīng)算在該用戶頭上,置為特殊標(biāo)記,以供今后修改),代碼演示如下:
dim fk as New ForeignKeyConstraint(ds.Tables(“Customer”).Columns(“CUNO”),
ds.Tables(“Order”.Columns(“CUNO”))
‘創(chuàng)建外鍵約束為Customer表和Order表中CUNO字段
fk.DeleteRule=Cascade
fk.UpdateRule=SetDefault
‘刪除規(guī)則為Cascade,修改規(guī)則為SetDefault
ds.Tables(“Customer”).Constraints.Add(fk)
‘加入Customer表的一致性約束集合中
UniqueConstraint,唯一性約束,它指定了數(shù)據(jù)表中的一個(gè)列或者幾個(gè)列的集合的值的唯一性,通常被指定為唯一約束的字段都是表的鍵值。
例如:對(duì)于客戶信息表,因?yàn)槊總€(gè)人的購(gòu)物都必須和別人區(qū)別,這樣才能保證正確地付款和發(fā)送貨物,因而每一個(gè)人的客戶編號(hào)都不應(yīng)該相同,這時(shí)就可以使用唯一性約束來保證客戶信息表中的客戶編號(hào)唯一。演示代碼如下:
dim uc as UniqueConstraint
uc=New UniqueConstraint(ds.Tables(“Customer”).Columns(“CUNO”))
‘指定唯一約束為Customer表中的CUNO字段
ds.Tables(“Customer”).Constraints.Add(uc)
‘把唯一約束加入Customer表的約束中
6.處理DataSet的事件
為了便于用戶對(duì)DataSet的控制,asp.net提供了DataSet的一系列可被用戶處理的事件,它們包括:
·PropertyChange 當(dāng)屬性發(fā)生改變時(shí)
·MergeFailed DataSet合并失敗時(shí)
·RemoveTable 刪除一個(gè)表時(shí)
·RemoveRelation 刪除一個(gè)關(guān)系時(shí)
·Adding the event handler to the event 增加一個(gè)事件處理函數(shù)時(shí)
例如:
ds.AddOnPropertyChange(new System.ComponentModel.PropertyChangeEventHandler _
(AddressOf me.DataSetPropertyChange))
‘指定當(dāng)DataSet發(fā)生PropertyChange事件時(shí)的消息處理函數(shù)為DataSetPropertyChange
ds.AddOnMergeFailed(new System.Data.MergeFailedEventHandler _
(AddressOf me.DataSetMergeFailed))
‘指定當(dāng)DataSet發(fā)生MergeFailed事件時(shí)的消息處理函數(shù)為DataSetMergeFailed
‘當(dāng)PropertyChange發(fā)生時(shí)的處理函數(shù)
Private Sub DataSetPropertyChange _
(ByVal sender As Object, ByVal e As System.PropertyChangeEventArgs)
…
End Sub
‘當(dāng)MergeFailed發(fā)生時(shí)的處理函數(shù)
Private Sub DataSetMergeFailed _
(ByVal sender As Object, ByVal e As System.Data.MergeFaileedEventArgs)
…
End Sub
l 向表中加入數(shù)據(jù)
當(dāng)一個(gè)表結(jié)構(gòu)已經(jīng)創(chuàng)建好以后,剩下的問題就是如何把數(shù)據(jù)載入我們已經(jīng)建立好的表中。通常采用的方法是,先創(chuàng)建一個(gè)DataRow對(duì)象,它類似于數(shù)據(jù)庫(kù)概念中的記錄,然后對(duì)DataRow的Columns集合進(jìn)行賦值,最后把DataRow對(duì)象加入到DataTable的DataRows集合中,就相當(dāng)于在表中插入一條記錄。
例如:如下一個(gè)表MyTable中有兩個(gè)列Sqno和Name,Sqno為序號(hào),Name設(shè)為”MyName”+序號(hào),我們利用一個(gè)循環(huán)產(chǎn)生n條記錄到MyTable中
Dim i as integer
Dim n as integer
Dim MyRow as DataRow
…
For i = 0 to n
MyRow = MyTable.NewRow()
‘產(chǎn)生一條新記錄
MyRow("Sqno") = I
‘對(duì)sqno字段賦值
MyRow("Name") = "MyName" & i.ToString()
‘對(duì)name字段賦值
MyTable.Rows.Add(MyRow)
‘加入記錄到表中
Next
…
l 刪除表中記錄
DataTable的Rows集合提供了兩種方法從一個(gè)數(shù)據(jù)表中刪除一條記錄,它們是Remove方法和Delete方法。示例如下:
刪除MyTable中的第三條記錄:
MyTable.Rows.Remove(3)或者
MyTable.Rows(3).Delete
Delete方法和Remove方法的區(qū)別不僅僅是方法的使用形式上。當(dāng)調(diào)用Remove方法后,那么指定的DataRow就會(huì)從Rows集合中被刪除。而Delete方法調(diào)用時(shí),指定的DataRow并不真正從Rows集合中刪除,只是作了一個(gè)刪除標(biāo)記,直到DataSet對(duì)象調(diào)用AcceptChanges方法的時(shí)候,才真正被刪除;如果是RejectChanges方法被調(diào)用,那么Delete方法刪除的DataRow對(duì)象將被恢復(fù)。
l 使用表中的數(shù)據(jù)
對(duì)于DataTable中的每一個(gè)Row,它都可能有三種狀態(tài):Original、Current、Preposed。Original狀態(tài)是指當(dāng)數(shù)據(jù)第一次被加入到數(shù)據(jù)表中時(shí)候的狀態(tài)。Current態(tài)指經(jīng)過多次改變Original數(shù)據(jù)后得到的Row。Preposed態(tài)存在于一個(gè)相當(dāng)短暫的時(shí)期,它是由original態(tài)過渡到Current態(tài)時(shí)的中間狀態(tài),一個(gè)明顯的例子是對(duì)數(shù)據(jù)進(jìn)行修改而尚未完成時(shí),開始是Original態(tài),完成后是Current態(tài),而這之間就是Preposed態(tài)。
為了說明對(duì)表中數(shù)據(jù)的使用,我們來看下面一個(gè)例子,它是對(duì)workTable按每一個(gè)字段進(jìn)行遍歷,并把字段名和內(nèi)容顯示出來。
Dim CurrRows() As DataRow = workTable.Select(Nothing, Nothing, _
System.Data.DataViewRowState.CurrentRows)
‘對(duì)workTable數(shù)據(jù)集合選擇有效的DataRows放入CurrRows數(shù)組
Dim list As String = System.String.Empty
‘清空list字符串
Dim RowNo As Integer
Dim ColNo As Integer
For RowNo = 0 to CurrRows.Count – 1
‘每一條記錄的循環(huán)
For ColNo = 0 To workTable.Columns.Count – 1
‘一條記錄中每一個(gè)字段的循環(huán)
list = ""
list &= workTable.Columns(colNo).ColumnName & " = " & _
CurrRows(RowNo)(ColNo).ToString
Console.WriteLine(list)
Next
Next
If CurrRows.Count < 1 Then Console.WriteLine("No CurrentRows Found")
從上面的例子我們可以看出,對(duì)Rows集合使用DataTable的Select方法可以找出有效的Rows集合,然后根據(jù)Rows.count和columns.count可以確定有效的記錄數(shù)和字段數(shù),最后利用記錄索引值和列索引值可以唯一確定數(shù)據(jù)表中的任何數(shù)據(jù)。
聯(lián)系客服