趣味理解ADO.NET對象模型
參考地址http://www.shehui001.com/htm/2009825/547.htm
數據庫的應用在我們的生活和工作中已經無處不在,無論是一個小企業的OA系統,還是中國移動的運營系統,似乎都離不開數據庫的應用。對於大多數應用程序來說,不管它們是Windows桌面應用程序,還是Web應用程序,存儲和檢索數據都是其核心功能。所以針對數據庫的開發已經成爲軟件開發的一種必備技能。如果說過去是“學好數理化,走遍天下都不怕”,那麼,對於今天的軟件開發者而言就是“學好數據庫,走到哪兒都不怵!”。
ADO.NET是微軟新一代.NET數據庫的訪問架構,ADO是ActiveX Data Objects的縮寫。ADO.NET是數據庫應用程序和數據源之間溝通的橋樑,主要提供一個面向對象的數據訪問架構,用來開發數據庫應用程序。
爲了更好地理解ADO.NET的架構模型的各個組成部分,我們可以對ADO.NET中的相關對象進行圖示理解,如圖5-3所示的是ADO.NET中數據庫對象的關係圖。
圖5-3 ADO.NET對象模型
我們可以用趣味形象化的方式理解ADO.NET對象模型的各個部分,如圖5-4所示,可以看出這些對象所處的地位和對象間的邏輯關係。
ADO.NET趣味理解圖
對比ADO.NET的數據庫對象的關係圖,我們可以用對比的方法來形象地理解每個對象的作用,如圖5-4所示。
- 數據庫好比水源,存儲了大量的數據。
- Connection好比伸入水中的進水籠頭,保持與水的接觸,只有它與水進行了“連接”,其他對象纔可以抽到水。
- Command則像抽水機,爲抽水提供動力和執行方法,通過“水龍頭”,然後把水返給上面的“水管”。
- DataAdapter、DataReader就像輸水管,擔任着水的傳輸任務,並起着橋樑的作用。DataAdapter 像一根輸水管,通過發動機,把水從水源輸送到水庫裏進行保存。DataReader 也是一種水管,和DataAdapter不同的是,DataReader不把水輸送到水庫裏面,而是單向地直接把水送到需要水的用戶那裏或田地裏,所以要比在水庫中轉一下更快更高效。
- DataSet則是一個大水庫,把抽上來的水按一定關係的池子進行存放。即使撤掉“抽水裝置”(斷開連接,離線狀態),也可以保持“水”的存在。這也正是ADO.NET的核心。
- DataTable則像水庫中的每個獨立的水池子,分別存放不同種類的水。一個大水庫由一個或多個這樣的水池子組成。
Connection 物件
Connection 對象主要是開啓程序和數據庫之間的連結。沒有利用連結對象將數據庫打開,是無法從數據庫中取得數據的。這個物件在ADO.NET 的最底層,我們可以自己產生這個對象,或是由其它的對象自動產生。
Command 物件
Command 對象主要可以用來對數據庫發出一些指令,例如可以對數據庫下達查詢、新增、修改、刪除數據等指令,以及呼叫存在數據庫中的預存程序等。這個對象是架構在Connection 對象上,也就是Command 對象是透過連結到數據源
DataAdapter 物件
DataSetCommand 對象主要是在數據源以及DataSet 之間執行數據傳輸的工作,它可以透過Command 對象下達命令後,並將取得的數據放入DataSet 對象中。這個對象是架構在Command對象上,並提供了許多配合DataSet 使用的功能。在Beta 2 版中DataSetCommand 物件會更名爲DataAdapter。
DataSet 物件
DataSet 這個對象可以視爲一個暫存區(Cache),可以把從數據庫中所查詢到的數據保留起來,甚至可以將整個數據庫顯示出來。DataSet 的能力不只是可以儲存多個Table 而已,還可以透過DataSetCommand 對象取得一些例如主鍵等的數據表結構,並可以記錄數據表間的關聯。DataSet 對象可以說是ADO.NET 中重量級的對象,這個對象架構在DataSetCommand 對象上,本身不具備和數據源溝通的能力;也就是說我們是將DataSetCommand 對象當做DataSet 對象以及數據源間傳輸數據的橋樑。
DataReader 物件
當我們只需要循序的讀取數據而不需要其它操作時,可以使用DataReader 對象。DataReader對象只是一次一筆向下循序的讀取數據源中的數據,而且這些數據是隻讀的,並不允許作其它的操作。因爲DataReader 在讀取數據的時候限制了每次只讀取一筆,而且只能只讀,所以使用起來不但節省資源而且效率很好。使用DataReader 對象除了效率較好之外,因爲不用把數據全部傳回,故可以降低網絡的負載。
ADO.NET Connection方法簡介
大家有知道在ADO.NET中有七個對象,這裏就不在一一的介紹了,今天我們只對在ADO.NET中重要的對象之一Connection對象的方法和大家一起分享一下。
1.ADO.NET Connection方法使用Open
建立與數據源的物理連接。格式:
1. connection.Open ConnectionString,UserID,Password,Options
注意:該方法是使Connection獲得初始化的方法,只有使用了該方法,Connection對象才真正在內存中存在。後面的參數都是可選參數,最簡單如:cn.Open(cn是1個connection對象),但如果這樣則需要預先設置好ConnectionString 等參數。其中,connectionstring是前面提到的連接字符串,UserID是建立連接的用戶的代號,Password是建立連接的用戶的密碼。該參數會覆蓋掉在連接字符串中設置的密碼;options提供了連接選擇,可選值只有adAsyncConnect異步連接,缺省爲-1同步連接。
2.ADO.NET Connection方法使用Close
關閉1個數據連接對象,使該連接對象只留在本機內存中,可對其屬性更改後再重新建立連接。(注:如果不是關閉對象,而是將對象從內存中清除,應使用 Set connection對象變量=Nothing.).獲取數據源上的有關信息:OpenSchema方法,該方法獲取與數據源有關的信息,如獲取數據源中所有表的名稱等。格式:Set Recordset對象=cn.OpenSchema(查詢類別,[明細條目])。兩個參數都是常數值,其中,每個查詢類別中包含多個明細條目,每個明細條目作爲返回的Recordset的一個字段,可以省略第二個參數,這時返回指定類別下的所有明細條目的信息生成一個Recordset。例如類別爲 “表”adSchemaTables常數中包含了TABLE_NAME(表名稱)和TABLE_TYPE(表類型)等多個明細項目常數,而主要應瞭解類別常數adSchema…以得到數據源某方面信息,可以查對象瀏覽器。舉例如下(得到所有表名):
2. Dim rstSchema As ADODB.Recordset
3. Private Sub Form_Load()
4. DataEnvironment1.Command1 '初始化數據環境
5. Set rstSchema = DataEnvironment1.Connection1.OpenSchema(adSchemaTables)
6. Do While Not rstSchema.EOF '獲取所有表名
7. List1.AddItem rstSchema.Fields("TABLE_NAME")
8. rstSchema.MoveNext
9. Loop
10. Set MSHFlexGrid1.DataSource = rstSchema '可看到更多信息。
11. End Sub
Execute方法:執行1個SQL查詢,既可是選擇查詢,也可是動作查詢。如:
12. cn.Execute "Delete From BB where 姓名 like '嫖客店'"
但要注意:使用ADO.NET Connection方法的Execute方法返回的遊標類型是最基本的只能讀和只能向前移動的遊標adOpenForwardOnly,因此,如果該方法執行一個選擇查詢返回一個記錄集時特別要明白。舉一個完整的例子如下:
13. Dim cn As ADODB.Connection
14. Dim rst As ADODB.Recordset
15. Private Sub Command2_Click()
16. rst.MoveNext
17. Print rst("姓名")
18. End Sub
19. Private Sub Form_Load()
20. Set cn = New ADODB.Connection
21. Set rst = New ADODB.Recordset
22. cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=C:/WINDOWS/Desktop/lxn.mdb" 連接字符串
23. cn.Open 連接
24. cn.Execute "Delete From BB where 姓名 like '嫖客店'" 動作查詢
25. Set rst = cn.Execute("Select * from BB") 選擇查詢,生成記錄集
26. Do While Not rst.EOF
27. List1.AddItem rst("姓名")
28. rst.MoveNext
29. Loop
30. End Sub
ADO.NET Command對象簡介
Command 對象簡介
Command 對象最主要的工作是透過Connection 對象對數據源下達操作數據庫的命令。
我們以下列語法產生Command 對象:
Dim cmA As Command = New ADOCommand
或是在產生對象的時候順便指定屬性:
Dim cmA As Command = New ADOCommand("CommandText",ActiveConnection)
Command 對象常用的屬性:
屬性 |
說明 |
ActiveConnection |
設定要透過哪個連結對象下命令 |
CommandBehavior |
設定Command 對象的動作模式 |
CommandType(Text/TableDirect/StoredProcedure)
|
命令型態(SQL 陳述、數據表名稱、預存程序) |
CommandText |
要下達至數據源的命令 |
CommandTimeout |
指令逾時時間 |
Parameters |
參數集合 |
RecordsAffected |
受影響的紀錄筆數 |
範例中直接輸入數據表名稱,將數據表中的所有數據傳回:
Dim cmA As Command
cmA.CommandType=CommandType.TableDirect
cmA.CommandText="Members"
Command 對象常用的方法
Execute 透過Connection 對象下達命令至數據源
Cancel 放棄命令的執行
ExecuteNonQuery 使用本方法表示所下達的命令不會傳回任何紀錄
Prepare 將命令以預存程序儲存於數據源,以加快後續執行效率
產生獨立的Command 對象
使用Command 對象,不一定要明確地宣告一個Connection 對象。可以在產生Command
對象的時候,將ActiveConnection 參數所要指定的連結對象改成ConnectionString 即可。不過
獨立的Command 對象並不代表不需要Connection 對象,而是由Command 對象來自動產生它。在使用獨立的Command 對象之前要明確的將連結打開,我們可以利用ActiveConnection.Open()方法來開啓連結,如下所示:
Dim cmA As ADOCommand = New _
ADOCommand("SQL 陳述", "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:/Inetpub/wwwroot/cr/ch05/MyWeb.mdb;" & _"User ID=Admin"
cmA.ActiveConnection.Open() '將連結打開
下面例子將使用者信息輸入到數據庫中:
Sub btnSubmit_Click(Sender As Object, e As EventArgs)
Dim strConStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:/InetPub/wwwroot/CR/CH05/MyWeb.mdb"
Dim cmA As ADOCommand = New ADOCommand("",strConStr)
CmA.ActiveConnection.Open()
cmA.CommandText="Insert Into Members Values('" & _
Text1.Value & "','" & Text2.Value & "’,'" & _
Text3.Value & "','" & Text4.Value & "','" & _
Text5.Value & "','" & Text6.Value & "')"
cmA.Execute()
Sp1.InnerText="這個敘述影響了" & cmA.RecordsAffected & "筆資料"
End Sub
ADO.NET讀書筆記系列之------SqlDataAdapter對象
一、特點介紹
1、表示用於填充 DataSet 和更新 SQL Server 數據庫的一組數據命令和一個數據庫連接。
2、在SqlDataAdapter和DataSet之間沒有直接連接。當完成SqlDataAdpater.Fill(DataSet)調用後,兩個對象之間就沒有連接了。
二、使用介紹
1、創建SqlDataAdapter
...
string strSQL=“Select * from Customers”;
SqlCommand cmd=new SqlCommand(strSQL,cn);
SqlDataAdapter da=new SqlDataAdapter();
da.SelectCommand=cmd;
2、SqlDataAdapter構造函數
①string strConn=“Provider=.....”;
string strSQL=“select * from Customers”;
SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
②string strConn=“Provider=.....”;
SqlConnection cn=new SqlConnection(strConn);
SqlDataAdapter da=new SqlDataAdapter(“select * from Customers”,cn);
③string strConn=“Provider=.....”;
string strSQL=“select * from Customers”;
SqlConnection cn=new SqlConnection(strConn);
SqlCommand cmd=new SqlCommand(strSQL,cn);
SqlDataAdapter da=new SqlDataAdapter(cmd);
3、從查詢中獲取結果
①使用Fill方法
...
SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
DataSet ds=new DataSet();
da.Fill(ds); //這裏ds中的表名爲Table
②使用Fill方法創建DataTable對象和DataColumn對象
...
SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
da.TableMapping.Add(“Table”,“Customers”);
DataSet ds=new DataSet();
da.Fill(ds);
③使用重載Fill方法
SqlDataAdapter.Fill(DataSet,“Customers”);
SqlDataAdapter.Fill(DataTable);
SqlDataAdapter.Fill(DataSet,intStartRecord,intNumRecords,“TableName”);
④開放和關閉連接
如果調用了一個SqlDataAdapter對象的Fill方法,而SelectCommand屬性的Connection關閉了,那麼SqlDataAdapter就會開放一個連接,然後提交查詢、獲取結果、最後關閉連接。如果在調用前開放了Connection,那麼操作之後仍然保持開放。
...
SqlDataAdapter daCustomers,daOrders;
daCustomers=new SqlDataAdapter(“Select * from Customers”,cn);
daOrders=new SqlDataAdapter(“Select * from Orders”,cn);
DataSet ds=new DataSet();
cn.Open();
daCustomers.Fill(ds);
daOrders.Fill(ds);
cn.Close();
⑤多次調用Fill方法
刷新DataSet中的數據,最簡單的解決方法就是清空DataSet(或DataTable),然後再次調用DataAdapter對象的Fill方法。
三、屬性方法事件介紹
1、屬性
①AcceptChangeDuringFill:確定由DataAdapter所獲取的行的RowState(默認爲True)。
②DeleteCommand:獲取或設置一個 Transact-SQL 語句或存儲過程,以從數據集刪除記錄。
③InsertCommand:獲取或設置一個 Transact-SQL 語句或存儲過程,以在數據源中插入新記錄。
④SelectCommand:獲取或設置一個 Transact-SQL 語句或存儲過程,用於在數據源中選擇記錄。
⑤UpdateCommand:獲取或設置一個 Transact-SQL 語句或存儲過程,用於更新數據源中的記錄。
⑥TableMappings:SqlDataAdapter用來將查詢的結果映射到DataSet的信息集合。
⑦ContinueUpdate:控制SqlDataAdapter在遇到一個錯誤之後是否繼續提交更改(默認爲false)。
2、方法
①Fill:執行存儲於SelectCommand中的查詢,並將結果存儲在DataTable中。
②FillSchema:爲存儲在SelectCommand中存儲的查詢獲取架構信息。獲取查詢中的各列名稱和數據類型。
③GetFillParameters:爲SelectCommand獲取一個包含着參數的數組。
④Update:向數據庫提交存儲在DataSet(或DataTable、DataRows)中的更改。該方法會返回一個整數值,其中包含着在數據存儲中成功更新的行數。
3、事件
①FillError:當DataAdapter遇到填充DataSet或DataTable的一個錯誤時,該事件被觸發。
②RowUpdated:向數據庫提交一個修改的行之後被觸發。
③RowUpdating:向數據庫提交一個修改的行之前被觸發。
ado.net DataSet數據集對象
參考地址:http://www.wangluosky.cn/show.asp?id=2302
DataSet是ADO.NET中的核心概念,作爲初學者,可以把DataSet想象成虛擬的表,但是這個表不能用簡單的表來表示,這個表可以想象成具有數據庫結構的表,並且這個表是存放在內存中的。由於ADO.NET中DataSet的存在,開發人員能夠屏蔽數據庫與數據庫之間的差異,從而獲得一致的編程模型。
7.9.1 DataSet數據集基本對象
DataSet能夠支持多表、表間關係、數據庫約束等,可以模擬一個簡單的數據庫模型。DataSet對象模型如圖7-24所示。
圖7-24 DataSet對象模型
上圖簡要的介紹了常用對象之間的構架關係。在DataSet中,主要包括TablesCollection、RelationsCollection、ExtendedProperties幾個重要對象:
1.TablesCollection對象
在DataSet中,表的概念是用DataTable來表示的。DataTable在System.Data中定義,它能夠表示存儲在內從中的一張表。它包含一個ColumnsCollection的對象,代表數據表的各個列的定義。同時,它也包含RowsCollection對象,這個對象包含DataTable中的所有數據。
2.RelationsCollection對象
在各個DataTable對象之間,是通過使用RelationsCollection來表達各個DataTable對象之間的關係。RelationsCollection對象可以模擬數據庫中的約束的關係。例如當一個包含外鍵的表被更新時,如果不滿足主鍵-外鍵約束,這個更新操作就會失敗,系統會拋出異常。
3.ExtendedProperties對象
ExtendedProperties對象能夠配置特定的信息,例如DataTable的密碼,更新時間等等。
7.9.2 DataTable數據表對象
DataTable是DataSet中的常用的對象,它和數據庫中的表的概念十分相似。開發人員能夠將DataTable想象成一個表。並且可以通過編程的方式創建一個DataTable表。示例代碼如下所示。
DataTable Table = new DataTable("mytable"); //創建一個DataTable對象
Table.CaseSensitive = false; //設置不區分大小寫
Table.MinimumCapacity = 100; //設置DataTable初始大小
Table.TableName = "newtable"; //設置DataTable的名稱
上述代碼創建了一個DataTable對象,併爲DataTable對象設置了若干屬性,這些屬性都是常用的屬性,其作用分別如下所示。
q CaseSensitive:此屬性設置表中的字符串是否區分大小寫,若無特殊情況,一般設置爲false,該屬性對於查找,排序,過濾等操作有很大的影響。
q MinimumCapacity:設置創建的數據表的最小的記錄空間。
q TableName:指定數據表的名稱。
一個表必須有一個列,而DataTable必須包含列。當創建了一個DataTable後,就必須向DataTable中增加列的。表中列的集合形成了二維表的數據結構。開發人員可以使用Columns集合的Add方法向DataTable中增加列,Add方法帶有兩個參數,一個是表列的名稱,一個是該列的數據類型。示例代碼如下所示。
DataTable Table = new DataTable("mytable"); //創建一個DataTable
Table.CaseSensitive = false; //設置不區分大小寫
Table.MinimumCapacity = 100; //設置DataTable初始大小
Table.TableName = "newtable"; //設置DataTable的名稱
DataColumn Colum = new DataColumn(); //創建一個DataColumn
Colum = Table.Columns.Add("id", typeof(int)); //增加一個列
Colum = Table.Columns.Add("title", typeof(string)); //增加一個列
上述代碼創建了一個DataTable和一個DataColumn對象,並通過DataTable的Columns.Add方法增加DataTable的列,這兩列的列名和數據類型如下:
q 新聞ID:整型,用於描述新聞的編號。
q 新聞標題TITLE:字符型,用於描述新聞發佈的標題。
注意:上述代碼中,DataTable的列的數據類型使用的只能是.net中數據類型,因爲其並不是真實的數據庫,所以不能直接使用數據庫類型,必須使用typeof方法把.net中的數據類型轉換成數據庫類型。
7.9.3 DataRow數據行對象
在創建了表和表中列的集合,並使用約束定義表的結構後,可以使用DataRow對象向表中添加新的數據庫行,這一操作同數據庫中的INSERT語句的概念類似。插入一個新行,首先要聲明一個DataRow類型的變量。使用NewRow方法能夠返回一個新的DataRow對象。DataTable會根據DataColumnCollection定義的表的結構來創建DataRow對象。示例代碼如下所示。
DataRow Row = Table.NewRow(); //使用DataTable的NewRow方法創建一個新DataRow對象
上述代碼使用DataTable的NewRow方法創建一個新DataRow對象,當使用該對象添加了新行之後,必須使用索引或者列名來操作新行,示例代碼如下所示。
Row[0] = 1; //使用索引賦值列
Row[1] = "datarow"; //使用索引賦值列
上述代碼通過索引來爲一行中個各列賦值。從數組的語法可以知道,索引都是從第0個位置開始。將DataTable想象成一個表,從左到右從0開始索引,直到數值等於列數減1爲止。爲了提高代碼的可讀性,也可以通過直接使用列名來添加新行,示例代碼如下所示。
Row["bh"] = 1; //使用列名賦值列
Row["title"] = "datarow"; //使用列名賦值列
通過直接使用列名來添加新行與使用索引添加新行的效果相同,但是通過使用列名能夠讓代碼更加可讀,便於理解,但是也暴露了一些機密內容(如列值)。在數據插入到新行後,使用Add方法將該行添加到DataRowCollection中,示例代碼如下所示。
Table.Rows.Add(Row); //增加列
7.9.4 DataView數據視圖對象
當需要顯示DataRow對象中的數據時,可以使用DataView對象來顯示DataSet中的數據。在顯示DataSet中的數據之前,需要將DataTable中的數據填充到DataSet。值得注意的是,DataSet是DataTable的集合,可以使用DataSet的Add方法將多個DataTable填充到DataSet中去,示例代碼如下所示。
DataSet ds = new DataSet(); //創建數據集
ds.Tables.Add(Table); //增加表
填充完成後,可以通過DataView對象來顯示DataSet數據集中的內容,示例代碼如下所示。
dv = ds.Tables["newtable"].DefaultView; //設置默認視圖
DataSet對象中的每個DataTable對象都有一個DefaultView屬性,該屬性返回表的默認試圖。上述代碼訪問了名爲newtable表的DataTable對象。開發人員能夠自定義DataView對象,該對象能夠篩選表達式來設置DataView對象的RowFilter屬性,篩選表達式的值必須爲布爾值。同時,該對象能夠設置Sort屬性進行排序,排序表達式可以包括列名或一個算式,示例代碼如下所示。
DataView dv = new DataView(); //創建數據視圖對象
DataSet ds = new DataSet(); //創建數據集
ds.Tables.Add(Table); //增加數據表
dv = ds.Tables["newtable"].DefaultView; //設置默認視圖
dv.RowFilter = "id" = "1"; //設置篩選表達式
dv.Sort = "id"; //設置排序表達式
技巧:要顯示DataSet中某項的值,可以使用語法ds.Tables[“表名稱”].Rows[0][“列名稱”].ToString()來顯示,這種語法通常需要知道行的數目以免在訪問數據時越界。
ADO.NET DataReader對象簡介
http://august.blog.51cto.com/59588/6961
DataReader 對象
如果我們利用Command 對象所執行的命令是有傳回數據的Select 敘述,此時Command 對象
會自動產生一個DataReader 對象。DataReader 是我們寫ASP.NET 網頁的好朋友,因爲我們
常常會將數據源的數據取出後顯示給使用者,這時候我們就可以使用DataReader 對象。我們就
可以在執行Execute 方法時傳入一個DataReader 型態的變量來接收。DataReader 對象很單純
的一次只讀取一筆紀錄,而且只能只讀,所以效率很好而且可以降低網絡負載。由於Command
對象自動會產生DataReader 對象,所以我們只要宣告一個指到DataReader 對象的變量來接收
即可,並不需要使用New 運算子來產生;另外要注意的是 DataReader 對象只能配合Command對象使用 ,而且DataReader 對象在操作的時候Connection 對象是保持聯機的狀態。
下列程序代碼片段傳回可以讀取Members 數據表中所有的紀錄的DataReader 對象:
Dim cmA As ADOCommand= New
ADOCommand("命令字符串","Provider=Microsoft.Jet.OLEDB.4.0;"
& "Data Source=C:/Inetpub/wwwroot/cr/ch05/MyWeb.mdb")
Dim drA as ADODataReader
cmA.ActiveConnection.Open()
cmA.CommandText="Select * From Members"
cmA.Execute(drA)
當我們將DataReader 對象傳入Execute 方法後,就可以使用DataReader 對象來讀取數據了。
以下爲DataReader 常用的屬性:
屬性 說明
FieldCount 只讀,表示紀錄中有多少字段
HasMoreResults 表示是否有多個結果,本屬性和SQL Script 搭配使用。
HasMoreRows 只讀,表示是否還有資料未讀取
IsClosed 只讀,表示DataReader 是否關閉
Item 只讀,本對象是集合對象,以鍵值(Key)或索引值(Index)的方式取得紀錄中某個字段的數據
RowFetchCount 用來設定一次取回多少筆記錄,預設爲值爲1 筆
瞭解DataReader 對象有什麼屬性後,我們就可以利用DataReader 所提供的方法來取回資料了。
下表爲DataReader 常用的方法:
方法 說明
Close 將DataReader 對象關閉
GetDataTypeName 取得指定字段的數據型態
GetName 取得指定字段的字段名稱
GetOrdinal 取得指定字段名稱在紀錄中的順序
GetValue 取得指定字段的數據
GetValues 取得全部字段的數據
IsNull 用來判斷字段內是否爲Null 值
NextResult 用來和SQL Script 搭配使用,表示取得下一個結果
Read 讓DataReader 讀取下一筆記錄,如果有讀到數據則傳回True,若沒有紀錄則傳回False
Read 方法
在取得Command 對象執行Execute 方法所產生的DataReader 對象後,我們就可以將紀錄中
的數據取出使用。DataReader 一開始並沒有取回任何數據,所以我們要先使用Read 方法讓
DataReader 先讀取一筆數據回來。如果DataReader 對象成功取得數據則傳回True,若沒有取
得資料則傳回False。這樣一來我們就可以利用Do While...Loop 循環來取得所有的數據,如下
程序所示:
Do While drA.Read()
Response.Write("User Id: " & drA.Item("UserId") & ", Password: ")
Response.Write(drA.Item(1) & "<br>")
Loop
上述程序代碼片段利用Read 方法將數據取回後,再利用Item 集合以鍵值(Key)的方式取出
UserId 字段的數據,以及利用索引值(Index)取得使用者UserPwd 字段的數據;索引值是由0
開始計數,故第一個字段的索引值爲0,依此類推。當數據讀取完畢後Read 方法會傳回False,
所以就跳出循環。
GetValue 方法
我們也可以使用GetValue 方法取得指定字段內的記錄,這個方法和Item 屬性很像;不過
GetValue 方法的參數只接收索引值,並不接收鍵值爲參數。我們改用GetValue 取得所有字段
內的數據,如下程序所示:
Do While drA.Read()
Response.Write("User Id: " & drA.GetValue(0) & ", Password: ")
Response.Write(drA.GetValue(1) & "<br>")
Loop
GetValues 方法
GetValues 方法是取得字段內所有的記錄。這個方法接收一個數組,並且將所有字段填入數組中,如下程序所示:
Dim arValue(drA.FieldCount)
drA.Read() '先抓取一筆記錄
drA.GetValues(arValue) '將記錄填入數組中
For shtI=0 To drA.FieldCount - 1
Response.Write(drA.GetValue(shtI) & "<br>")
Next
因爲索引值是由零開始算,所以我們在使用For...Next 循環的時候記得將結束值減一。
GetDataTypeName 以及GetName 方法
GetDataTypeName 方法可以傳回指定字段的數據型態,而GetName 方法則是傳回指定字段的
字段名稱(就是鍵值)。這兩個方法一樣以鍵值或是索引的方式來指定字段。下列程序代碼片段
顯示每個字段的名稱以及數據型態:
Dim shtI As Short
For shtI = 0 To drA.FieldCount - 1
Response.Write("索引值爲 " & shtI.ToString & " 的字段, 名稱爲: " & _
DrA.GetName(shtI) & ", 數據型態: " & DrA.GetDataTypeName(shtI) &
"<br>")
Next
Close 方法
Close 方法可以關閉DataReader 對象和數據源之間的聯機。除非把DataReader 對象關閉,否
則當DataReader 對象尚未關閉時,DataReader 所使用的Connection 對象就無法執行其它的
動作。
綜合範例
下列範例在文字輸入盒內輸入數據表名稱,按下確定後程序會將數據表的索引、字段名稱、字段
型態以及字段內容全部顯示出來:
<%@Import Namespace=System.Data.ADO%>
<%@Import Namespace=System.Data%>
<Html>
<Form Id="F1" Runat="Server">
<Input Id="Text1" Runat="Server" Value="Members"/>
<Button Id="Button1" OnServerClick="Button1_Click"
Runat="Server">執行
</Button>
</Form>
<Script Language="VB" Runat="Server">
Sub Button1_Click(sender As Object, E As EventArgs)
Dim cmA As ADOCommand=New _
ADOCommand("","Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:/Inetpub/wwwroot/cr/ch05/MyWeb.mdb")
Dim drA As ADODataReader
Dim shtI As Short
cmA.ActiveConnection.Open()
cmA.CommandType=CommandType.TableDirect
cmA.CommandText=Text1.Value
cmA.Execute(drA)
For shtI=0 To drA.FieldCount - 1
Response.Write("字段索引值: " & shtI.ToString & _
" 字段名稱: " & drA.GetName(shtI) & _
" 數據型態: " & drA.GetDataTypeName(shtI) & "<br>")
Next
Do While drA.Read()
For shtI=0 To drA.FieldCount-1
Response.Write(drA.GetValue(shtI) & " / ")
Next
Response.Write("<br>")
Loop
End Sub
</SCRIPT>
</Html>
五分鐘教你理解ADO.NET數據表
http://developer.51cto.com/art/200911/161041.htm
ADO.NET還是比較常用的,於是我研究了一下ADO.NET數據表,ADO.NET數據表(DataTable)是指內存數據表,在這裏拿出來和大家分享一下,希望對大家有用。它包含一個表示該表的模式的列集合(ColumnsCollection)。一個數據表還包含有一個列集合(RowsCollection),表示該表所擁有的數據。它記得最初的的狀態以及當前的狀態,並跟蹤已經發生的各種變化。要使用數據表,用戶必須包含System.Data。
創建ADO.NET數據表
1. DataTable有兩個構造函數:
2. public DataTable()
3. public DataTable(string tableName)
給ADO.NET數據表添加列
DataTable包含一個DataColumn對象集合。這個列集合定義了該表的結構。要給這個集合添加一個新列,可以使用這個集合的Add方法。在下面的例子中,我們使用ColumnsCollection類的Add方法,給一個數據表添加了3列;這種方法指定了ColumnName和DataType屬性。
4. DataColumn dc = null;
5. DataTable dt = new DataTable("test");
6. dc = dt.Columns.Add("CustID",System.Type.GetType("System.Int32") );
7. dc = dt.Columns.Add("CustomerNameLast", System.Type.GetType("System.String") );
8. dc = dt.Columns.Add("CustomerNameFirst", System.Type.GetType("System.String") );
9. dc = dt.Columns.Add("Purchases", System.Type.GetType("System.Double") );
DataTable上的ColumnsCollection的Add方法有兩個重載(overload)函數:
10. Public DataColumn Add(String columnname, Type type)
11. Public DataColumn Add(String columnname)
表達式列
ADO.NET還允許用戶創建和定義表達式列。ADO+中的表達式用於進行:過濾, 計算, 彙總列信息。要創建一個表達式列,需要將DataType屬性設置爲適合該表達式返回數值的類型;然後將Expression屬性設爲一個有效的表達式:
12. DataColumn dc = New DataColumn;
13. dc.DataType = System.Type.GetType("System.Currency");
14. dc.Expression = "total * .086";
你還可以使用Add方法來創建一個表達式列。例如,下面的代碼添加了一列,根據客戶購買金額的10%計算折扣。這個表達式將名爲“Purchases”的列乘以10%。
15. DataColumn dc = New DataColumn;
16. dc= dt.Columns.Add("rectg", System.Type.GetType("System.Double"), "total * 0.1");
當這個表加入數據後,這個列的數值將是total列中數值的10%
自動增量列
DataColumn 的另一個特性是其能夠作爲自動增量列的能力。自動增量列在添加新列時,自動增加該列中的數值。要創建一個自動增量列,需要將這個列的 AutoIncrement屬性設爲真(true)。一旦設置了這個屬性,該列開始時將使用該列的AutoIncrementSeed屬性中定義的數值。在添加了一列後,自動增量列的數值將按該列的AutoIncrementStep屬性中的數值作爲步長遞增。
17. dc = dt.Columns.Add("CustID",System.Type.GetType("System.Int32") );
18. dc.AutoIncrement = true;
19. dc.AutoIncrementSeed = 1;
20. dc.AutoIncrementStep = 1;