国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

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

2024-08-29 13:35:54
字體:
來源:轉載
供稿:網友

  隨著 Microsoft 的 .NET 框架的逐漸流行,許多開發人員迫切想了解關于將 .NET 應用程序與 Oracle 集成的最好的方式的信息 — 不僅在基本的連通性方面,還包括與使用 Visual Studio.NET (VS.NET) 進行有效的應用程序開發的關系。

  在本文中,我將說明構建使用 Oracle 數據庫的 .NET 應用程序所涉及到的基本但不可或缺的過程,包括:
  • 如何添加工程引用,以在您的 .NET 工程中支持 Oracle 類
  • 如何創建 Oracle 數據庫連接字符串
  • 如何使用 Connection、Command 和 DataReader 對象。
  您將有機會應用您在三個上機操作實踐中學到的內容,難度范圍從比較輕易到更復雜。

  .NET Data PRovider

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

  Oracle、Microsoft 和第三方供給商都提供了針對 Oracle 產品進行了優化的數據供給程序。 Oracle 和 Microsoft 免費提供其 Oracle 數據供給程序。 (Microsoft 為 .NET 框架的 1.1 版提供的供給程序包含在該框架中,不需要單獨下載或安裝。) 一些第三方數據供給程序支持 Oracle 的較早的版本,或者不需要安裝 Oracle 客戶端軟件。 在本文中,我們假設使用 Oracle Data Provider for .NET (ODP.NET),并單獨提供下載。

  當安裝了 ODP.NET 和所有要求的 Oracle 客戶端連通性軟件時,就可以開始使用 Visual Studio.NET 進行應用程序開發了。 在開始開發前,請先確認客戶端連通性。 假如您在 VS.NET 所在的計算機上使用 SQL*Plus 能夠與 Oracle 連接,那么證實您已經正確地安裝和配置了 Oracle 客戶端軟件。

  假如您剛接觸 Oracle,那么請參閱 Oracle Data Provider for .NET 開發人員指南 10g 版本 1 (10.1) 中的“與 Oracle 數據庫連接”部分,以了解 ODP.NET 的背景信息,或參閱 Oracle 數據庫治理員指南 10g 版本 1 (10.1),以了解關于治理 Oracle 數據庫的通用信息。 您還可以查閱“使用 ODP.NET 與 Oracle 數據庫連接”示例代碼“方法”文檔。

  在 Visual Studio.NET 中創建工程

  在啟動 VS.NET 之后,第一個任務是創建一個工程。 您可以單擊 New Project 按鈕或選擇 File New Project...(如下所示)。
在Oracle數據庫上構建.NET應用程序(圖一)
點擊查看大圖
圖 1: 在 Visual Studio.NET 中創建一個新工程
  出現一個 New Project 對話框。 在對話框左側的 Project Types 下,選擇您的編程語言。 在這個例子中,我們選擇 VB.NET。 在右側的 Templates 下,選擇一個工程模板。 為簡單起見,這里選擇 Windows application。

在Oracle數據庫上構建.NET應用程序(圖二) 圖 2: 使用 New Project 對話框
  您將需要為工程(我們使用 OtnWinApp)和解決方案(我們使用 OtnSamples)指定有意義的名稱。 一個解決方案包含一個或多個工程。 當一個解決方案僅包含一個工程時,許多人對二者使用相同的名稱。 添加引用

  因為我們的工程必須與 Oracle 數據庫連接,因此必須添加一個到包含我們選擇的數據供給程序的 dll 的引用。 在 Solution EXPlorer 內,選擇 References 節點,右鍵單擊并選擇 Add Reference。 或者,您可以轉至菜單欄并選擇 Project,然后選擇 Add Reference


在Oracle數據庫上構建.NET應用程序(圖三)
點擊查看大圖
圖 3: 添加引用
  出現 Add Reference 對話框。

在Oracle數據庫上構建.NET應用程序(圖四) 圖 4: 選擇 ODP.NET 治理的數據供給程序
  從列表中選擇 Oracle.Dataaccess.dll,然后單擊 Select 按鈕,最后單擊 OK 按鈕,使您的工程能夠找到 ODP.NET 數據供給程序。

