訪問數據庫的技術有許多,常見的有一下幾種:開放數據庫互聯(ODBC)、 數據訪問對象(DAO)、遠程數據對象(RDO)、 ActiveX數據對象(ADO)。我們今天主要要學習ADO.NET中OracleClient命名空間中的幾個常用對象,用這作為對ADO.NET認識學習的開始。
ADO與ADO.NET既有相似也有區別,他們都能夠編寫對數據庫服務器中的數據進行訪問和操作的應用程序,並且易於使用、高速度、低內存支出和占用磁盤空間較少,支持用於建立基於客戶端/服務器和 Web 的應用程序的主要功能。但是ADO使用OLE DB接口並基於微軟的COM技術,而ADO.NET擁有自己的ADO.NET接口並且基於微軟的.NET體系架構。眾所周知.NET體系不同於COM體系,ADO.NET接口也就完全不同於ADO和OLE DB接口,這也就是說ADO.NET為.NET構架提供了優化的數據訪問模型,和基於COM的ADO是完全兩樣的數據訪問方式。
ADO.NET是一組訪問數據源的面向對象的類庫。簡單的理解,數據源就是數據庫,它同時也能夠是文本文件、Excel表格或者XML文件。ADO.NET裡包括了許多專門用於和數據打交道的對象。下面介紹了一些最常用的對象。這些對象是學習ADO.NET必須了解的。掌握它們後我們將了解使用ADO.NET和數據打交道需要考慮哪些事情。
OracleConnection 對象
要訪問一個數據源,你必須先建立一個到它的連接。這個連接裡描述了數據庫服務器類型、數據庫名字、用戶名、密碼,和連接數據庫所需要的其它參數。command對象通過使用connection對象來知道是在哪個數據庫上面執行ORACLE命令。
OracleConnection oracleConn = new OracleConnection();
oracleConn.ConnectionString = "User Id=scott;Password=tiger;
Data Source=oracleSN;";
oracleConn.Open();
OracleCommand對象
連接數據庫後就可以開始想要執行的數據庫操作,這個是通過command對象完成,command對象一般被用來發送ORACLE語句給數據庫。command對象通過connection對象得知道應該與哪個數據庫進行連接。我們既可以用command對象來直接執行ORACLE命令,也可以將一個command對象的引用傳遞給OracleDataAdapter,OracleDataAdapter能包含一系列的command對象,可以處理大量數據。
public void ReadMyData(string connectionString)
{
string queryString = "SELECT EmpNo, DeptNo FROM Scott.Emp";
OracleConnection connection = new OracleConnection(connectionString)
{
OracleCommand command = new OracleCommand(queryString, connection);
connection.Open();
OracleDataReader reader = command.ExecuteReader();
try
{
while (reader.Read())
{
Console.WriteLine(reader.GetInt32(0) + ", " + reader.GetInt32(1));
}
}
finally
{
reader.Close();
}
}
}
OracleDataReader對象
許多數據庫操作要求我們僅僅只是需要讀取一組數據。這時候就用到了data reader對象。通過data reader對象,我們可以獲得從command對象的SELECT語句得到的結果。考慮到性能方面的因素,data reader返回的數據流被設計為只讀的、單向的,這將意味著你只能按照一定的順序從數據流中取出數據。雖然你在這裡也獲得了性能上的提升,但是缺點也是明顯的,不能夠操作取回數據,如果需要操作編輯數據,解決的辦法是使用DataSet。
OracleDataReader提供了幾個方法,在讀取數據的時候用這些方法可以對數據表中的數據按數據類型進行篩選:GetDateTime, GetDouble, GetGuid, GetInt32。
DataSet對象
DataSet對象用於表示那些儲存在內存中的數據。它包括多個DataTable對象,DataTable就象一個普通的數據庫中的表一樣,也有行和列,我們甚至能夠通過定義表和表之間的關系來創建從屬關系。DataSet主要用於管理存儲在內存中的數據以及對數據的斷開操作。注意,由於DataSet對象能被所有Data Providers(數據源交互的類庫)使用,它不需要指定前綴。
OracleDataAdapter對象
某些時候我們只需要讀數據,並且你不需要修改它們把更改寫回數據源。但是還有這樣一些情況為了減少數據庫調用的次數,我們把數據緩存在內存中。Data adapter通過斷開模型來輕松的實現了後面這種情況的處理。當批量完成的對數據庫的讀寫操作的並將改變寫回數據庫的時候,data adapter 會填充(fill)DataSet對象。data adaapter裡包含了connection對象,當對數據源進行讀取或者寫入的時候,data adapter會自動的打開或者關閉連接。此外,data adapter還包含對數據的SELECT,INSERT,UPDATE和DELETE操作的command對象引用。如果我們為DataSet中的每一個table都指定data adapter,它將會幫你處理好所有與連接處理數據庫的操作,我們所需要做的僅僅就是告訴data adapter什麼時候讀取或者寫入到數據庫。
在程序中要使用 System.Data.OracleClient 命名空間中類的子集來對Oracle數據庫操作的步驟:
1、 將 System.Data.OracleClient(用於Oracle 的 Microsoft .NET 框架數據提供程序)的引用添加到項目中。
2、 使用 using 指令導入 OracleClient 類中的類型。
using System.Data.OracleClient;
3、 創建一個 OracleConnection 對象。
OracleConnection conn = new OracleConnection("Data Source=oracledb;User Id=UserID;Password=Password;");
4、 創建一個 OracleCommand 對象。將其 Connection 屬性設置為上一 步中創建的連接。將其 CommandText 設置為想對數據庫表進行的操作,即SQL語句。
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "select * from table";
5、 創建OracleParameter 對象,並將其添加到 OracleCommand 對象的參數集合中。(如果CommandText中有參數,需要創建此對象)
cmd.Parameters.Add("reccount",OracleType.Number);
6、 如果您要浏覽操作的結果集,請創建 DataSet、DataTable 或 DataReader。。
7、 使用 OracleCommand 對象的一個 Execute 方法執行CommandText中的SQL語句,如下所示:
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
Execute方法 說明
ExecuteReader 通過執行能夠返回結果集生成 OracleDataReader。
ExecuteNonQuery 執行返回受影響的行數。
ExecuteOracleNonQuery 針對OracleCommand.Connection執行SQL語句,返回受影響的行數。
ExecuteScalar 執行一個查詢並且返回查詢結果集第一行第一列的值作為 .NET 框架數據類型返回。
ExecuteOracleScalar 執行一個查詢並且返回查詢結果集的第一行第一列的值作為Oracle指定類型 (OracleType 數據類型)返回。
三 詳細操作總結
1.數據庫連接有2種:
第一種:古老的方法(較為死板,不利於靈活操作),即用OracleConnection的類來連接
string myOraclestr ="user id = xal;data source = xal;password = xal";
OracleConnection mycnn = new OracleConnection(myOraclestr);
mycnn.open();
第二種:新式的方法(使用較為靈活),即利用OracleConnectoinStringBuilder類來連接
OracleConnectionStringBuilder OcnnStrB = new OracleConnectionStringBuilder();
OCnnStrB.DataSource = "xal";
OCnnStrB.UserID = "xal";
OCnnStrB.Password = "xal";
OracleConnection myCnn = new OracleConnection(OCnnStrB.ConnectionString);
myCnn.open();
2. 數據庫表的操作
2.1數據庫表的查詢、添加、刪除和修改。
第一種:利用OracleDataAdapter的類
string Oraclestr = "select name from telephonebook ";
OracleDataAdapter myoadapt = new OracleDataAdapter(Oraclestr, myConnection);
第二種:利用OracleCommand的類
string Oraclestr = "delete from telephonebook";
OracleCommand myocmd = new OracleCommand(Oraclestr, myConnection);
myocmd.ExecuteNonQuery();
第三種:利用OracleCommand的CommandText屬性
OracleCommand myConnection = new OracleCommand();
Comm.Connection = myConnection;
Comm.Transaction = myConnection.BeginTransaction();
Comm.CommandText = "select * from table";
Comm.ExecuteNonQuery();
Comm.Transaction.Commit();
2.2 數據集的浏覽
string Oraclestr = "select name from telephonebook ";
OracleDataAdapter myoadapt = new OracleDataAdapter(Oraclestr, myConnection);
DataTable mydtable = new DataTable();
myoadapt.Fill(mydtable);
foreach (DataRow dr in mydtable.Rows)
{
comboBox1.Items.Add(dr[0].ToString());
}
2.3事務的操作。
數據庫事務是指作為單個邏輯工作單元執行的一系列操作。
設想網上購物的一次交易,其付款過程至少包括以下幾步數據庫操作:
• 更新客戶所購商品的庫存信息
• 保存客戶付款信息--可能包括與銀行系統的交互
• 生成訂單並且保存到數據庫中
• 更新用戶相關信息,例如購物數量等等
正常的情況下,這些操作將順利進行,最終交易成功,與交易相關的所有數據庫信息也成功地更新。但是,如果在這一系列過程中任何一個環節出了差錯,例如在更新商品庫存信息時發生異常、該顧客銀行帳戶存款不足等,都將導致交易失敗。一旦交易失敗,數據庫中所有信息都必須保持交易前的狀態不變,比如最後一步更新用戶信息時失敗而導致交易失敗,那麼必須保證這筆失敗的交易不影響數據庫的狀態--庫存信息沒有被更新、用戶也沒有付款,訂單也沒有生成。否則,數據庫的信息將會一片混亂而不可預測。
數據庫事務正是用來保證這種情況下交易的平穩性和可預測性的技術。
//連接數據庫並打開
string myConnString = "user id=xal;data source=xal2;password=xal";
OracleConnection myConnection = new OracleConnection(myConnString);
myConnection.Open();
{
//創建事務
OracleTransaction myTransaction = myConnection.BeginTransaction();
OracleCommand myocmd = new OracleCommand("", myConnection);
myocmd.Transaction = myTransaction;
try
{
//語句塊
myTransaction.Commit();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
myTransaction.Rollback();
}
finally
{
myConnection.Close();
}
}
2.4從數據表中讀取圖片數據
從數據庫中取一個圖片數據,用二進制數組來存儲,然後將其顯示在指定的控件上。
byte[] tmpImage = (byte[])curRow["Pic"];
// fileLength是數組的長度(圖片的大小)和curImageFormat圖片格式。
fileLength = tmpImage.Length;
MemoryStream curStream = new MemoryStream(tmpImage);
picPersonel.Image = Image.FromStream(curStream);
curImageFormat = picPersonel.Image.RawFormat;
2.5 命令參數的創建和使用
創建命令參數
private OracleParameter CreateOraParam(string ParamName, object ParamValue)
{
OracleParameter Result = new OracleParameter();
Result.ParameterName = ParamName;
if (ParamValue != null)
{
Result.Value = ParamValue;
}
else
{
Result.Value = DBNull.Value;
}
Result;
}
這樣的話,當要對數據庫操作時就可以運用了:
insertComm.CommandText = "insert into TESTADODOTNET (ID) values (:pID)";
insertComm.Parameters.Add(CreateOraParam("pID", (txtID.Text.Trim() != "") ? txtID.Text.Trim() : null));