首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

.NET 應用開發實戰:使用 ODP.NET 連接 Oracle 資料庫完整指南

     編輯:Oracle 資料庫基礎

為什麼選擇 ODP.NET?

.NET 應用連接 Oracle 需要 Managed Data Provider。雖然 Microsoft 內建 System.Data.OleDb 與 System.Data.Odbc 通用提供者,但針對特定資料庫優化的原生提供者(Oracle ODP.NET、Microsoft OracleClient、第三方 Core Lab 等)在效能、功能支援、型別對應上具備決定性優勢。本文以 Oracle Data Provider for .NET (ODP.NET) 為例,示範 Visual Studio .NET 開發全流程。

前置檢查:用戶端連通性驗證

在 VS.NET 機器上安裝 Oracle Client 並設定 tnsnames.ora 後,用 SQL*Plus 測試連線:

sqlplus scott/tiger@OraDb
-- 成功連線代表客戶端配置正確,可進行開發

Visual Studio .NET 專案建立與引用

  1. 新建專案:File > New > Project > Visual Basic Projects > Windows Application,專案名 OtnWinApp,方案名 OtnSamples
  2. 方案總管右鍵 References > Add Reference,選擇 Oracle.DataAccess.dll(通常在 %ORACLE_HOME%\odp.net\bin\2.x)
  3. 程式碼頂部引入命名空間:
    Imports System.Data
    Imports Oracle.DataAccess.Client  ' ODP.NET 命名空間

連接字串:兩種寫法任君選擇

方式一:使用 TNS 別名(推薦,易維護)

' tnsnames.ora 定義:
' OraDb = (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)))

Dim oradb As String = "Data Source=OraDb;User Id=scott;Password=tiger;"

方式二:完整連接描述符(無需 tnsnames.ora)

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

安全性警示

連接字串含明文密碼,編譯後的 .NET 組件易被反編譯(ILDASM、Reflector)。生產環境應採用:

  • 加密配置區段(aspnet_regiis -pef connectionStrings)
  • Windows 整合驗證(OS 驗證,無密碼字串)
  • Oracle Wallet / Key Vault 外部化憑證管理

核心物件操作模式

1. 連接與命令基礎模式

Dim conn As New OracleConnection(oradb)
Dim cmd As New OracleCommand()
cmd.Connection = conn
cmd.CommandText = "SELECT DName FROM Dept WHERE DeptNo = :deptno"
cmd.CommandType = CommandType.Text
cmd.Parameters.Add("deptno", OracleDbType.Int32).Value = 10

Try
    conn.Open()
    Dim dname As String = CStr(cmd.ExecuteScalar())  -- 單一值
    Label1.Text = dname
Catch ex As OracleException
    HandleOracleError(ex)
Catch ex As Exception
    MessageBox.Show(ex.Message)
Finally
    conn.Dispose()  -- 確保關閉,含連線池歸還
End Try

2. DataReader 唯讀前向游標(高效能資料讀取)

Dim sql As String = "SELECT DeptNo, DName, Loc FROM Dept"
Dim cmd As New OracleCommand(sql, conn)
cmd.CommandType = CommandType.Text

conn.Open()
Dim dr As OracleDataReader = cmd.ExecuteReader()
While dr.Read()
    ' 三種存取方式:
    ' 1. 索引器(欄位名/序號):dr("DName") 或 dr(1)
    ' 2. 強型別 Get 方法:dr.GetString(1), dr.GetInt32(0)
    ' 3. GetValue/GetOracleValue 取得 Object/Oracle 型別
    ListBox1.Items.Add("Dept " & dr.GetInt32(0) & ": " & dr.GetString(1) & " @ " & dr.GetString(2))
End While
dr.Close()

關鍵差異:VB.NET 支援隱含型別轉換,C# 必須顯式轉換(dr.GetInt32(0).ToString())。

3. 參數化查詢防範 SQL 注入

cmd.CommandText = "SELECT * FROM Emp WHERE EmpNo = :empno AND DeptNo = :deptno"
cmd.Parameters.Clear()
cmd.Parameters.Add("empno", OracleDbType.Int32).Value = txtEmpNo.Text
cmd.Parameters.Add("deptno", OracleDbType.Int32).Value = txtDeptNo.Text
' 參數綁定順序不影響,但建議與 SQL 順序一致以利閱讀

錯誤處理:Try-Catch-Finally 最佳實踐

Try
    conn.Open()
    ' ... 執行命令 ...
Catch oraEx As OracleException
    ' 針對 Oracle 錯誤代碼給予友善訊息
    Select Case oraEx.Number
        Case 1      : MessageBox.Show("資料重複(唯一鍵衝突)")
        Case 12545  : MessageBox.Show("資料庫服務不可用,請稍後再試")
        Case 20001  : MessageBox.Show("自訂業務錯誤:" & oraEx.Message)
        Case Else   : MessageBox.Show("資料庫錯誤:" & oraEx.Message)
    End Select
Catch ex As Exception
    MessageBox.Show("系統錯誤:" & ex.Message)
Finally
    If conn.State = ConnectionState.Open Then conn.Close()
    conn.Dispose()
End Try

原則:Catch 區塊按「特殊→一般」排序;Finally 確保資源釋放;嘗試關閉未開啟的連線不會拋出例外。

C# 專用:using 區塊自動資源管理

using (OracleConnection conn = new OracleConnection(oradb))
{
    conn.Open();
    using (OracleCommand cmd = new OracleCommand("SELECT DName FROM Dept WHERE DeptNo = 10", conn))
    using (OracleDataReader dr = cmd.ExecuteReader())
    {
        if (dr.Read())
            label1.Text = dr.GetString(0);
    }
} // 區塊結束自動呼叫 Dispose(),等同 conn.Close()

進階主題:DataAdapter 與 DataSet(離線資料集)

Dim da As New OracleDataAdapter("SELECT * FROM Dept", conn)
Dim ds As New DataSet()
da.Fill(ds, "DeptTable")
' ds.Tables("DeptTable") 現可繫結至 DataGrid、離線修改、批次更新
' 更新時需設定 InsertCommand/UpdateCommand/DeleteCommand 或使用 OracleCommandBuilder

總結:開發檢查清單

  • [ ] 專案參考 Oracle.DataAccess.dll 正確版本(x86/x64 與 IIS/應用程式池一致)
  • [ ] 連接字串不含明文密碼(生產環境)
  • [ ] 所有動態 SQL 採用參數化查詢
  • [ ] 連線/命令/讀取器包裹在 Try-Catch-Finally 或 using 區塊
  • [ ] OracleException 依錯誤碼給予使用者友善回饋
  • [ ] 大量資料讀取使用 DataReader,離線編輯/繫結使用 DataAdapter+DataSet
  • [ ] 連線池預設啟用,嚴禁手動管理連線池,正確 Dispose 即可
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved