自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Oracle數(shù)據(jù)庫上使用VS2010構(gòu)建.NET應(yīng)用程序

開發(fā) 后端
隨著Microsoft的.NET Framework 的日益流行,許多開發(fā)人員迫切想了解關(guān)于將 .NET應(yīng)用程序與Oracle集成的最佳方法的信息—不僅在基本連通性方面,還包括與使用Visual Studio 2010進行有效應(yīng)用程序開發(fā)的關(guān)系。

在本文中,我將說明構(gòu)建使用 Oracle 數(shù)據(jù)庫的 C# 或 Visual Basic .NET 應(yīng)用程序所涉及到的基本但不可或缺的過程,包括:

如何添加工程引用,以在您的 .NET 工程中支持 Oracle 類庫

如何創(chuàng)建 Oracle 數(shù)據(jù)庫連接字符串

如何使用 Connection、Command 和 DataReader 對象

您將有機會應(yīng)用在三個上機操作實踐中學(xué)到的內(nèi)容,難度從相對簡單逐漸演變到復(fù)雜。如果您已經(jīng)熟悉使用 Visual Studio 2005/2008 構(gòu)建 Oracle 數(shù)據(jù)庫的 .NET 應(yīng)用程序,則會發(fā)現(xiàn)使用 Visual Studio 2010 的體驗非常類似。

要獲得關(guān)于如何保護應(yīng)用程序的信息和實驗,請參見我的文章“在 Oracle 數(shù)據(jù)庫上保護 .NET 應(yīng)用程序”。(另外,有關(guān)涉及一系列 Oracle .NET 應(yīng)用程序生命周期問題的技術(shù)文章,請參見 OTN .NET 開發(fā)人員中心。)

請注意,免費的 Oracle Developer Tools for Visual Studio(可從 OTN 下載)提供了一個 Visual Studio 插件,該插件可以簡化 Oracle 上的 .NET 應(yīng)用程序開發(fā),并使之更加直觀。但在這里我們不討論這個問題;要想了解這方面的更多信息,您可以前往 Oracle Developer Tools for Visual Studio 產(chǎn)品中心。

.NET 數(shù)據(jù)提供程序

除了基本的 Oracle 客戶端連通性軟件,.NET 應(yīng)用程序還需要使用稱為托管數(shù)據(jù)提供程序(其中“托管”指的是代碼由 .NET 框架管理)的工具。數(shù)據(jù)提供程序是指 .NET 應(yīng)用程序代碼和 Oracle 客戶端連通性軟件之間的層。在幾乎所有情況下,最優(yōu)的性能都是通過使用為特定數(shù)據(jù)庫平臺優(yōu)化了的提供程序而不是一般的 .NET OLE DB 數(shù)據(jù)提供程序?qū)崿F(xiàn)的。

Oracle、Microsoft 和第三方供應(yīng)商都提供了針對 Oracle 數(shù)據(jù)庫進行了優(yōu)化的 .NET 數(shù)據(jù)提供程序。Oracle 和 Microsoft 均免費提供自己的 Oracle 數(shù)據(jù)提供程序。Microsoft 針對 .NET Framework 的提供程序已廢棄。Oracle 則繼續(xù)支持和開發(fā)其 .NET 數(shù)據(jù)提供程序 Oracle Data Provider for .NET (ODP.NET)。在本文中,我們將使用 ODP.NET,該提供程序包含在 Oracle Database 中或單獨提供下載。

ODP.NET 提供標(biāo)準(zhǔn)的 ADO.NET 數(shù)據(jù)訪問,同時還提供專用于 Oracle 數(shù)據(jù)庫的特性,如 XML DB、數(shù)據(jù)訪問性能優(yōu)化和真正應(yīng)用集群負載平衡及快速連接故障切換。最新的 ODP.NET 版本 (11.2) 支持連接到 Oracle Database 9i 第 2 版服務(wù)器及更高版本。數(shù)據(jù)庫服務(wù)器可以位于 Windows、Linux、UNIX 或 Oracle 數(shù)據(jù)庫支持的任何其他操作系統(tǒng)平臺上。

安裝 ODP.NET 和 Oracle 客戶端軟件后,即可開始使用 Visual Studio 進行應(yīng)用程序開發(fā)。在開始開發(fā)前,請先確認(rèn)客戶端連通性。如果您在安裝了 Visual Studio 的計算機上能夠使用 Oracle 客戶端軟件(如 SQL*Plus)連接到 Oracle 數(shù)據(jù)庫,則證明您已經(jīng)正確地安裝和配置了 Oracle 客戶端軟件。