在Oracle數據庫上構建.NET應用程序(圖五) 圖 5: 選擇 Oracle Managed Provider 之后的解決方案瀏覽器
  VB.NET/C# 語句

  在添加引用之后,標準的做法是要添加 VB.NET Imports 語句、C# using 語句或 J# import 語句。 從技術上說這些語句不是必要的,但是使用它們可以讓您不需用冗長且完整名稱來引用數據庫對象。

  按照慣例,這些語句出現在代碼文件的頂部或頂部四周,在命名空間或類聲明之前。 Imports System.Data ' VB.NET Imports Oracle.DataAccess.Client ' ODP.NET Oracle managed provider using System.Data; // C# using Oracle.DataAccess.Client; // ODP.NET Oracle managed provider import System.Data.*; // J# import Oracle.DataAccess.Client; // ODP.NET Oracle managed provider
  連接字符串和對象

  Oracle 連接字符串和 Oracle 名稱解析是不可分的。 假定我們在 tnsnames.ora 文件中定義了一個數據庫別名 OraDb,如下: OraDb= (DESCRipTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)) ) (CONNECT_DATA= (SERVER=DEDICATED) (SERVICE_NAME=ORCL) ) )   要使用上面所述的在 tnsnames.ora 文件中定義的 OraDb 別名,您需要使用以下語法: Dim oradb As String = "Data Source=OraDb;User Id=scott;PassWord=tiger;" ' VB.NET string oradb = "Data Source=OraDb;User Id=scott;Password=tiger;"; // C#   不過,您可以修改連接字符串,這樣就不需用 tnsnames.ora 文件。 只需用在 tnsnames.ora 文件中定義別名的語句替換別名即可。 ' VB.NET Dim oradb As String = "Data Source=(DESCRIPTION=" _ + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))" _ + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" _ + "User Id=scott;Password=tiger;" string oradb = "Data Source=(DESCRIPTION=" // C# + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))" + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" + "User Id=scott;Password=tiger;";   正如您在上面看到的那樣,用戶名和口令是以不加密的文本形式嵌入到連接字符串中的。 這是創建連接字符串的最簡單的方法。 然而,從安全的角度而言不加密文本的方法是不可取的。 而且,您需要了解編譯的 .NET 應用程序代碼僅比不加密文本形式的源代碼文件稍微安全一點。 可以非常簡便的反編譯 .NET dll 和 exe 文件,進而查看原始的不加密文本形式的內容。 (加密實際上是正確的解決方案,但這個主題與我們這里的討論相差太遠。)

  接下來,您必須從連接類中完成一個連接對象的實例化。 連接字符串必須與連接對象關聯。 Dim conn As New OracleConnection(oradb) ' VB.NET
