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對象的邏輯位置。 
新聞熱點
疑難解答