在 Oracle 數據庫上使用 Visual Studio 2005 或 2008 構建_第1頁
在 Oracle 數據庫上使用 Visual Studio 2005 或 2008 構建_第2頁
已閱讀5頁,還剩19頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、在 Oracle 數據庫上使用 VisualStudio 2005 或 2008 構建 .NET 應用程序了解構建使用 Oracle 數據庫的 .NET 應用程序所涉及到的基本但不可或缺的過程。作者:John Paul Cook2008 年 9 月發布請閱讀本指南的 Visual Studio .NET 2003 版本。隨著 Microsoft 的 .NET Framework 的日益流行,許多開發人員迫切想了解關于將 .NET 應用程序與 Oracle 集成的最佳方法的信息 不僅在基本連通性方面,還包括與使用 VisualStudio2005 或 2008 進行有效應用程序開發的關系。 Or

2、acle 數據庫的 .NET 應用程序所涉及到的基本但不可或缺的過程,包括:如何添加工程引用,以在您的 .NET 工程中支持 Oracle 類如何創建 Oracle 數據庫連接字符串.如何使用 Connection、Command 和 DataReader 對象.您將有機會應用您在三個上機操作實踐雜不等。本文中的屏幕快照出自 VisualStudio2008,但體驗與 VisualStudio2005 中非常類似。在 Oracle 數據庫上保護 .NET 應用程序”。(另請參見 OTN 的 .NET 開發人員中心,以獲取涉及許多 Oracle.NET 應用程序生命周期問題的技術文章)。請注意,

3、免費的 OracleDeveloperToolsforVisualStudio(可從 OTN 下載)提供了一個 Visual Studio 插件,該插件可以簡化 Oracle 上的 .NET 應用程序開發,并使之更加直觀。但該主題超出了本文的討論范疇。.NET 數據提供程序除了基本的 Oracle 客戶端連通性軟件,.NET 應用程序還需要使用稱為(其中“受管理的”指的是代碼由 .NET 據提供程序是指 .NET 應用程序代碼和 Oracle 客戶端連通性軟件之間這一層。序而不是一般的 .NET OLE DB 數據提供程序實現的。Oracle、Microsoft 和第三方供應商都提供了針對 O

4、racle 產品進行了優化的 .NET 數據提供程序。Oracle 和 Microsoft 免費提供其 Oracle 數據提供程序。(Microsoft 為 .NETFramework2.0 提供的提供程序包含在該框架中,但仍需安裝 Oracle OracleDataProviderfor .NET (ODP.NET),該提供程序包含在 Oracle 數據庫中或單獨提供下載。ODP.NET 提供標準的 ADO.NET 數據訪問,同時提供特定于 Oracle 數據庫的特性,如 XML DB、數據訪問性能優化以及真正應用集群連接池。安裝 ODP.NET 和 Oracle VisualStudio

5、進行應 VS.NET 所在的計算機上能夠使用 Oracle SQL*Plus Oracle您已經正確地安裝和配置了 Oracle 客戶端軟件。Oracle如果您是初次接觸 Oracle中的“安裝 .NET 產品”一節,其中專門介紹了有關安裝和配置 ODP.NET 的背景信息;或參見 Oracle 數據庫文檔庫,以了解有關 Oracle 數據庫的一般信息。在 Visual Studio 2005 或 2008 中創建工程現在我們來創建一個用于從 Oracle 數據庫中檢索數據的 ODP.NET 應用程序。然后,我們將了解如何使用 ODP.NET 執行錯誤處理,以及如何處理其他數據檢索情況。在啟動

6、 Visual Studio 之后,第一個任務是創建一個工程。可以按如下所示選擇 File | New | Project,也可以單擊 File 正下方的 New Project 按鈕。圖1在Visual Studio 2008 Service Pack 出現一個 NewProject 對話框。在對話框左側的 ProjectTypes 下,選擇您的編程語言。在這個例子中,我們選擇“Visual Basic”。在 Visual Studioinstalledtemplates 下方的右側,選擇一個工程模板。為簡單起見,我們選擇“Windows Forms Application”。圖 2 New

7、 Project OraWinApp用 OraWinApp個工程時,許多人對二者使用相同的名稱。添加引用由于我們的工程必須與 Oracle 提供程序的 ODP.NET DLL 的引用。在 Solution Explorer 內,選擇工程名稱,右鍵單擊并選擇 AddReference。或者,您可以轉至菜單欄并選擇 Project,然后選擇 Add Reference。圖 3出現 Add Reference 對話框。圖 4 ODP.NETODP.NET 位于 Oracle.DataAccess 組件名下。從列表中選擇Oracle.DataAccess,然后單擊 OK 使工程知道 ODP.NET 數

8、據提供程序。Visual Basic/C# 語句添加引用之后,標準的做法是添加 VisualBasicImports 語句或 C#using 語全限定名來引用數據庫對象。前。Imports Oracle.DataAccess.Client Visual Basic ODP.NET Oracle managedproviderusing Oracle.DataAccess.Client; / C# ODP.NET Oracle managed provider添加完引用之后,Intellisense 將幫助您完成 Imports 或 using 語句的添加,如圖 5 所示。圖 5在 Visual

9、 Basic Imports連接字符串和對象Oracle 連接字符串和 Oracle 名稱解析是不可分的。假定您在 tnsnames.ora文件中定義了一個數據庫別名 OraDb,如下:OraDb=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)OraDb 別名定義了客戶端的數據庫地址連接信息。要使用上面所述的在tnsnames.ora 文件中定義的 OraDb 別名,您需要使用以下語法:Di

10、moradbAsString=DataSource=OraDb;UserId=scott;Password=tiger; Visual Basicstringoradb=Data Source=OraDb;UserId=scott;Password=tiger;/C# tnsnames.ora 在 tnsnames.ora 文件中定義別名的語句替換別名即可。 Visual BasicDim oradb As String = Data Source=(DESCRIPTION= _+(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=

11、1521) _+ (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL);_+ User Id=scott;Password=tiger;/ C#string oradb = Data Source=(DESCRIPTION=+(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521)+(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL);+ User Id=scott;Password=tiger; .NET 應用程序代碼僅比不加

