占梅
(廈門南洋職業(yè)學(xué)院 福建省廈門市 361102)
ADO.SQL Server 是一個關(guān)系數(shù)據(jù)庫管理系統(tǒng),它可以使用SQL 語句對數(shù)據(jù)庫執(zhí)行各種操作,例如更新,搜索,刪除,插入數(shù)據(jù)等。接下來,我們將使用ADO.asp.net 技術(shù)進步通過net 編程了解ADO.NET 體系結(jié)構(gòu),對象,方法和屬性,ADO.SQL Server 有兩種訪問數(shù)據(jù)庫的方法。
ADO.Net 是用于處理數(shù)據(jù)的類庫。它提供了一致的對象模型,可以訪問和編輯來自各種數(shù)據(jù)源的數(shù)據(jù),并提供了一種一致的方式來處理來自這些數(shù)據(jù)源的數(shù)據(jù)。開發(fā)應(yīng)用程序時使用ADO.NET 網(wǎng)絡(luò)數(shù)據(jù)訪問技術(shù)將在應(yīng)用程序窗口或頁面中可視化地建立應(yīng)用程序窗口與數(shù)據(jù)庫之間的信息通信橋梁,并實現(xiàn)信息訪問,添加,刪除,更改和查看的交互操作。ADO.NET 有兩種數(shù)據(jù)庫訪問模式。一種是連接模式,它可以保持數(shù)據(jù)庫連接并在斷開數(shù)據(jù)庫連接之前執(zhí)行指定的SQL 語句以操作數(shù)據(jù)。在斷開連接模式下,將數(shù)據(jù)庫中的數(shù)據(jù)讀取到服務(wù)器的數(shù)據(jù)集或數(shù)據(jù)表中,并在斷開連接后操作數(shù)據(jù)。
如圖1 所示。
連接對象可用于實現(xiàn)應(yīng)用程序與數(shù)據(jù)庫之間的連接,并且不同的數(shù)據(jù)源對應(yīng)于不同的連接對象。連接對象的公共屬性是connectionstring 屬性,該屬性用于保存連接對象的數(shù)據(jù)庫連接字符串,獲取或設(shè)置數(shù)據(jù)庫連接字符串,以及state 屬性以顯示當前狀態(tài)。打開和關(guān)閉連接對象。連接對象的常見方法是open()方法(用于打開數(shù)據(jù)庫連接)和close()方法(用于關(guān)閉數(shù)據(jù)庫連接)。
與數(shù)據(jù)源連接后,可以使用命令對象在數(shù)據(jù)源上進行查詢,添加,刪除,修改和其他操作。該操作方法可以通過SQL 語句或存儲過程來實現(xiàn)。連接對象所使用的連接對象是命令對象(獲取和設(shè)置命令對象)的公共屬性的連接屬性的名稱,命令文本屬性的名稱(對數(shù)據(jù)執(zhí)行的獲取和設(shè)置SQL 語句或存儲過程)和命令類型的屬性( get 和set 命令要執(zhí)行的命令類型對。命令對象的常見方法有:executequery()方法(執(zhí)行commandtext 屬性指定的內(nèi)容并返回受影響的行數(shù)),executereader()方法(執(zhí)行commandtext 屬性指定的內(nèi)容并創(chuàng)建datareader 對象),以及executescalar()方法(執(zhí)行查詢并針對第一行第一列中返回的結(jié)果集返回查詢)。
當命令對象返回結(jié)果集時,需要datareader 對象來檢索數(shù)據(jù)。datareader 對象返回命令中的只讀,僅轉(zhuǎn)發(fā)數(shù)據(jù)流。datareader 對象的常見屬性是:fieldcount 屬性(指示從datareader 檢索到的數(shù)據(jù)行中的字段數(shù)),hasrows 屬性(指示datareader 是否包含數(shù)據(jù))和isclosed 屬性(指示datareader 對象的isclosed 屬性)。datareader對象的常見方法有:()方法讀?。ǚ祷氐谝粋€SqlDataReader 并依次讀取值),getname()方法(通過輸入列索引的名稱獲取列),getdatatypenname()方法(通過以下方式獲取列)輸入列的類型索引)和getValue()方法(通過輸入列的索引獲取列)。返回當前記錄行中指定列的值,close()方法(關(guān)閉數(shù)據(jù)讀取器對象)和isull()方法(確定具有指定索引號的列為null 并返回true 或false 的列)。
DataAdapter(或DataAdapter)對象是充當數(shù)據(jù)集對象和實際數(shù)據(jù)源之間的橋梁的對象。數(shù)據(jù)集對象是獨立于數(shù)據(jù)源的斷開連接的對象。DataAdapter 填充數(shù)據(jù)并將其數(shù)據(jù)提交到特定的數(shù)據(jù)源。它與數(shù)據(jù)集一起用于添加,查詢,修改,刪除和其他操作。通用屬性的數(shù)據(jù)適配器對象包括selectcommand 屬性(或一組用于選擇數(shù)據(jù)源記錄的語句或存儲過程),UpdateCommand 屬性(或一組用于更新數(shù)據(jù)源的語句或存儲過程)記錄),insertcommand 屬性(獲取和設(shè)置語句或存儲過程以在數(shù)據(jù)源中插入新記錄)和delete命令屬性(獲取或設(shè)置語句或存儲過程從數(shù)據(jù)源中刪除記錄)。DataAdapter 對象的常見方法是fill()方法和update()方法,該方法用從源數(shù)據(jù)讀取的行填充數(shù)據(jù)集對象。如果數(shù)據(jù)集對象中的數(shù)據(jù)發(fā)生更改,它將更新數(shù)據(jù)源。
可以將數(shù)據(jù)集視為數(shù)據(jù)容器或“內(nèi)存中的數(shù)據(jù)庫”。從數(shù)據(jù)源獲取數(shù)據(jù)時,將數(shù)據(jù)集與數(shù)據(jù)源斷開連接。您可以在數(shù)據(jù)集中添加,刪除,查詢,計數(shù)和其他記錄,并且在每次操作之后,可以將數(shù)據(jù)集中的數(shù)據(jù)發(fā)送回數(shù)據(jù)源。每個數(shù)據(jù)集都是一個或多個數(shù)據(jù)表對象的集合。DataTable 等效于數(shù)據(jù)庫中的表。數(shù)據(jù)集對象的公共屬性表:獲取數(shù)據(jù)集中包含的表的集合。您可以通過索引數(shù)據(jù)集名稱來引用表集合中的表:獲取或設(shè)置當前數(shù)據(jù)集的名稱。Clear()方法:刪除數(shù)據(jù)集對象中的所有表。Copy()方法:將一個數(shù)據(jù)集對象的結(jié)構(gòu)和數(shù)據(jù)復(fù)制到另一個DataSet 對象中。
圖1:ADO.NET 的五大對象關(guān)系圖
3.1.1 連接模式訪問數(shù)據(jù)庫的步驟
(1)創(chuàng)建連接對象并與數(shù)據(jù)庫建立連接;
(2)創(chuàng)建命令對象以在數(shù)據(jù)庫上執(zhí)行SQL 命令或存儲過程,包括添加,刪除,修改和查詢數(shù)據(jù)庫;
(3)打開與數(shù)據(jù)庫的連接;
(4)執(zhí)行命令以操作數(shù)據(jù)庫。如果查詢數(shù)據(jù)庫數(shù)據(jù),請創(chuàng)建一個datareader 對象以讀取命令查詢的結(jié)果集,并將結(jié)果集綁定到控件。
(5)關(guān)閉數(shù)據(jù)庫連接。
3.1.2 操作數(shù)據(jù)庫的兩種方法
(1)ExecuteReader()方法。executerreader()方法根據(jù)提供的select 語句返回datareader 對象,這提供了順序讀取數(shù)據(jù)庫的方法。開發(fā)人員可以使用datareader 對象的read 方法遍歷每個記錄中每個字段的內(nèi)容。
(2)ExecuteNonQuery() 方法。ExecuteNonQuery()方法執(zhí)行SQL 語句并返回受操作影響的行數(shù)。通常,數(shù)據(jù)庫中的表數(shù)據(jù)直接由update,insert,delete 或select 語句操作。executenonquery()方法返回受update,insert 和delete 語句命令影響的行數(shù)。對于select 語句,由于執(zhí)行select 語句以來數(shù)據(jù)庫沒有更改,因此返回值為-1。
3.1.3 連接模式案例
string connStr=ConfigurationManager.ConnectionStrings["Mycon nectionstring"].ConnectionString;
SqlConnection conn=new SqlConnection(connStr);//建立連接對象
conn.Open();//打開連接
SqlCommand cmd=new SqlCommand();//建立命令對象
cmd.Connection=conn;
cmd.CommandText="Select *from UserDetails where username=nameStr";
SqlDataReader reader=null;
reader.Close();
conn.Close();//關(guān)閉連接
數(shù)據(jù)集對象包含多個數(shù)據(jù)表對象,這些數(shù)據(jù)表對象存儲與數(shù)據(jù)源斷開連接的數(shù)據(jù)。DataAdapter 對象充當數(shù)據(jù)庫和內(nèi)存之間的橋梁。DataAdapter 對象的fill 方法用于將查詢結(jié)果填充到數(shù)據(jù)表中。然后,使用DataAdapter 對象的fill 方法將查詢結(jié)果填充到數(shù)據(jù)表中,關(guān)閉連接,并保持連接斷開連接。
3.2.1 使用斷開模式查詢數(shù)據(jù)的步驟
(1)創(chuàng)建連接對象并與數(shù)據(jù)庫建立連接;
(2)創(chuàng)建DataAdapter 對象并設(shè)置select 語句;
(3)創(chuàng)建數(shù)據(jù)集對象或數(shù)據(jù)表對象;
(4)用DataAdapter 的填充方法填充數(shù)據(jù)集;
(5)使用數(shù)據(jù)控件顯示數(shù)據(jù)。
3.2.2 使用斷開模式編輯數(shù)據(jù)的步驟
(1)創(chuàng)建連接對象并與數(shù)據(jù)庫建立連接;
(2)創(chuàng)建DataAdapter 對象并設(shè)置select 語句;
(3)創(chuàng)建一個commandbuilder 對象;
(4)創(chuàng)建數(shù)據(jù)集對象或數(shù)據(jù)表對象;
(5)用DataAdapter 的填充方法填充數(shù)據(jù)集;
(6)使用數(shù)據(jù)控件來插入,更新或刪除數(shù)據(jù);
(7)調(diào)用DataAdapter 對象的update 方法來更新數(shù)據(jù)庫。
3.2.3 斷開模式案例
string connStr=ConfigurationManager.ConnectionStrings["Mycon nectionString"].ConnectionString;
SqlConnection conn=new SqlConnection(connStr);
SqlDataAdapter adapter=new SqlDataAdapter("select *from UserDetails",conn);//建立數(shù)據(jù)適配器對象
SqlCommandBuilder cmd=new SqlCommandBuilder(adapter);
DataSet ds=new DataSet();//創(chuàng)建數(shù)據(jù)集
adapter.Fill(ds,"User");//填充數(shù)據(jù)集的數(shù)據(jù)表User
DataTable userTable=ds.Table["User"];
DataRow row=usertable.NewRow();
row["UserName"]=nameStr;
row["Pwd"]=pwdStr;
userTable.Rows.Add(row);
adapter.Update(ds.Tables["User"]);//更新數(shù)據(jù)
連接模式在讀取數(shù)據(jù)的過程中連接到數(shù)據(jù)庫,直到程序結(jié)束。該方法具有良好的實時性能。但是,獨占數(shù)據(jù)庫連接是獨占的。在數(shù)據(jù)量較少的情況下,如果選擇只讀優(yōu)先級,則連接模式的執(zhí)行效率仍然是可能的。從數(shù)據(jù)源獲取數(shù)據(jù)后,斷開連接模式將斷開數(shù)據(jù)源的連接。所有數(shù)據(jù)操作均針對本地數(shù)據(jù)緩存中的數(shù)據(jù)。當您需要從數(shù)據(jù)源獲取新數(shù)據(jù)或返回已處理的數(shù)據(jù)時,客戶端將連接到數(shù)據(jù)源以完成相應(yīng)的操作。此方法不會壟斷數(shù)據(jù)庫連接,但它不是實時的。斷開連接模式適用于大量數(shù)據(jù)以及需要修改和更新數(shù)據(jù)庫的情況。
因為ADO.NET 提供了一種在.NET 環(huán)境中訪問數(shù)據(jù)技術(shù)的通用解決方案。ASP.NET 更容易以連接模式或斷開模式連接和訪問數(shù)據(jù)庫,因此您可以通過它來控制遠程服務(wù)器上的數(shù)據(jù)庫。