日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Oracle數(shù)據(jù)庫上使用VS2010構(gòu)建.NET應(yīng)用程序

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

站在用戶的角度思考問題,與客戶深入溝通,找到滑縣網(wǎng)站設(shè)計(jì)與滑縣網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋滑縣地區(qū)。

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

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

如何使用 Connection、Command 和 DataReader 對(duì)象

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

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

請(qǐng)注意,免費(fèi)的 Oracle Developer Tools for Visual Studio(可從 OTN 下載)提供了一個(gè) Visual Studio 插件,該插件可以簡化 Oracle 上的 .NET 應(yīng)用程序開發(fā),并使之更加直觀。但在這里我們不討論這個(gè)問題;要想了解這方面的更多信息,您可以前往 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ù)庫平臺(tái)優(yōu)化了的提供程序而不是一般的 .NET OLE DB 數(shù)據(jù)提供程序?qū)崿F(xiàn)的。

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

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

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

如果您是初次接觸 Oracle,請(qǐng)參見 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)建一個(gè)用于從 Oracle 數(shù)據(jù)庫中檢索數(shù)據(jù)的 ODP.NET 應(yīng)用程序。然后,我們將了解如何使用 ODP.NET 執(zhí)行錯(cuò)誤處理,以及如何處理其他數(shù)據(jù)檢索情況。

啟動(dòng) Visual Studio 之后,第一個(gè)任務(wù)是創(chuàng)建一個(gè)工程??梢园慈缦滤締螕?nbsp;New Project,也可以選擇 File | New | Project。


圖 1
 在 Visual Studio 2010 中創(chuàng)建一個(gè)新工程

 

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


圖 2
 使用 
New Project 對(duì)話框

 

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

添加引用

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


圖 3
 添加引用

 

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


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

ODP.NET 位于 Oracle.DataAccess 組件名下。從列表中選擇 Oracle.DataAccess,然后單擊 OK 按鈕讓工程知道 ODP.NET 數(shù)據(jù)提供程序。一定要選擇正確的版本。由于這是一個(gè) .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ù)庫對(duì)象。

按照慣例,這些語句出現(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 所示。


圖 5
 在 Visual Basic 中添加 Imports 語句

連接字符串和對(duì)象

Oracle 連接字符串和 Oracle 名稱解析是不可分的。在本文中,我們將使用用戶 ID“hr”和口令“hr”連接到 Oracle 的示例 HR 模式。tnsnames.ora 文件是一個(gè) Oracle 網(wǎng)絡(luò)配置文件,它定義用于建立連接的數(shù)據(jù)庫地址。假定我們?cè)?tnsnames.ora 文件中定義了一個(gè)數(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)用程序代碼僅比不加密文本形式的源代碼文件稍微安全一點(diǎn)??梢苑浅:啽愕胤淳幾g .NET DLL 和 EXE 文件,進(jìn)而查看原始的不加密文本形式的內(nèi)容。(加密實(shí)際上是正確的解決方案,但這個(gè)主題與我們這里的討論相差太遠(yuǎn)。)

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

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

注意,通過將連接字符串傳遞給連接對(duì)象的構(gòu)造器(該構(gòu)造器進(jìn)行了重載),連接字符串與連接對(duì)象建立關(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; 

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

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

我們將在稍后介紹錯(cuò)誤處理。

Command 對(duì)象

command 對(duì)象用于指定執(zhí)行的 SQL 命令文本 — SQL 字符串或存儲(chǔ)過程。類似于 connection 對(duì)象,它必須從完成其類的實(shí)例化,并且它擁有一個(gè)重載的構(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; 

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

檢索標(biāo)量值

從數(shù)據(jù)庫中檢索數(shù)據(jù)可以通過實(shí)例化一個(gè) OracleDataReader 對(duì)象并使用 OracleCommand 的 ExecuteReader 方法(它返回一個(gè) OracleDataReader 對(duì)象)來實(shí)現(xiàn)。通過將列名或以零為基數(shù)的列序號(hào)傳遞給 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 本地?cái)?shù)據(jù)類型,其他存取程序用于返回本地 Oracle 數(shù)據(jù)類型,所有這些存取程序都受 C#、Visual Basic 或任何其他 .NET 語言的支持。以零為基數(shù)的序號(hào)被傳遞給存取程序,以指定要返回的列。

 
 
 
 
  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 

