ado.net被管理的提供者能夠在這些ole db 提供者下工作。
驅動程序 driver
提供者 provider
sqloledb
sql ole db provider
msdaora
oracle ole db provider
jolt
jet ole db provider
msdasql/sqlserver odbc
sql server odbc driver via ole db for odbc provider
msdasql/jet odbc
jet odbc driver via ole db provider for odbc provider
現在ado.net還不支持 msdasql/oracle odbc driver(oracle ole db driver for odbc)
ado.net的核心組件:
connections--連接和管理數據庫事務。
commands--向數據庫發送的命令。
datareaders--直接讀取流數據。
datesets 和 datesetcommands--對駐留內存中的數據進行存儲和操作.
核心的ado.net功能基本上可以被概括為如下內容:
connection對象在web頁面和數據庫間建立連接。commands對象向數據庫提供者發出命令,返回的結果以一種流的方式貫穿于這些連接中。結果集可以用datareaders快速的讀取,也可以儲存到駐留內存的datesets對象中,然后通過datesetcommands對象讓用戶在數據集中訪問和操作記錄。開發者可以用過dateset內置的方法在基礎的數據源上去處理數據集。
為了使用.net框架中的被管理提供者,需要把下面的名空間(namespaces)包括到.aspx頁面中。
sql被管理的提供者:
<%@ import namespace="system.data.sql" %>
ado被管理的提供者:
<%@ import namespace="system.data.ado" %>
connections
微軟在.net框架中提供了兩個connection對象以建立連接到特定的數據庫:sqlconnection和 adoconnection。connection對象能在已經創建的連接上通過調用open的方法來被明確的打開連接。下面的代碼片斷演示了用任一提供者創建和打開連接。
sqlconnection
[c#]
string connectionstring = "server=localhost; uid=sa; pwd=; database=northwind";
sqlconnection myconn = new sqlconnection(connectionstring);
myconn.open();
adoconnection
[c#]
string connectionstring = "provider=sqloledb.1; data source=localhost; uid=sa; pwd=; initial catalog=northwind;"
adoconnection myconn = new adoconnection(connectionstring);
myconn.open();
commands
在建立了連接以后,下一步要做的就是對數據庫運行的sql語句。最簡單直接的方法是通過ado和sql命令對象來實現。
command對象可以給予提供者一些該如何操作數據庫信息的指令。
一個命令(command)可以用典型的sql語句來表達,包括執行選擇查詢(select query)來返回記錄集,執行行動查詢(action query)來 更新(增加、編輯或刪除)數據庫的記錄,或者創建并修改數據庫的表結構。當然命令(command)也可以傳遞參數并返回值。
commands可以被明確的界定,或者調用數據庫中的存儲過程。接下來的小段代碼證明了在建立連接之后如何去發出一個select命令。
sqlcommand
[c#]
string sqlstmt = " select * from customers";
sqlcommand mycommand = new sqlcommand(sqlstmt, myconn);
adocommand
[c#]
string sqlstmt = " select * from customers";
adocommand mycommand = new adocommand(sqlstmt, myconn);
datareaders
當你處理大量數據的時候,大量內存的占用會導致性能上的問題。例如,一個連接(connection)用傳統的ado recordset對象去讀1000行數據庫的記錄,就必須為這1000行記錄將內存分配給這個連接直至這個連接的生命周期結束。如果有1000用戶在同一時間對同一計算機進行同樣的操作,內存被過度的使用就會成為關鍵性的問題。
為了解決這些問題,.net框架包括了datareaders對象,而這個對象僅僅從數據庫返回一個只讀的,僅向前數據流。而且當前內存中每次僅存在一條記錄。
datareader接口支持各種數據源,比如關系數據和分級數據。datareader可以適用于在運行完一條命令僅需要返回一個簡單的只讀記錄集。
下面的代碼片斷闡述了怎么樣聲明變量指向一個datareader對象的實例,還包括代碼執行時command對象產生的結果。當調用command對象執行方法時,command對象必須已經被創建和作為參數來傳遞。繼續上面的例子:
sqldatareader
[c#]
sqldatareader myreader = null;
mycommand.execute(out myreader);
adodatareader
[c#]
adodatareader myreader = null;
mycommand.execute(out myreader);
接下來這步是一個使用datareader的簡單格式
[c#]
while (myreader.read()) {
[c#]
while (myreader.read()) {
// do your thing with the current row here
}
下面的例子展示了迄今為止我們所討論的內容:建立一個到sql數據源的連接,對于連接的發送select命令,用datareader對象來保存返回的結果,然后通過循環datareader取得數據。
下面是用c#寫的完整代碼。
<%@ import namespace="system.data" %>
<%@ import namespace="system.data.sql" %>
<html>
<head>
<script language="c#" runat="server">
public sqldatareader myreader;
public string html;
protected void page_load(object src, eventargs e ) {
sqlconnection mysqlconnection = new sqlconnection("server=localhost;uid=sa;pwd=;database=northwind");
sqlcommand mysqlcommand = new sqlcommand("select * from customers", mysqlconnection);
try {
mysqlconnection.open();
mysqlcommd.execute(out myreader);
.execute(out myreader);
html="<table>";
html+="<tr>";
html+="<td><b>customer id</b> </td>";
html+="<td><b>company name</b></td>";
html+="</tr>";
while (myreader.read()) {
html+="<tr>";
html+="<td + myreader["customerid"].tostring() + "</td>";
+ myreader["customerid"].tostring() + "</td>";
html+="<td>" + myreader["companyname"].tostring() + "</td>";
html+="</tr>";
}
html+="</table>";
}
catch(exception e) {
html=e.tostring();
}
finally {
meader.close();
ader.close();
mysqlconnection.close();
}
response.write(html);
}
</script>
</head>
</html>
注意,真正的捕獲塊已經包括在"try ... catch"語句中了。這提供了一些處理連接時出現異常的方法。在“finally”塊中的代碼總是會被執行,不管是否已經執行的是“try”或“catch”塊,所以它變成關閉reader和conncetion對象的邏輯位置。
新聞熱點
疑難解答
圖片精選