如果您是初次接觸 Oracle,請參見 Oracle 數(shù)據(jù)庫兩日速成開發(fā)人員指南 中的“安裝 .NET 產(chǎn)品”一節(jié),其中專門介紹了有關(guān)安裝和配置 ODP.NET 的背景信息;或參見 Oracle 數(shù)據(jù)庫文檔庫,了解有關(guān) Oracle 數(shù)據(jù)庫的一般信息。

在 Visual Studio 2010 中創(chuàng)建工程

現(xiàn)在我們來創(chuàng)建一個用于從 Oracle 數(shù)據(jù)庫中檢索數(shù)據(jù)的 ODP.NET 應(yīng)用程序。然后,我們將了解如何使用 ODP.NET 執(zhí)行錯誤處理,以及如何處理其他數(shù)據(jù)檢索情況。

啟動 Visual Studio 之后,第一個任務(wù)是創(chuàng)建一個工程。可以按如下所示單擊 New Project,也可以選擇 File | New | Project。

vs2010-oracle-dev-f1
圖 1
 在 Visual Studio 2010 中創(chuàng)建一個新工程
 

出現(xiàn) New Project 對話框。在對話框左側(cè)的 Installed Templates 下,選擇您的編程語言。在這個例子中,我們選擇 Visual Basic。在對話框中部,選擇一個工程模板。為簡單起見,我們選擇 Windows Forms Application。

vs2010-oracle-dev-f2
圖 2
 使用 New Project 對話框
 

您將需要為工程名稱(我們使用 OraWinApp)和解決方案名稱(我們使用 OraWinApp)指定有意義的名稱。一個解決方案包含一個或多個工程。當(dāng)一個解決方案僅包含一個工程時,許多人對二者使用相同的名稱。請注意,對話框中有一個下拉列表框,可以在其中指定您要針對的 .NET Framework 版本。如果您是為早期版本的 .NET Framework 編寫應(yīng)用程序,則應(yīng)從該下拉列表中選擇相應(yīng)的版本。單擊 OK 按鈕繼續(xù)。

添加引用

由于我們的工程必須與 Oracle 數(shù)據(jù)庫連接,因此必須添加一個到包含所選數(shù)據(jù)提供程序的 ODP.NET DLL 的引用。在 Visual Studio 右側(cè)的 Solution Explorer 內(nèi),選擇工程名稱,右鍵單擊并選擇 Add Reference。或者,您可以轉(zhuǎn)至菜單欄并選擇 Project,然后選擇 Add Reference。

vs2010-oracle-dev-f3
圖 3
 添加引用
 

出現(xiàn) Add Reference 對話框。選擇 .NET 選項卡。Visual Studio 將構(gòu)造一個列表,其中列出可以添加到工程中的 .NET 組件。這可能需要幾秒鐘的時間。完成后,您可以單擊 Component Name 列按字母順序排列組件列表。

vs2010-oracle-dev-f4
圖 4
 選擇適用于 .NET 4 的 ODP.NET 托管數(shù)據(jù)提供程序

ODP.NET 位于 Oracle.DataAccess 組件名下。從列表中選擇 Oracle.DataAccess,然后單擊 OK 按鈕讓工程知道 ODP.NET 數(shù)據(jù)提供程序。一定要選擇正確的版本。由于這是一個 .NET 4 工程,所以在此選擇了 4.112.2.0 版的 Oracle.DataAccess,但您可以選擇以 4 開頭的任意 ODP.NET 版本。

Visual Basic/C# 語句

添加引用之后,標(biāo)準(zhǔn)的做法是添加 Visual Basic Imports 語句或 C# using 語句。從技術(shù)上講,這些語句不是必需的,但通過它們可以讓您無需使用冗長的完全限定名來引用數(shù)據(jù)庫對象。

按照慣例,這些語句出現(xiàn)在代碼文件的頂部或頂部附近,在命名空間或類聲明之前。 

  1. Imports Oracle.DataAccess.Client ' Visual Basic ODP.NET Oracle managed provider 
  2. using Oracle.DataAccess.Client; // C# ODP.NET Oracle managed provider 

添加完引用之后,Intellisense 將幫助您完成 Imports 或 using 語句的添加,如圖 5 所示。

vs2010-oracle-dev-f5
圖 5
 在 Visual Basic 中添加 Imports 語句

連接字符串和對象

