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什麼時候讀取或者寫入到數據庫。 二 用C# 寫一個連接數據庫程序的步驟 在程序中要使用 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));