ADO.NET相關整理

趣味理解ADO.NET對象模型

參考地址http://www.shehui001.com/htm/2009825/547.htm

數據庫的應用在我們的生活和工作中已經無處不在,無論是一個小企業的OA系統,還是中國移動的運營系統,似乎都離不開數據庫的應用。對於大多數應用程序來說,不管它們是Windows桌面應用程序,還是Web應用程序,存儲和檢索數據都是其核心功能。所以針對數據庫的開發已經成爲軟件開發的一種必備技能。如果說過去是學好數理化,走遍天下都不怕,那麼,對於今天的軟件開發者而言就是學好數據庫,走到哪兒都不怵!

ADO.NET是微軟新一代.NET數據庫的訪問架構,ADOActiveX 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則像抽水機,爲抽水提供動力和執行方法,通過水龍頭,然後把水返給上面的水管
  • DataAdapterDataReader就像輸水管,擔任着水的傳輸任務,並起着橋樑的作用。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.Opencn1connection對象),但如果這樣則需要預先設置好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方法:執行1SQL查詢,既可是選擇查詢,也可是動作查詢。如:

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、在SqlDataAdapterDataSet之間沒有直接連接。當完成SqlDataAdpater.Fill(DataSet)調用後,兩個對象之間就沒有連接了。
  二、使用介紹
  1、創建SqlDataAdapter
  
...
  
string strSQL=“Select * from Customers”;
  
SqlCommand cmd=new SqlCommand(strSQL,cn);
  
SqlDataAdapter da=new SqlDataAdapter();
  
da.SelectCommand=cmd;
  2SqlDataAdapter構造函數

  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 語句或存儲過程,用於更新數據源中的記錄。
  TableMappingsSqlDataAdapter用來將查詢的結果映射到DataSet的信息集合。
  ContinueUpdate:控制SqlDataAdapter在遇到一個錯誤之後是否繼續提交更改(默認爲false)
  2、方法
  Fill:執行存儲於SelectCommand中的查詢,並將結果存儲在DataTable中。
  FillSchema:爲存儲在SelectCommand中存儲的查詢獲取架構信息。獲取查詢中的各列名稱和數據類型。
  GetFillParameters:爲SelectCommand獲取一個包含着參數的數組。
  Update:向數據庫提交存儲在DataSet(DataTableDataRows)中的更改。該方法會返回一個整數值,其中包含着在數據存儲中成功更新的行數。
  3、事件
  FillError:當DataAdapter遇到填充DataSetDataTable的一個錯誤時,該事件被觸發。
  RowUpdated:向數據庫提交一個修改的行之後被觸發。
  RowUpdating:向數據庫提交一個修改的行之前被觸發。

 

 

ado.net DataSet數據集對象

參考地址:http://www.wangluosky.cn/show.asp?id=2302

DataSetADO.NET中的核心概念,作爲初學者,可以把DataSet想象成虛擬的表,但是這個表不能用簡單的表來表示,這個表可以想象成具有數據庫結構的表,並且這個表是存放在內存中的。由於ADO.NETDataSet的存在,開發人員能夠屏蔽數據庫與數據庫之間的差異,從而獲得一致的編程模型。

 

7.9.1  DataSet數據集基本對象

DataSet能夠支持多表、表間關係、數據庫約束等,可以模擬一個簡單的數據庫模型。DataSet對象模型如圖7-24所示。

 

 

 

7-24  DataSet對象模型

 

上圖簡要的介紹了常用對象之間的構架關係。在DataSet中,主要包括TablesCollectionRelationsCollectionExtendedProperties幾個重要對象:

 

1TablesCollection對象

 

DataSet中,表的概念是用DataTable來表示的。DataTableSystem.Data中定義,它能夠表示存儲在內從中的一張表。它包含一個ColumnsCollection的對象,代表數據表的各個列的定義。同時,它也包含RowsCollection對象,這個對象包含DataTable中的所有數據。

 

2RelationsCollection對象

 

在各個DataTable對象之間,是通過使用RelationsCollection來表達各個DataTable對象之間的關係。RelationsCollection對象可以模擬數據庫中的約束的關係。例如當一個包含外鍵的表被更新時,如果不滿足主鍵-外鍵約束,這個更新操作就會失敗,系統會拋出異常。

 

3ExtendedProperties對象

 

ExtendedProperties對象能夠配置特定的信息,例如DataTable的密碼,更新時間等等。

 

7.9.2  DataTable數據表對象

DataTableDataSet中的常用的對象,它和數據庫中的表的概念十分相似。開發人員能夠將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對象,並通過DataTableColumns.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(); //使用DataTableNewRow方法創建一個新DataRow對象

 

上述代碼使用DataTableNewRow方法創建一個新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。值得注意的是,DataSetDataTable的集合,可以使用DataSetAdd方法將多個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列;這種方法指定了ColumnNameDataType屬性。

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上的ColumnsCollectionAdd方法有兩個重載(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. dcdt.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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章