Oracle 連接字符串和 Oracle 名稱解析是不可分的。在本文中,我們將使用用戶 ID“hr”和口令“hr”連接到 Oracle 的示例 HR 模式。tnsnames.ora 文件是一個 Oracle 網(wǎng)絡(luò)配置文件,它定義用于建立連接的數(shù)據(jù)庫地址。假定我們在 tnsnames.ora 文件中定義了一個數(shù)據(jù)庫別名 OraDb,如下:

  1. OraDb= 
  2.   (DESCRIPTION= 
  3.     (ADDRESS_LIST= 
  4.       (ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521)) 
  5.     ) 
  6.     (CONNECT_DATA= 
  7.       (SERVER=DEDICATED) 
  8.       (SERVICE_NAME=ORCL) 
  9.     ) 
  10.   ) 

OraDb 別名定義客戶端的數(shù)據(jù)庫地址連接信息。要使用上面所述的在 tnsnames.ora 文件中定義的 OraDb 別名,您需要使用以下語法: 

  1. Dim oradb As String = "Data Source=OraDb;User Id=hr;Password=hr;" ' Visual Basic 
  2. string oradb = "Data Source=OraDb;User Id=hr;Password=hr;"// C# 

不過,您可以修改連接字符串,這樣就無需使用 tnsnames.ora 文件。只需使用在 tnsnames.ora 文件中定義別名的語句替換別名即可。本文中的數(shù)據(jù)庫別名特定于我的數(shù)據(jù)庫設(shè)置。(單擊此處獲取更多有關(guān)為數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫別名的信息。)

  1. ' Visual Basic  
  2. Dim oradb As String = "Data Source=(DESCRIPTION=" _ 
  3.            + "(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521))" _ 
  4.            + "(CONNECT_DATA=(SERVICE_NAME=ORCL)));" _ 
  5.            + "User Id=hr;Password=hr;" 
  6.  
  7. // C# 
  8. string oradb = "Data Source=(DESCRIPTION=" 
  9.              + "(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521))" 
  10.              + "(CONNECT_DATA=(SERVICE_NAME=ORCL)));" 
  11.              + "User Id=hr;Password=hr;"

正如您在上面看到的那樣,用戶名和口令是以明文方式嵌入到連接字符串中的。這是創(chuàng)建連接字符串的最簡單的方法。然而,從安全的角度而言不加密文本的方法是不可取的。尤其是,您需要了解編譯的 .NET 應(yīng)用程序代碼僅比不加密文本形式的源代碼文件稍微安全一點??梢苑浅:啽愕胤淳幾g .NET DLL 和 EXE 文件,進而查看原始的不加密文本形式的內(nèi)容。(加密實際上是正確的解決方案,但這個主題與我們這里的討論相差太遠。)

接下來,您必須從連接類中完成一個連接對象的實例化。連接字符串必須與連接對象關(guān)聯(lián)。 

  1. Dim conn As New OracleConnection(oradb) ' Visual Basic 
  2. OracleConnection conn = new OracleConnection(oradb); // C# 

注意,通過將連接字符串傳遞給連接對象的構(gòu)造器(該構(gòu)造器進行了重載),連接字符串與連接對象建立關(guān)聯(lián)。構(gòu)造函數(shù)的其他重載允許使用以下這些替代的語法: 

  1. Dim conn As New OracleConnection() ' Visual Basic 
  2. conn.ConnectionString = oradb 
  3.  
  4. OracleConnection conn = new OracleConnection(); // C# 
  5. conn.ConnectionString = oradb; 

在連接字符串與連接對象建立關(guān)聯(lián)之后,使用 Open 方法來創(chuàng)建實際的連接。

  1. conn.Open() ' Visual Basic 
  2. conn.Open(); // C# 

我們將在稍后介紹錯誤處理。

Command 對象

command 對象用于指定執(zhí)行的 SQL 命令文本 — SQL 字符串或存儲過程。類似于 connection 對象,它必須從完成其類的實例化,并且它擁有一個重載的構(gòu)造函數(shù)。在本示例中,ODP.NET 將在 departments 表中執(zhí)行 SQL 查詢,并返回 department_id 為 10 的 department_name。

 

  1. Dim sql As String = "select department_name from departments where department_id = 10" ' Visual Basic 
  2. Dim cmd As New OracleCommand(sql, conn) 
  3. cmd.CommandType = CommandType.Text 
  4.  
  5. string sql = " select department_name from departments where department_id = 10"// C# 
  6. OracleCommand cmd = new OracleCommand(sql, conn); 
  7. cmd.CommandType = CommandType.Text; 

使用不同的重載時,語法的結(jié)構(gòu)稍有不同。command 對象有用于執(zhí)行命令文本的方法,我們將在下一部分中講述。不同的方法適用于不同類型的 SQL 命令。

檢索標(biāo)量值