OracleConnection conn = new OracleConnection(oradb); // C#   注重,通過將連接字符串傳遞給連接對象的構造器(該構造器進行了重載),連接字符串與連接對象建立關聯。 構造函數的其他重載答應以下這些替代的語法: Dim conn As New OracleConnection() ' VB.NET conn.ConnectionString = oradb OracleConnection conn = new OracleConnection(); // C# conn.ConnectionString = oradb;   在連接字符串與連接對象建立關聯之后,使用 Open 方法來創建實際的連接。 conn.Open() ' VB.NET conn.Open(); // C#
  我們將在稍后介紹錯誤處理。

  Command 對象

  Command 對象用于指定執行的 SQL 命令文本 — SQL 字符串或存儲過程。 類似于 Connection 對象,它必須從完成其類的實例化,并且它擁有一個重載的構造函數。 Dim sql As String = "select dname from dept where deptno = 10" ' VB.NET Dim cmd As New OracleCommand(sql, conn) cmd.CommandType = CommandType.Text string sql = "select dname from dept where deptno = 10"; // C# OracleCommand cmd = new OracleCommand(sql, conn); cmd.CommandType = CommandType.Text;
  不同的重載,語法的結構稍微有點不同。 Command 對象有用于執行命令文本的方法。 不同的方法適用于不同類型的 SQL 命令。 檢索標量值

  從數據庫中檢索數據可以通過實例化一個 DataReader 對象并使用 ExecuteReader 方法(它返回一個 OracleDataReader 對象)來實現。 通過將列名稱或以零為基數的列序號傳遞給項屬性 B.NET 開發人員可以訪問返回的數據。 另一種選擇是使用存取程序類型方法來返回列數據。 Dim dr As OracleDataReader = cmd.ExecuteReader() ' VB.NET dr.Read() Label1.Text = dr.Item("dname") ' retrieve by column name Label1.Text = dr.Item(0) ' retrieve the first column in the select list Label1.Text = dr.GetString(0) ' retrieve the first column in the select list
  C# 開發人員必須使用存取器方法來檢索數據。 有適當類型的存取程序用于返回 .NET 本地數據類型,其他的存取程序用于返回本地 Oracle 數據類型。 以零為基數的序號被傳遞給存取程序,以指定返回哪一列。 OracleDataReader dr = cmd.ExecuteReader(); // C# dr.Read(); label1.Text = dr.GetString(0); // C# retrieve the first column in the select list
  在這個簡化的例子中,dname 的返回值是一個字符串,它用來設置標簽控件的文本的屬性值(也是一個字符串)。 但假如檢索的是 deptno,而不是字符串,那么將出現數據類型不匹配的情況。 當源數據類型與目標數據類型不匹配時,.NET 運行時將嘗試隱式地轉換數據類型。 有時數據類型不兼容,則隱式轉換將失敗,并跳出一個異常警報。 但即使可以進行隱式轉換,使用顯式數據類型轉換仍比用隱式數據類型轉換好。

  到整型的顯式轉換顯示如下: Label1.Text = CStr(dr.Item("deptno")) ' VB.NET integer to string cast
  在隱式轉換上,C# 的容錯能力不如 VB.NET。 您必須自己執行顯式轉換: string deptno = dr.GetInt16("deptno").ToString(); // C#
  您可以顯式地轉換標量值以及數組。

  關閉并清除

  可以調用連接對象的 Close 方法或 Dispose 方法來關閉到數據庫的連接。 Dispose 方法調用 Close 方法。 conn.Close() ' VB.NET conn.Dispose() ' VB.NET conn.Close(); // C# conn.Dispose(); // C#
  作為可選項,C# 提供了一種在連接超出范圍時自動清除連接的非凡語法。 使用 using 要害字可啟用這一特性。 using (OracleConnection conn = new OracleConnection(oradb)) { conn.Open(); OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = "select dname from dept where deptno = 10"; cmd.CommandType = CommandType.Text; OracleDataReader dr = cmd.ExecuteReader();
dr.Read(); label1.Text = dr.GetString(0); }
  您可以試驗在上機操作 1(從數據庫中檢索數據)和上機操作 2(增加交互性)中學到的一些概念。 錯誤處理

  Try-Catch-Finally 結構的錯誤處理是 .NET 語言的一部分。 下面是使用 Try-Catch-Finally 語法的一個相對最小的例子: Dim conn As New OracleConnection(oradb) ' VB.NET Try conn.Open() Dim cmd As New OracleCommand cmd.Connection = conn cmd.CommandText = "select dname from dept where deptno = " + TextBox1.Text cmd.CommandType = CommandType.Text If dr.Read() Then Label1.Text = dr.Item("dname") ' or use dr.Item(0) End If Catch ex As Exception ' catches any error MessageBox.Show(ex.Message.ToString()) Finally conn.Dispose() End Try OracleConnection conn = new OracleConnection(oradb); // C# try { conn.Open(); OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = "select dname from dept where deptno = " + textBox1.Text; cmd.CommandType = CommandType.Text; if (dr.Read()) // C# { label1.Text = dr.GetString(0); } } catch (Exception ex) // catches any error { MessageBox.Show(ex.Message.ToString()); } finally { conn.Dispose(); }   雖然這種方法將適當地捕捉嘗試從數據庫中獲取數據時發生的任何錯誤,但這種方法對用戶卻不友好。 例如,看看下面這條在數據庫不可用時顯示的消息。