在這個(gè)簡化的示例中,department_name 的返回值是一個(gè)字符串,它用來設(shè)置標(biāo)簽控件的文本的屬性值(也是一個(gè)字符串)。但如果檢索的是 department_id(不是一個(gè)字符串),那么將出現(xiàn)數(shù)據(jù)類型不匹配的情況。當(dāng)源數(shù)據(jù)類型與目標(biāo)數(shù)據(jù)類型不匹配時(shí),.NET 運(yùn)行時(shí)將嘗試隱式地轉(zhuǎn)換數(shù)據(jù)類型。有時(shí)數(shù)據(jù)類型不兼容,則隱式轉(zhuǎn)換將失敗,從而引發(fā)異常。但即使可以進(jìn)行隱式轉(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# 的容錯(cuò)能力不如 Visual Basic。您必須自己執(zhí)行顯式轉(zhuǎn)換:

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

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

Close 和 Dispose

可以調(diào)用連接對(duì)象的 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 對(duì)象可以釋放系統(tǒng)資源,從而確保高效的應(yīng)用程序性能,這在高負(fù)載情況下尤為重要。您可以試驗(yàn)在上機(jī)操作 1(從數(shù)據(jù)庫中檢索數(shù)據(jù))和上機(jī)操作 2(增加交互性)中學(xué)到的一些概念。

錯(cuò)誤處理

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

 
 
 
 
  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ù)時(shí)發(fā)生的任何錯(cuò)誤,但這種方法對(duì)用戶卻不友好。例如,看看下面這條在數(shù)據(jù)庫不可用時(shí)顯示的消息:

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

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

圖 7 ORA-12545 錯(cuò)誤的用戶友好的錯(cuò)誤消息

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

利用 DataReader 檢索多個(gè)值

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

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

本文為簡明起見,我們使用一個(gè)表,即 departments 表。要獲取列的值,可以使用以零為基數(shù)的序號(hào)或列名。序號(hào)與查詢中的順序相關(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)在我們進(jìn)行返回多行的查詢: 

select department_id, department_name, location_id from departments

要處理從 OracleDataReader 中返回的多行,需要某種類型的循環(huán)結(jié)構(gòu)。此外,需要一個(gè)可以顯示多行的控件。OracleDataReader 是一個(gè)僅正向的只讀游標(biāo),因此不能將其與可更新或完全可滾動(dòng)的控件(如 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()); 

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

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

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

圖 8 在 Windows x64 上構(gòu)建時(shí),可以使用 Configuration Manager 更改目標(biāo)平臺(tái)類型。

總結(jié)

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

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

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

圖 9 包含按鈕和標(biāo)簽控件的表單(上機(jī)操作 1)

  1. 添加代碼,它們用于從 Oracle 數(shù)據(jù)庫中檢索數(shù)據(jù)并在表單上顯示結(jié)果。將代碼放在按鈕的單擊事件處理程序中。開始這項(xiàng)任務(wù)的最容易的方式是雙擊該按鈕,因?yàn)樗鼘槭录幚沓绦騽?chuàng)建一個(gè) stub。 

    圖 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 版本的單擊事件處理程序代碼(請(qǐng)務(wù)必用您服務(wù)器的主機(jī)名替代 ORASRVR 并將服務(wù)名稱項(xiàng)替換為數(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# 代碼添加到按鈕單擊事件處理程序的 { 和 } 花括號(hào)之間(請(qǐng)務(wù)必用您服務(wù)器的主機(jī)名替代 ORASRVR 并將服務(wù)名稱項(xiàng)替換為數(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ùn)行應(yīng)用程序。單擊按鈕。您將看到以下內(nèi)容: 

    圖 11 成功檢索的數(shù)據(jù)

 

上機(jī)操作 2:增加交互性

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

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

    圖 12 包含按鈕和標(biāo)簽控件的表單(上機(jī)操作 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ùn)行應(yīng)用程序。在 department_id 中輸入 10 來測(cè)試應(yīng)用程序。輸入一個(gè)無效的 department_id(例如 12)重新測(cè)試應(yīng)用程序。應(yīng)用程序?qū)⒔K止。 

    圖 13 未處理的異常
     

  4. 修改代碼防止在輸入無效的 department_id 時(shí)出現(xiàn)錯(cuò)誤。讓我們回顧一下,ExecuteReader 方法實(shí)際返回一個(gè)對(duì)象。將包含 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ù)字來測(cè)試應(yīng)用程序?,F(xiàn)在應(yīng)用程序不再終止。輸入字母 A 代替數(shù)字,然后單擊按鈕。應(yīng)用程序終止。很明顯,我們的應(yīng)用程序需要更好的方法來處理錯(cuò)誤。

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

 

 

、

上機(jī)操作 3:使用 OracleDataReader 檢索多列和多行

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

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

    圖 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é)果將在一個(gè) while 循環(huán)中讀取,并將填充 ListBox 控件。按如下所示修改 Visual Basic 代碼,針對(duì)您的數(shù)據(jù)庫相應(yīng)修改主機(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_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ùn)行應(yīng)用程序。ListBox 應(yīng)填充了 departments 表中的所有部門名稱和位置。供下載的代碼中已經(jīng)具備了錯(cuò)誤處理功能。
  5. 原文鏈接:http://www.cnblogs.com/gongsh/archive/2012/10/23/2734860.html

文章題目:Oracle數(shù)據(jù)庫上使用VS2010構(gòu)建.NET應(yīng)用程序
標(biāo)題路徑:http://www.5511xx.com/article/dhieppj.html