從數(shù)據(jù)庫中檢索數(shù)據(jù)可以通過實例化一個 OracleDataReader 對象并使用 OracleCommand 的 ExecuteReader 方法(它返回一個 OracleDataReader 對象)來實現(xiàn)。通過將列名或以零為基數(shù)的列序號傳遞給 OracleDataReader 可以訪問返回的數(shù)據(jù)。

  1. Dim dr As OracleDataReader = cmd.ExecuteReader() ' Visual Basic 
  2. dr.Read() 
  3.  
  4. Label1.Text = dr.Item("department_name") ' retrieve by column name 
  5. Label1.Text = dr.Item(0) ' retrieve the first column in the select list 
  6. Label1.Text = dr.GetString(0) ' return a .NET data type 
  7. Label1.Text = dr.GetOracleString(0) ' return an Oracle data type 

C# 開發(fā)人員必須使用存取程序類型的方法來檢索數(shù)據(jù)。有適當(dāng)類型的存取程序用于返回 .NET 本地數(shù)據(jù)類型,其他存取程序用于返回本地 Oracle 數(shù)據(jù)類型,所有這些存取程序都受 C#、Visual Basic 或任何其他 .NET 語言的支持。以零為基數(shù)的序號被傳遞給存取程序,以指定要返回的列。

  1. OracleDataReader dr = cmd.ExecuteReader(); // C# 
  2. dr.Read(); 
  3.  
  4. label1.Text = dr["department_name"].ToString(); // C# retrieve by column name 
  5. label1.Text = dr.GetString(0).ToString();  // return a .NET data type 
  6. label1.Text = dr.GetOracleString(0).ToString();  // return an Oracle data type 

在這個簡化的示例中,department_name 的返回值是一個字符串,它用來設(shè)置標(biāo)簽控件的文本的屬性值(也是一個字符串)。但如果檢索的是 department_id(不是一個字符串),那么將出現(xiàn)數(shù)據(jù)類型不匹配的情況。當(dāng)源數(shù)據(jù)類型與目標(biāo)數(shù)據(jù)類型不匹配時,.NET 運行時將嘗試隱式地轉(zhuǎn)換數(shù)據(jù)類型。有時數(shù)據(jù)類型不兼容,則隱式轉(zhuǎn)換將失敗,從而引發(fā)異常。但即使可以進行隱式轉(zhuǎn)換,使用顯式數(shù)據(jù)類型轉(zhuǎn)換仍比用隱式數(shù)據(jù)類型轉(zhuǎn)換要好。

到整數(shù)的顯式轉(zhuǎn)換顯示如下:

Label1.Text = CStr(dr.Item("department_id")) ' Visual Basic integer to string cast

在隱式轉(zhuǎn)換上,C# 的容錯能力不如 Visual Basic。您必須自己執(zhí)行顯式轉(zhuǎn)換:

label1.Text = dr.GetInt16("department_id").ToString(); // C#

您可以顯式地轉(zhuǎn)換標(biāo)量值以及數(shù)組。

Close 和 Dispose

可以調(diào)用連接對象的 Close 方法或 Dispose 方法來關(guān)閉到數(shù)據(jù)庫的連接。Dispose 方法隱式調(diào)用 Close 方法。

 

  1. conn.Close()   ' Visual Basic 
  2. conn.Dispose() ' Visual Basic 
  3.  
  4. conn.Close();   // C# 
  5. conn.Dispose(); // C# 

如果您使用 VB 的 Using 關(guān)鍵字或 C# 的 using 關(guān)鍵字,則不必顯式調(diào)用 Close 或 Dispose。

  1. using (OracleConnection conn = new OracleConnection(oradb)) // C# 
  2.     conn.Open(); 
  3.  
  4.     OracleCommand cmd = new OracleCommand(); 
  5.     cmd.Connection = conn; 
  6.     cmd.CommandText = "select department_name from departments where department_id = 10"
  7.     cmd.CommandType = CommandType.Text; 
  8.          
  9.     OracleDataReader dr = cmd.ExecuteReader(); 
  10.     dr.Read(); 
  11.  
  12.     label1.Text = dr.GetString(0); 

此外,OracleCommand 包括 Dispose 方法;OracleDataReader 包括 Close 方法和 Dispose 方法。關(guān)閉并刪除 .NET 對象可以釋放系統(tǒng)資源,從而確保高效的應(yīng)用程序性能,這在高負載情況下尤為重要。您可以試驗在上機操作 1(從數(shù)據(jù)庫中檢索數(shù)據(jù))和上機操作 2(增加交互性)中學(xué)到的一些概念。