在Oracle數據庫上構建.NET應用程序(圖六) 圖 6: 捕捉到一個 ORA-12545 錯誤,并向用戶顯示。
  Oracle DBA 或開發人員很清楚 ORA-12545 的意義,但是最終用戶不清楚。 一種更好的解決方案是添加一條額外的 Catch 語句來捕捉最常見的數據庫錯誤并顯示對用戶友好的消息。 Catch ex As OracleException ' catches only Oracle errors If InStr(1, ex.Message.ToString(), "ORA-1:", CompareMethod.Text) Then MessageBox.Show("Error attempting to insert duplicate data.") ElseIf InStr(1, ex.Message.ToString(), "ORA-12545:", CompareMethod.Text) Then MessageBox.Show("The database is unavailable.") Else MessageBox.Show("Database error: " + ex.Message.ToString()) End If Catch ex As Exception ' catches any error MessageBox.Show(ex.Message.ToString()) catch (OracleException ex) // catches only Oracle errors { switch (ex.Number) { case 1: MessageBox.Show("Error attempting to insert duplicate data."); break; case 12545: MessageBox.Show("The database is unavailable."); break; default: MessageBox.Show("Database error:" + ex.Message.ToString()); break; } } catch (Exception ex) // catches any error { MessageBox.Show(ex.Message.ToString()); }   注重上面的代碼示例中的兩條 Catch 語句。 假如沒有捕捉到任何 Oracle 錯誤,那么將跳過第一條 Catch 語句分支,讓第二條 Catch 語句來捕捉其他任何類型的錯誤。 在代碼中,應該根據從非凡到一般的順序對 Catch 語句排序。 在實施了對用戶友好的異常處理代碼之后,ORA-12545 錯誤消息顯示如下:

在Oracle數據庫上構建.NET應用程序(圖七)
圖 7: 針對 ORA-12545 錯誤的對用戶友好的消息
  Finally 代碼將始終執行,而無論錯誤是否發生。 通過在 Finally 代碼塊中加入連接對象的 Close 或 Dispose 方法調用,在執行了 Try-Catch-Finally 代碼段之后,數據庫連接將始終關閉。 試圖關閉沒有打開的數據庫連接不會導致錯誤。 例如,假如數據庫不可用,數據庫連接沒有打開,那么 Finally 代碼塊將試圖關閉不存在的連接。 執行多余的 Close 或 Dispose 是無效的。 只需將一條 Close 或 Dispose 方法放到 Finally 代碼塊中,將保證關閉連接。 利用 DataReader 檢索多個值

  到目前為止,我們的示例僅說明了如何檢索單個值。 DataReader 可以檢索多列和多行的值。 首先進行多行、單列的查詢: select deptno, dname, loc from dept where deptno = 10   要獲取列的值,可以使用以零為基數的序號或列名。 序號與查詢中的順序相關。 因而,可以在 VB.NET 中通過使用 dr.Item(2) 或 dr.Item("loc") 來查詢 loc 列的值。

  下面是將 dname 和來自上一查詢的 loc 列串連起來的代碼段: Label1.Text = "The " + dr.Item(1) + " department is in " + dr.Item("loc") ' VB.NET Label1.Text = "The " + dr.GetString(1) + " department is in " + dr.GetString(2); // C#   現在我們進行返回多行的查詢: select deptno, dname, loc from dept   要處理從 DataReader 中返回的多行,需要某種類型的循環結構。 此外,需要一個可以顯示多行的控件。 DataReader 是一個僅正向的只讀游標,因此不能將其與可更新或完全可滾動的控件(如 Windows Forms DataGrid 控件)捆綁在一起。 DataReader 與 ListBox 控件兼容,如以下代碼段所示: While dr.Read() ' VB.NET ListBox1.Items.Add("The " + dr.Item(1) + " department is in " + dr.Item("loc")) End While while (dr.Read()) // C# { listBox1.Items.Add("The " + dr.GetString(1) + " department is in " + dr.GetString(2); }   上機操作 3(利用 DataReader 檢索多列和多行)重點介紹了這些概念中的一部分。

  總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平远县| 长治县| 庆阳市| 化德县| 青河县| 当雄县| 通许县| 潼关县| 正镶白旗| 鞍山市| 永济市| 武清区| 海原县| 天津市| 武陟县| 桦川县| 澄江县| 鹤峰县| 昔阳县| 玉山县| 盈江县| 罗山县| 西藏| 藁城市| 佛学| 望奎县| 营山县| 沙田区| 乌苏市| 景东| 汉阴县| 河津市| 叶城县| 湘阴县| 津南区| 临汾市| 阳高县| 齐齐哈尔市| 固始县| 韶关市| 利辛县|