成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Oracle數據庫上使用VS2010構建.NET應用程序

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

在本文中,我將說明構建使用 Oracle 數據庫的 C# 或 Visual Basic .NET 應用程序所涉及到的基本但不可或缺的過程,包括:

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

如何創建 Oracle 數據庫連接字符串

如何使用 Connection、Command 和 DataReader 對象

您將有機會應用在三個上機操作實踐中學到的內容,難度從相對簡單逐漸演變到復雜。如果您已經熟悉使用 Visual Studio 2005/2008 構建 Oracle 數據庫的 .NET 應用程序,則會發現使用 Visual Studio 2010 的體驗非常類似。

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

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

.NET 數據提供程序

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

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

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

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

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

在 Visual Studio 2010 中創建工程

現在我們來創建一個用于從 Oracle 數據庫中檢索數據的 ODP.NET 應用程序。然后,我們將了解如何使用 ODP.NET 執行錯誤處理,以及如何處理其他數據檢索情況。

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

vs2010-oracle-dev-f1
圖 1
 在 Visual Studio 2010 中創建一個新工程
 

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

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

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

添加引用

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

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

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

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

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

Visual Basic/C# 語句

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

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

  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 網絡配置文件,它定義用于建立連接的數據庫地址。假定我們在 tnsnames.ora 文件中定義了一個數據庫別名 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 別名定義客戶端的數據庫地址連接信息。要使用上面所述的在 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 文件中定義別名的語句替換別名即可。本文中的數據庫別名特定于我的數據庫設置。(單擊此處獲取更多有關為數據庫創建數據庫別名的信息。)

  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;"

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

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

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

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

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

在連接字符串與連接對象建立關聯之后,使用 Open 方法來創建實際的連接。

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

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

Command 對象

command 對象用于指定執行的 SQL 命令文本 — SQL 字符串或存儲過程。類似于 connection 對象,它必須從完成其類的實例化,并且它擁有一個重載的構造函數。在本示例中,ODP.NET 將在 departments 表中執行 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; 

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

檢索標量值

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

  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# 開發人員必須使用存取程序類型的方法來檢索數據。有適當類型的存取程序用于返回 .NET 本地數據類型,其他存取程序用于返回本地 Oracle 數據類型,所有這些存取程序都受 C#、Visual Basic 或任何其他 .NET 語言的支持。以零為基數的序號被傳遞給存取程序,以指定要返回的列。

  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 的返回值是一個字符串,它用來設置標簽控件的文本的屬性值(也是一個字符串)。但如果檢索的是 department_id(不是一個字符串),那么將出現數據類型不匹配的情況。當源數據類型與目標數據類型不匹配時,.NET 運行時將嘗試隱式地轉換數據類型。有時數據類型不兼容,則隱式轉換將失敗,從而引發異常。但即使可以進行隱式轉換,使用顯式數據類型轉換仍比用隱式數據類型轉換要好。

到整數的顯式轉換顯示如下:

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

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

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

您可以顯式地轉換標量值以及數組。

Close 和 Dispose

可以調用連接對象的 Close 方法或 Dispose 方法來關閉到數據庫的連接。Dispose 方法隱式調用 Close 方法。

 

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

如果您使用 VB 的 Using 關鍵字或 C# 的 using 關鍵字,則不必顯式調用 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 方法。關閉并刪除 .NET 對象可以釋放系統資源,從而確保高效的應用程序性能,這在高負載情況下尤為重要。您可以試驗在上機操作 1(從數據庫中檢索數據)和上機操作 2(增加交互性)中學到的一些概念。

錯誤處理

當錯誤發生時,.NET 應用程序應當適當地處理錯誤并通過一條有意義的消息來通知用戶。Try-Catch-Finally 結構的錯誤處理是 .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. 

 

雖然這種方法將適當地捕獲嘗試從數據庫中獲取數據時發生的任何錯誤,但這種方法對用戶卻不友好。例如,看看下面這條在數據庫不可用時顯示的消息:

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

 

  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 錯誤。在代碼中,應該根據從特殊到一般的順序對 Catch 語句排序。在執行完用戶友好的異常處理代碼之后,ORA-12545 錯誤消息顯示如下:

 vs2010-oracle-dev-f7

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

無論是否發生錯誤,Finally 代碼塊總會執行。清除代碼應包含在此代碼塊中。如果未使用 Using 或 using,應清除 Finally 代碼塊中的連接和其他對象。

利用 DataReader 檢索多個值

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

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

本文為簡明起見,我們使用一個表,即 departments 表。要獲取列的值,可以使用以零為基數的序號或列名。序號與查詢中的順序相關。因此,可以在 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# 

現在我們進行返回多行的查詢: 

select department_id, department_name, location_id from departments