錯誤處理

當(dāng)錯誤發(fā)生時,.NET 應(yīng)用程序應(yīng)當(dāng)適當(dāng)?shù)靥幚礤e誤并通過一條有意義的消息來通知用戶。Try-Catch-Finally 結(jié)構(gòu)的錯誤處理是 .NET 語言的一部分。下面是使用 Try-Catch-Finally 語法的一個相對最小的示例:

 

  1. ' Visual Basic  
  2. Try 
  3.     conn.Open() 
  4.  
  5.     Dim cmd As New OracleCommand 
  6.     cmd.Connection = conn 
  7.     cmd.CommandText = "select department_name from departments " _ 
  8.                       + "where department_id = " + TextBox1.Text 
  9.     cmd.CommandType = CommandType.Text 
  10.  
  11.     If dr.Read() Then 
  12.         Label1.Text = dr.Item("department_name"' or use dr.Item(0) 
  13.     End If 
  14. Catch ex As Exception ' catches any error 
  15.     MessageBox.Show(ex.Message.ToString()) 
  16. Finally 
  17.     ' In a real application, put cleanup code here. 
  18. End Try 
  19.  
  20. // C# 
  21. try 
  22.     conn.Open(); 
  23.  
  24.     OracleCommand cmd = new OracleCommand(); 
  25.     cmd.Connection = conn; 
  26.     cmd.CommandText = "select department_name from departments where department_id = " + textBox1.Text; 
  27.     cmd.CommandType = CommandType.Text; 
  28.  
  29.     if (dr.Read()) // C# 
  30.     { 
  31.         label1.Text = dr["department_name"].ToString(); 
  32.                    // or use dr.GetOracleString(0).ToString() 
  33.     } 
  34. catch (Exception ex) // catches any error 
  35.     MessageBox.Show(ex.Message.ToString()); 
  36. finally 
  37.     // In a real application, put cleanup code here. 

 

雖然這種方法將適當(dāng)?shù)夭东@嘗試從數(shù)據(jù)庫中獲取數(shù)據(jù)時發(fā)生的任何錯誤,但這種方法對用戶卻不友好。例如,看看下面這條在數(shù)據(jù)庫不可用時顯示的消息:

vs2010-oracle-dev-f6
 
