 
  圖 2: 使用 New Project 對話框      您將需要為工程(我們使用 OtnWinApp)和解決方案(我們使用 OtnSamples)指定有意義的名稱。 一個解決方案包含一個或多個工程。 當一個解決方案僅包含一個工程時,許多人對二者使用相同的名稱。 添加引用 因為我們的工程必須與 Oracle 數據庫連接,因此必須添加一個到包含我們選擇的數據供給程序的 dll 的引用。 在 Solution EXPlorer 內,選擇 References 節點,右鍵單擊并選擇 Add Reference。 或者,您可以轉至菜單欄并選擇 Project,然后選擇 Add Reference。
               圖 2: 使用 New Project 對話框      您將需要為工程(我們使用 OtnWinApp)和解決方案(我們使用 OtnSamples)指定有意義的名稱。 一個解決方案包含一個或多個工程。 當一個解決方案僅包含一個工程時,許多人對二者使用相同的名稱。 添加引用 因為我們的工程必須與 Oracle 數據庫連接,因此必須添加一個到包含我們選擇的數據供給程序的 dll 的引用。 在 Solution EXPlorer 內,選擇 References 節點,右鍵單擊并選擇 Add Reference。 或者,您可以轉至菜單欄并選擇 Project,然后選擇 Add Reference。  
  圖 4: 選擇 ODP.NET 治理的數據供給程序      從列表中選擇 Oracle.Dataaccess.dll,然后單擊 Select 按鈕,最后單擊 OK 按鈕,使您的工程能夠找到 ODP.NET 數據供給程序。
               圖 4: 選擇 ODP.NET 治理的數據供給程序      從列表中選擇 Oracle.Dataaccess.dll,然后單擊 Select 按鈕,最后單擊 OK 按鈕,使您的工程能夠找到 ODP.NET 數據供給程序。              圖 5: 選擇 Oracle Managed Provider 之后的解決方案瀏覽器        VB.NET/C# 語句 在添加引用之后,標準的做法是要添加 VB.NET Imports 語句、C# using 語句或 J# import 語句。 從技術上說這些語句不是必要的,但是使用它們可以讓您不需用冗長且完整名稱來引用數據庫對象。
               圖 5: 選擇 Oracle Managed Provider 之后的解決方案瀏覽器        VB.NET/C# 語句 在添加引用之后,標準的做法是要添加 VB.NET Imports 語句、C# using 語句或 J# import 語句。 從技術上說這些語句不是必要的,但是使用它們可以讓您不需用冗長且完整名稱來引用數據庫對象。                                                                                              圖 6: 捕捉到一個 ORA-12545 錯誤,并向用戶顯示。      Oracle DBA 或開發人員很清楚 ORA-12545 的意義,但是最終用戶不清楚。 一種更好的解決方案是添加一條額外的 Catch 語句來捕捉最常見的數據庫錯誤并顯示對用戶友好的消息。   OracleException class does not have a Number property in VB.NET.) -->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 IfCatch 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 錯誤消息顯示如下:
               圖 6: 捕捉到一個 ORA-12545 錯誤,并向用戶顯示。      Oracle DBA 或開發人員很清楚 ORA-12545 的意義,但是最終用戶不清楚。 一種更好的解決方案是添加一條額外的 Catch 語句來捕捉最常見的數據庫錯誤并顯示對用戶友好的消息。   OracleException class does not have a Number property in VB.NET.) -->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 IfCatch 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 錯誤消息顯示如下:              圖 7: 針對 ORA-12545 錯誤的對用戶友好的消息      Finally 代碼將始終執行,而無論錯誤是否發生。 通過在 Finally 代碼塊中加入連接對象的 Close 或 Dispose 方法調用,在執行了 Try-Catch-Finally 代碼段之后,數據庫連接將始終關閉。 試圖關閉沒有打開的數據庫連接不會導致錯誤。 例如,假如數據庫不可用,數據庫連接沒有打開,那么 Finally 代碼塊將試圖關閉不存在的連接。 執行多余的 Close 或 Dispose 是無效的。 只需將一條 Close 或 Dispose 方法放到 Finally 代碼塊中,將保證關閉連接。   利用 DataReader 檢索多個值
               圖 7: 針對 ORA-12545 錯誤的對用戶友好的消息      Finally 代碼將始終執行,而無論錯誤是否發生。 通過在 Finally 代碼塊中加入連接對象的 Close 或 Dispose 方法調用,在執行了 Try-Catch-Finally 代碼段之后,數據庫連接將始終關閉。 試圖關閉沒有打開的數據庫連接不會導致錯誤。 例如,假如數據庫不可用,數據庫連接沒有打開,那么 Finally 代碼塊將試圖關閉不存在的連接。 執行多余的 Close 或 Dispose 是無效的。 只需將一條 Close 或 Dispose 方法放到 Finally 代碼塊中,將保證關閉連接。   利用 DataReader 檢索多個值  圖 8: 在上機操作 1 中包含按鈕和標簽控件的表單
                                 圖 8: 在上機操作 1 中包含按鈕和標簽控件的表單                   圖 9: 單擊事件處理程序 stub。
                                 圖 9: 單擊事件處理程序 stub。                   圖 10: 成功檢索到數據
                                 圖 10: 成功檢索到數據                         圖 11: 包含按鈕和標簽控件的表單(上機操作 2 )
                                 圖 11: 包含按鈕和標簽控件的表單(上機操作 2 )                   圖 12: 一個未處理的異常
                                 圖 12: 一個未處理的異常                   圖 13: 添加了 ListBox 的表單
                                 圖 13: 添加了 ListBox 的表單                  新聞熱點
疑難解答