要處理從 OracleDataReader 中返回的多行,需要某種類型的循環結構。此外,需要一個可以顯示多行的控件。OracleDataReader 是一個僅正向的只讀游標,因此不能將其與可更新或完全可滾動的控件(如 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 上構建和運行

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

vs2010-oracle-dev-f8
圖 8 在 Windows x64 上構建時,可以使用 Configuration Manager 更改目標平臺類型。

總結

本文向您介紹了使用 .NET 編程語言訪問 Oracle 數據庫的過程。您現在應該能夠連接數據庫并檢索多列和多行。

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

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

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

  1. 添加代碼,它們用于從 Oracle 數據庫中檢索數據并在表單上顯示結果。將代碼放在按鈕的單擊事件處理程序中。開始這項任務的最容易的方式是雙擊該按鈕,因為它將為事件處理程序創建一個 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 版本的單擊事件處理程序代碼(請務必用您服務器的主機名替代 ORASRVR 并將服務名稱項替換為數據庫的服務名稱): 

     

    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# 代碼添加到按鈕單擊事件處理程序的 { 和 } 花括號之間(請務必用您服務器的主機名替代 ORASRVR 并將服務名稱項替換為數據庫的服務名稱): 
     

    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. 運行應用程序。單擊按鈕。您將看到以下內容: 

    vs2010-oracle-dev-f11
    圖 11 成功檢索的數據

 

上機操作 2:增加交互性

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

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

    vs2010-oracle-dev-f12
    圖 12 包含按鈕和標簽控件的表單(上機操作 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. 運行應用程序。在 department_id 中輸入 10 來測試應用程序。輸入一個無效的 department_id(例如 12)重新測試應用程序。應用程序將終止。 

    vs2010-oracle-dev-f13
    圖 13 未處理的異常
     
  4. 修改代碼防止在輸入無效的 department_id 時出現錯誤。讓我們回顧一下,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 數字來測試應用程序。現在應用程序不再終止。輸入字母 A 代替數字,然后單擊按鈕。應用程序終止。很明顯,我們的應用程序需要更好的方法來處理錯誤。

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

 

 

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

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

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

    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. 查詢結果將在一個 while 循環中讀取,并將填充 ListBox 控件。按如下所示修改 Visual Basic 代碼,針對您的數據庫相應修改主機和服務名稱: 
    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. 運行應用程序。ListBox 應填充了 departments 表中的所有部門名稱和位置。供下載的代碼中已經具備了錯誤處理功能。
  5. 原文鏈接:http://www.cnblogs.com/gongsh/archive/2012/10/23/2734860.html

 

 

責任編輯:彭凡 來源: 博客園
相關推薦

2010-12-09 17:30:10

2020-05-03 12:57:32

數據庫DIY管道

2010-04-23 09:54:01

VS2010

2011-07-21 09:07:16

ADO.NET

2010-04-27 09:11:23

VS2010

2009-12-15 11:16:39

VS2010開發程序

2009-12-11 14:21:55

VS2010程序

2009-12-02 14:05:17

VS2010程序

2010-04-01 15:10:06

Visual Stud

2011-06-23 10:16:55

VS2010 QT 4.7.2 QT

2010-08-12 21:06:00

數據庫應用程序數據庫安全

2010-08-12 21:13:49

數據庫安全應用程序安全

2009-11-11 11:29:37

VS2010 Auto

2009-12-11 15:13:15

VS 2010驅動

2023-11-10 14:46:41

OpenAIPinecone

2010-05-06 17:46:47

2010-04-14 15:30:41

Oracle數據庫

2011-01-24 07:24:48

Visual Stud

2009-07-22 18:02:27

論壇應用程序ASP.NET MVC

2010-06-13 09:22:37

jQuery
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲免费一 | 天天精品在线 | 欧美一区二区三区电影 | av黄色在线观看 | 羞羞视频免费观看入口 | 红桃视频一区二区三区免费 | 国产精品黄视频 | 成人av免费在线观看 | 亚洲精品字幕 | 国产伦精品一区二区三区精品视频 | 日本 欧美 国产 | 日韩在线xx | 国产日韩欧美中文字幕 | 999视频在线播放 | 91精品国产91久久综合桃花 | 日本中出视频 | 久久这里只有精品首页 | 久草新在线| 国产精品久久久久久久久久免费 | 亚洲九色 | 日韩和的一区二在线 | 一区二区精品在线 | 黄色国产 | 成人一级视频在线观看 | 伊人久久综合 | 久久久www成人免费精品 | 福利视频三区 | 免费国产一区二区 | 91影库| 国产精品久久在线 | 国产精品国产三级国产aⅴ中文 | 天堂一区 | 日韩精品专区在线影院重磅 | 一区二区三区四区在线免费观看 | 国产福利一区二区 | 天天操夜夜操免费视频 | 久久九精品 | 日韩电影免费在线观看中文字幕 | 久久精品国产免费看久久精品 | 色久电影 | 久草青青 |