圖 6 捕獲 ORA-12545 錯誤并顯示給用戶
Oracle DBA 或開發(fā)人員很清楚 ORA-12545 的意義,但最終用戶不清楚。一種更好的解決方案是添加一條額外的 Catch 語句來捕獲最常見的數(shù)據(jù)庫錯誤并顯示對用戶友好的消息。

 

  1. ' Visual Basic  
  2. Catch ex As OracleException ' catches only Oracle errors 
  3.     Select Case ex.Number 
  4.         Case 1 
  5.             MessageBox.Show("Error attempting to insert duplicate data."
  6.         Case 12545 
  7.             MessageBox.Show("The database is unavailable."
  8.         Case Else 
  9.             MessageBox.Show("Database error: " + ex.Message.ToString()) 
  10.     End Select 
  11. Catch ex As Exception ' catches any error 
  12.     MessageBox.Show(ex.Message.ToString()) 
  13.  
  14. // C# 
  15. catch (OracleException ex) // catches only Oracle errors 
  16.     switch (ex.Number) 
  17.     { 
  18.         case 1: 
  19.             MessageBox.Show("Error attempting to insert duplicate data."); 
  20.             break; 
  21.         case 12545: 
  22.             MessageBox.Show("The database is unavailable."); 
  23.             break; 
  24.         default: 
  25.             MessageBox.Show("Database error:" + ex.Message.ToString()); 
  26.             break; 
  27.     } 
  28. catch (Exception ex) // catches any error not previously caught 
  29.     MessageBox.Show(ex.Message.ToString()); 

注意上面的代碼示例中的兩條 Catch 語句。如果沒有捕獲到任何 Oracle 錯誤,那么將跳過第一條 Catch 語句分支,讓第二條 Catch 語句來捕獲任何其他非 Oracle 錯誤。在代碼中,應(yīng)該根據(jù)從特殊到一般的順序?qū)?Catch 語句排序。在執(zhí)行完用戶友好的異常處理代碼之后,ORA-12545 錯誤消息顯示如下:

 vs2010-oracle-dev-f7

圖 7 ORA-12545 錯誤的用戶友好的錯誤消息

無論是否發(fā)生錯誤,F(xiàn)inally 代碼塊總會執(zhí)行。清除代碼應(yīng)包含在此代碼塊中。如果未使用 Using 或 using,應(yīng)清除 Finally 代碼塊中的連接和其他對象。

利用 DataReader 檢索多個值

到目前為止,我們的示例僅說明了如何檢索單個值。OracleDataReader 可以檢索多列和多行的值。首先進行多列、單行的查詢:

select department_id, department_name, location_id from departments where department_id = 10

本文為簡明起見,我們使用一個表,即 departments 表。要獲取列的值,可以使用以零為基數(shù)的序號或列名。序號與查詢中的順序相關(guān)。因此,可以在 Visual Basic 中通過使用 dr.Item(2) 或 dr.Item("location_id") 來檢索 location_id 列的值。

下面是將 department_name 和來自上一查詢的 location_id 列串連起來的代碼段: 

  1. Label1.Text = "The " + dr.Item("department_name") + " department is in " _ 
  2.               + dr.Item("location_id"' VB 
  3.  
  4. label1.Text = "The " + dr["department_name"].ToString() + " department is in " +  
  5.               dr["location_id"].ToString();  // C# 

現(xiàn)在我們進行返回多行的查詢: 

select department_id, department_name, location_id from departments

要處理從 OracleDataReader 中返回的多行,需要某種類型的循環(huán)結(jié)構(gòu)。此外,需要一個可以顯示多行的控件。OracleDataReader 是一個僅正向的只讀游標(biāo),因此不能將其與可更新或完全可滾動的控件(如 Windows Forms DataGrid 控件)捆綁在一起。OracleDataReader 與 ListBox 控件兼容,如以下代碼段所示: 

  1. While dr.Read() ' Visual Basic 
  2.    ListBox1.Items.Add("The " + dr.Item("department_name") _ 
  3.                       + " department is in " + dr.Item("location_id")) 
  4. End While 
  5.  
  6. while (dr.Read()) // C# 
  7.     listBox1.Items.Add("The " + dr["department_name"].ToString() + " department is in " + 
  8.                        dr["location_id"].ToString()); 



上機操作 3(利用 OracleDataReader 檢索多列和多行)重點介紹了這些概念中的一部分。

在 Windows x64 上構(gòu)建和運行

在 Windows x64 操作系統(tǒng)上運行 Visual Studio 2010 時,可以使用 Configuration Manager 更改目標(biāo)平臺類型。在 Solution Explorer 中選擇解決方案,右鍵單擊并選擇 Configuration Manager。

vs2010-oracle-dev-f8
圖 8 在 Windows x64 上構(gòu)建時,可以使用 Configuration Manager 更改目標(biāo)平臺類型。

總結(jié)

本文向您介紹了使用 .NET 編程語言訪問 Oracle 數(shù)據(jù)庫的過程。您現(xiàn)在應(yīng)該能夠連接數(shù)據(jù)庫并檢索多列和多行。

上機操作 1:從數(shù)據(jù)庫中檢索數(shù)據(jù)
前提條件是您已經(jīng)創(chuàng)建了一個工程并添加了一個引用(如本文前面部分所述)。

  1. 接著向 Windows 表單中添加一個按鈕控件和一個標(biāo)簽控件。務(wù)必在這些控件的上方留出空間,以便在上機操作 2 中添加其他控件。

    vs2010-oracle-dev-f9
圖 9 包含按鈕和標(biāo)簽控件的表單(上機操作 1)

  1. 添加代碼,它們用于從 Oracle 數(shù)據(jù)庫中檢索數(shù)據(jù)并在表單上顯示結(jié)果。將代碼放在按鈕的單擊事件處理程序中。開始這項任務(wù)的最容易的方式是雙擊該按鈕,因為它將為事件處理程序創(chuàng)建一個 stub。 

    vs2010-oracle-dev-f10
    圖 10 單擊事件處理程序 stub。
  2. 在 Public Class 聲明之前添加 Visual Basic Imports 語句,或在命名空間聲明之前添加 C# using 語句。 

    Imports Oracle.DataAccess.Client ' Visual Basic, ODP.NET Oracle managed provider

    using Oracle.DataAccess.Client; // C#, ODP.NET Oracle managed provider

  3. 在 Private Sub 和 End Sub 語句之間添加 Visual Basic 版本的單擊事件處理程序代碼(請務(wù)必用您服務(wù)器的主機名替代 ORASRVR 并將服務(wù)名稱項替換為數(shù)據(jù)庫的服務(wù)名稱): 

     

    1. Dim oradb As String = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" _ 
    2.         + "(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521)))" _ 
    3.         + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" _ 
    4.         + "User Id=hr;Password=hr;" 
    5.  
    6. Dim conn As New OracleConnection(oradb) ' Visual Basic 
    7. conn.Open() 
    8.  
    9. Dim cmd As New OracleCommand 
    10. cmd.Connection = conn 
    11. cmd.CommandText = _ 
    12.      "select department_name from departments where department_id = 10" 
    13. cmd.CommandType = CommandType.Text 
    14.  
    15. Dim dr As OracleDataReader = cmd.ExecuteReader() 
    16. dr.Read()  ' replace this statement in next lab 
    17. Label1.Text = dr.Item("department_name") ' or dr.Item(0), remove in next lab 
    18.  
    19. dr.Dispose() 
    20. cmd.Dispose() 
    21. conn.Dispose() 


    將以下 C# 代碼添加到按鈕單擊事件處理程序的 { 和 } 花括號之間(請務(wù)必用您服務(wù)器的主機名替代 ORASRVR 并將服務(wù)名稱項替換為數(shù)據(jù)庫的服務(wù)名稱): 
     

    1. string oradb = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" 
    2.           + "(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521)))" 
    3.           + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" 
    4.           + "User Id=hr;Password=hr;"
    5.  
    6. OracleConnection conn = new OracleConnection(oradb); // C# 
    7. conn.Open(); 
    8.  
    9. OracleCommand cmd = new OracleCommand(); 
    10. cmd.Connection = conn; 
    11. cmd.CommandText = 
    12.      "select department_name from departments where department_id = 10"
    13. cmd.CommandType = CommandType.Text; 
    14.  
    15. OracleDataReader dr = cmd.ExecuteReader(); 
    16. dr.Read();  // replace this statement in next lab 
    17. label1.Text = dr["department_name"].ToString();  // remove in next lab 
    18.  
    19. dr.Dispose(); 
    20. cmd.Dispose(); 
    21. conn.Dispose(); 

     

  4. 運行應(yīng)用程序。單擊按鈕。您將看到以下內(nèi)容: 

    vs2010-oracle-dev-f11
    圖 11 成功檢索的數(shù)據(jù)

 

上機操作 2:增加交互性

現(xiàn)在在代碼中實現(xiàn)了數(shù)據(jù)庫訪問的基本功能,下一步是為應(yīng)用程序增加交互性。與運行硬編碼的查詢不同,可以添加一個文本框控件來接受用戶輸入的部門號碼(即 department_id)。
 

  1. 向表單中添加一個文本框控件和另一個標(biāo)簽控件(如下所示):將 Label2 控件的文本屬性設(shè)為“Enter department_id:”并確保沒有設(shè)置 TextBox1 的 Text 屬性。 

    vs2010-oracle-dev-f12
    圖 12 包含按鈕和標(biāo)簽控件的表單(上機操作 2)
     
  2. 修改定義 select 字符串的代碼: 

     

    1. cmd.CommandText = _ 
    2.     "select department_name from departments where department_id = "
    3.     + TextBox1.Text 'VB 
    4.  
    5. cmd.CommandText = "select department_name from departments where department_id = " + textBox1.Text; // C# 

     

  3. 運行應(yīng)用程序。在 department_id 中輸入 10 來測試應(yīng)用程序。輸入一個無效的 department_id(例如 12)重新測試應(yīng)用程序。應(yīng)用程序?qū)⒔K止。 

    vs2010-oracle-dev-f13
    圖 13 未處理的異常
     
  4. 修改代碼防止在輸入無效的 department_id 時出現(xiàn)錯誤。讓我們回顧一下,ExecuteReader 方法實際返回一個對象。將包含 dr.Read 的代碼行替換為以下全部語句。 

     

    1. If dr.Read() Then ' Visual Basic 
    2.     Label1.Text = dr.Item("department_id").ToString() 
    3. Else 
    4.     Label1.Text = "department_id not found" 
    5. End If 
    6.  
    7. if (dr.Read()) // C# 
    8.     label1.Text = dr["department_id"].ToString();; 
    9. else 
    10.     label1.Text = "department_id not found"


    輸入不存在的 department_id 數(shù)字來測試應(yīng)用程序。現(xiàn)在應(yīng)用程序不再終止。輸入字母 A 代替數(shù)字,然后單擊按鈕。應(yīng)用程序終止。很明顯,我們的應(yīng)用程序需要更好的方法來處理錯誤。

    可能有人會指出,應(yīng)用程序應(yīng)當(dāng)不允許用戶進行導(dǎo)致錯誤的無效輸入,但根本上應(yīng)用程序必須添加強健的錯誤處理功能。不是所有的錯誤都是可預(yù)防的,因此必須具備錯誤處理功能。

 

 

、

上機操作 3:使用 OracleDataReader 檢索多列和多行

 
現(xiàn)在檢索了單個值,下一步是使用 OracleDataReader 檢索多列和多行。在表單中添加一個 ListBox 控件來顯示結(jié)果。
 

  1. 在表單中添加一個 ListBox 控件。重新調(diào)整控件的大小,填滿表單的大部分寬度(如下所示)。 

    vs2010-oracle-dev-f14
    圖 14 添加了 ListBox 的表單
     
  2. 從查詢中刪除 where 子句,并添加以下列: 

     

    1. cmd.CommandText = _ 
    2.     "select department_id, department_name, location_id from departments" ' VB 
    3.  
    4. cmd.CommandText = "select department_id, department_name, location_id from departments "// C# 

     

  3. 查詢結(jié)果將在一個 while 循環(huán)中讀取,并將填充 ListBox 控件。按如下所示修改 Visual Basic 代碼,針對您的數(shù)據(jù)庫相應(yīng)修改主機和服務(wù)名稱: 
    1. Dim oradb As String = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" _ 
    2.         + "(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521)))" _ 
    3.         + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" _ 
    4.         + "User Id=hr;Password=hr;" 
    5.  
    6. Dim conn As New OracleConnection(oradb) ' Visual Basic 
    7. conn.Open() 
    8.  
    9. Dim cmd As New OracleCommand 
    10. cmd.Connection = conn 
    11. cmd.CommandText = _ 
    12.     "select department_id, department_name, location_id from departments" ' VB 
    13. cmd.CommandType = CommandType.Text 
    14.  
    15. Dim dr As OracleDataReader = cmd.ExecuteReader() 
    16. While dr.Read() 
    17.     ListBox1.Items.Add("The " + dr.Item("department_name") + _ 
    18.                        " department is in " + dr.Item("location_id").ToString()) 
    19. End While 
    20.  
    21. dr.Dispose() 
    22. cmd.Dispose() 
    23. conn.Dispose() 
    24. Modify your C# code to look like this:  
    25. string oradb = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" 
    26.           + "(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521)))" 
    27.           + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" 
    28.           + "User Id=hr;Password=hr;"
    29.  
    30. OracleConnection conn = new OracleConnection(oradb); // C# 
    31. conn.Open(); 
    32.  
    33. OracleCommand cmd = new OracleCommand(); 
    34. cmd.Connection = conn; 
    35. cmd.CommandText = "select department_id, department_name, location_id from departments.168"
    36. cmd.CommandType = CommandType.Text; 
    37.  
    38. OracleDataReader dr = cmd.ExecuteReader(); 
    39. while (dr.Read()) 
    40.    listBox1.Items.Add("The " + dr["department_name"].ToString() + 
    41.                       " department is in " + dr["location_id"].ToString()); 
    42.  
    43. dr.Dispose(); 
    44. cmd.Dispose(); 
    45. conn.Dispose(); 

     

  4. 運行應(yīng)用程序。ListBox 應(yīng)填充了 departments 表中的所有部門名稱和位置。供下載的代碼中已經(jīng)具備了錯誤處理功能。
  5. 原文鏈接:http://www.cnblogs.com/gongsh/archive/2012/10/23/2734860.html

 

 

責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2010-12-09 17:30:10

2020-05-03 12:57:32

數(shù)據(jù)庫DIY管道

2010-04-23 09:54:01

VS2010

2010-04-27 09:11:23

VS2010

2011-07-21 09:07:16

ADO.NET

2009-12-11 14:21:55

VS2010程序

2009-12-15 11:16:39

VS2010開發(fā)程序

2009-12-02 14:05:17

VS2010程序

2011-06-23 10:16:55

VS2010 QT 4.7.2 QT

2010-04-01 15:10:06

Visual Stud

2023-11-10 14:46:41

OpenAIPinecone

2009-11-11 11:29:37

VS2010 Auto

2010-08-12 21:06:00

數(shù)據(jù)庫應(yīng)用程序數(shù)據(jù)庫安全

2010-08-12 21:13:49

數(shù)據(jù)庫安全應(yīng)用程序安全

2009-12-11 15:13:15

VS 2010驅(qū)動

2010-04-14 15:30:41

Oracle數(shù)據(jù)庫

2009-07-22 18:02:27

論壇應(yīng)用程序ASP.NET MVC

2010-06-13 09:22:37

jQuery

2010-05-06 17:46:47

2011-01-24 07:24:48

Visual Stud
點贊
收藏

51CTO技術(shù)棧公眾號