12、密文本形式的源代碼文件稍微安全一點。可以非常簡便地反編譯 .NET DLL 和EXE 方案,但這個主題與我們這里的討論相差太遠。)對象關聯。Dim conn As New OracleConnection(oradb) Visual BasicOracleConnection conn = new OracleConnection(oradb); / C#的語法:Dim conn As New OracleConnection() Visual Basicconn.ConnectionString = oradbOracleConnection conn = new OracleConnect

13、ion(); / C#conn.ConnectionString = oradb;在連接字符串與連接對象建立關聯之后,使用 Open 方法來創建實際的連接。conn.Open() Visual Basicconn.Open(); / C#我們將在稍后介紹錯誤處理。Command 對象Command 對象用于指定執行的 SQL 命令文本 SQL 字符串或存儲過程。與Connection 對象類似,它必須從其類中完成實例化,并擁有一個重載的構造函ODP.NET 將在 departments 表 (DEPT) 中執行 SQL 返回部門編號 (DEPTNO) 為 10 的部門名稱 (DNAME)。Di

14、m sql As String = select dname from dept where deptno = 10 VisualBasicDim cmd As New OracleCommand(sql, conn)cmd.CommandType = CommandType.Textstring sql = select dname from dept where deptno = 10; / C#OracleCommand cmd = new OracleCommand(sql, conn);cmd.CommandType = CommandType.Text;Command 對象有用于執

15、行命令文本的方法,我們將在下一部分中講述。不同的方法適用于不同類型的 SQL 命令。檢索標量值可以通過實例化 OracleDataReader 對象并使用 ExecuteReader 方法從數據庫 OracleDataReader 的列序號傳遞給 OracleDataReader 可以訪問返回的數據。Dim dr As OracleDataReader = cmd.ExecuteReader() Visual Basicdr.Read()Label1.Text = dr.Item(dname) retrieve by column nameLabel1.Text = dr.Item(0) re

16、trieve the first column in the select listLabel1.Text = dr.GetString(0) return a .NET data typeLabel1.Text = dr.GetOracleString(0) return an Oracle data type有適當類型的存取程序用于返回 .NET 地 Oracle 數據類型,所有這些存取程序都受 C#、Visual Basic 或任何其他 .NET OracleDataReader dr = cmd.ExecuteReader(); / C#dr.Read();label1.Text =

17、drdname.ToString(); / C# retrieve by column namelabel1.Text = dr.GetString(0).ToString(); / return a .NET data typelabel1.Text = dr.GetOracleString(0).ToString(); / return an Oracledata type在這個簡化的例子中,DNAME 本屬性值(也是一個字符串)。但如果檢索的是 DEPTNO,而不是字符串,將出現數據類型不匹配的情況。當源數據類型與目標數據類型不匹配時,.NET 運行數據類型轉換好。到整型的顯式轉換顯示如

18、下:Label1.Text = CStr(dr.Item(deptno) Visual Basic integer to stringcastC# is not as forgiving as Visual Basic on implicit conversions. Youllfind yourself doing explicit conversions:label1.Text = dr.GetInt16(deptno).ToString(); / C#您可以顯式地轉換標量值以及數組。關閉并清除可以調用連接對象的 Close 或 Dispose 方法來關閉到數據庫的連接。Dispose方法

19、調用 Close 方法。conn.Close() Visual Basicconn.Dispose() Visual Basicconn.Close(); / C#conn.Dispose(); / C#如果您使用 VB 的 Using 關鍵字或 C# 的 using 關鍵字,則不必顯式調用Close 或 Dispose。using (OracleConnection conn = new OracleConnection(oradb) / C#conn.Open();OracleCommand cmd = new OracleCommand();cmd.Connection = conn;c

20、md.CommandText = select dname from dept where deptno = 10;cmd.CommandType = CommandType.Text;OracleDataReader dr = cmd.ExecuteReader();dr.Read();label1.Text = dr.GetString(0);此外,OracleCommand 包含一個 Dispose 方法;OracleDataReader 包含一個Close 方法和一個 Dispose 方法。關閉并清除 .NET 對象將釋放系統資源,從上機操作 上機操作 (增加交互性)中學到的一些概念。

21、錯誤處理當錯誤發生時,.NET 應用程序應該能夠適當地處理錯誤,并通過提供有意義的消息來通知用戶。Try-Catch-Finally 結構的錯誤處理是 .NET 語言的一部分;下面是使用 Try-Catch-Finally 語法的一個相對最小的示例: Visual BasicTryconn.Open()Dim cmd As New OracleCommandcmd.Connection = conncmd.CommandText = select dname from dept where deptno = +TextBox1.Textcmd.CommandType = CommandType

22、.TextIf dr.Read() ThenLabel1.Text = dr.Item(dname) or use dr.Item(0)End IfCatch ex As Exception catches any errorMessageBox.Show(ex.Message.ToString()Finally In a real application, put cleanup code here.End Try/ C#tryconn.Open();OracleCommand cmd = new OracleCommand();cmd.Connection = conn;cmd.Comma

23、ndText = select dname from dept where deptno = +textBox1.Text;cmd.CommandType = CommandType.Text;if (dr.Read() / C#label1.Text = drdname.ToString();/ or use dr.GetOracleString(0).ToString()catch (Exception ex) / catches any errorMessageBox.Show(ex.Message.ToString();finally/ In a real application, p

24、ut cleanup code here.方法對用戶卻不友好。例如,看看下面這條在數據庫不可用時顯示的消息:圖 6 ORA-12545OracleDBA 或開發人員很清楚 ORA-12545 的意義,但最終用戶不清楚。一種更好的解決方案是添加一條額外的 Catch 語句來捕獲最常見的數據庫錯誤并顯示對用戶友好的消息。Catch ex As OracleException catches only Oracle errorsSelect Case ex.NumberCase 1MessageBox.Show(Error attempting to insert duplicatedata.)Ca

25、se 12545MessageBox.Show(The database is unavailable.)Case ElseMessageBox.Show(Databaseerror:+ex.Message.ToString()End SelectCatch ex As Exception catches any errorMessageBox.Show(ex.Message.ToString()catch (OracleException ex) / catches only Oracle errorsswitch (ex.Number)case 1:MessageBox.Show(Erro

26、r attempting to insert duplicatedata.);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 not previously caughtMessageBox.Show(ex.Message.ToString();注意上述代碼示例中的兩條 Catch 語句。如

27、果沒有捕獲到任何 Oracle 錯誤, Oracle 代碼中,應該根據從特殊到一般的順序對 Catch 語句排序。在執行完用戶友好的異常處理代碼之后,ORA-12545 錯誤消息顯示如下:圖 7ORA-12545無論是否發生錯誤,Finally 代碼塊總會執行。清除代碼即包含在此代碼塊中。如果未使用 Using 或 using,應清除 Finally 代碼塊中的連接和其他對象。利用 DataReader 檢索多個值到目前為止,我們的示例僅說明了如何檢索單個值。OracleDataReader 可以檢索多列和多行的值。首先執行多列、單行查詢:select deptno, dname, loc f

28、rom dept where deptno = 10要獲取列的值,可以使用以零為基數的序號或列名。序號與查詢中的順序相關。 VisualBasic 中通過使用 dr.Item(2) 或 dr.Item(loc) 來檢索 LOC 列的值。下面是將來自上一查詢的 DNAME 和 LOC 列串連起來的代碼段:Label1.Text = The + dr.Item(dname) + department is in +dr.Item(loc) VBlabel1.Text = The + drdname.ToString() + department is in +drloc.ToString(); /

29、 C#現在我們進行返回多行的查詢:select deptno, dname, loc from dept要處理從 OracleDataReader 需要一個可以顯示多行的控件。OracleDataReader 是一個僅正向的只讀游標, WindowsFormsDataGrid 控件)捆綁在一起。OracleDataReader 與 ListBox 控件兼容,如以下代碼段所示:While dr.Read() Visual BasicListBox1.Items.Add(The + dr.Item(dname) + department is in + dr.Item(loc)End Whilew

30、hile (dr.Read() / C#listBox1.Items.Add(The+drdname.ToString()+departmentisin +drloc.ToString();上機操作 (利用 OracleDataReader 的一部分。在 x64 上構建和運行在 x64 操作系統上運行 VisualStudio2008 時,Activesolutionplatform 默認為 Any CPU。在構建工程之前請將其更改為 x86。圖 8在 64位平臺上構建時將Any CPU x86結論本文向您介紹了使用 .NET 編程語言訪問 Oracle 夠連接數據庫并檢索多列和多行。 1在開

31、始之前,您必須已經創建一個工程并添加了引用,如本文前面所述。1. 接著向 Windows 表單中添加一個按鈕控件和一個標簽控件。務必在這些控件的上方留出空間,以便在上機操作 2 中添加其他控件。圖 912. 添加代碼,它們用于從 Oracle 數據庫中檢索數據并在表單上顯示結果。雙擊該按鈕,因為它將為事件處理程序創建一個 stub。圖 10stub3. 在 PublicClass 聲明之前添加 VisualBasicImports 語句,或在命名空間聲明之前添加 C# using 語句。4. ImportsOracle.DataAccess.Client Visual Basic,ODP.NE

32、TOraclemanaged provider6. using Oracle.DataAccess.Client; / C#, ODP.NET Oracle managedprovider7. 在 PrivateSub 和 EndSub 語句之間添加 VisualBasic 版本的單擊事件處理程序代碼(請務必用您服務器的主機名替代 ORASRVR):8. Dim oradb As String=Data Source=(DESCRIPTION=(ADDRESS_LIST=_(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL); _+ User

33、Id=scott;Password=tiger;11.12.13. Dim conn As New OracleConnection(oradb) Visual Basic14. conn.Open()18. cmd.CommandText = select dname from dept where deptno = 1022. dr.Read() replace this statement in next lab23. Label1.Text = dr.Item(dname) or dr.Item(0), remove in next將以下 C# 代碼添加到按鈕單擊事件處理程序的 和 務

34、必用您服務器的主機名替代 ORASRVR):string oradb = Data Source=(DESCRIPTION=(ADDRESS_LIST=+(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521)+(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL);+ User Id=scott;Password=tiger;OracleConnection conn = new OracleConnection(oradb); / C#conn.Open();cmd.CommandText = sele

35、ct dname from dept where deptno = 10;cmd.CommandType = CommandType.Text;OracleDataReader dr = cmd.ExecuteReader();dr.Read(); / replace this statement in next lablabel1.Text = drdname.ToString(); / remove in next labdr.Dispose();cmd.Dispose();conn.Dispose();圖 11 2現在在代碼中實現了數據庫訪問的基本功能,下一步是為應用程序增加交互性。與運

36、行硬編碼的查詢不同,可以添加一個文本框來接受用戶輸入的部門編號(DEPTNO)。1. Label2控件的文本屬性設置為 Enter Deptno:并確保沒有設置 TextBox1 的Text 屬性。圖 1223. cmd.CommandText = select dname from dept where deptno = +TextBox1.Text VB4.cmd.CommandText = select dname from dept where deptno = +textBox1.Text; / C#5. 運行應用程序。為 DEPTNO 輸入 10 測試應用程序。輸入一個無效的DEP

37、TNO(如 50)重新測試應用程序。應用程序將退出。圖 136. 修改代碼以防止在輸入無效的 DEPTNO 時出現錯誤。讓我們回顧一下,ExecuteReader 方法實際返回一個對象。將包含 dr.Read 的行替換為以下所有語句。Label1.Text = dr.Item(dname).ToString()9. Else10. Label1.Text = deptno not found11. End If17. else18. 19. label1.Text = deptno not found;20. 輸入不存在的 DEPTNO 字母 A 代替數字,然后單擊按鈕。應用程序退出。很明顯,我們的應用程序需要更好的方法來處理錯誤。上應用程序必須添加強健的錯誤處理功能。不是所有的錯誤都是可預防的,因此必須具備錯誤處理功能。 3 OracleDataRe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論