本文系統說明使用 Visual Studio .NET (VS.Net) 開發存取 Oracle 資料庫之 .NET 應用程式的完整流程,涵蓋 ODP.NET 環境建置、專案建立、連接字串、核心物件操作、錯誤處理、DataReader 進階用法,並附三個漸進式實作練習。
Oracle Data Provider for .NET Developer's Guide 10gOtnWinApp,方案名 OtnSamplesOracle.DataAccess.dll' VB.Net
Imports System.Data
Imports Oracle.DataAccess.Client
// C#
using System.Data;
using Oracle.DataAccess.Client;
Dim oradb As String = "Data Source=OraDb;User Id=scott;Password=tiger;"
// tnsnames.ora: OraDb = (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521))...)
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;"
安全警示:明文帳密嵌入程式碼不安全,生產環境請用加密配置檔或 Windows 整合驗證。
Dim conn As New OracleConnection(oradb)
conn.Open()
' 替代寫法
Dim conn As New OracleConnection()
conn.ConnectionString = oradb
conn.Open()
Dim sql As String = "SELECT dname FROM dept WHERE deptno = 10"
Dim cmd As New OracleCommand(sql, conn)
cmd.CommandType = CommandType.Text
Dim dr As OracleDataReader = cmd.ExecuteReader()
dr.Read()
Label1.Text = dr.Item("dname") ' VB.Net: 依欄位名或序號 dr.Item(0)
Label1.Text = dr.GetString(0) ' 強型別存取器
OracleDataReader dr = cmd.ExecuteReader();
dr.Read();
label1.Text = dr.GetString(0);
' VB.Net 顯式轉換
Label1.Text = CStr(dr.Item("deptno"))
// C# 顯式轉換
string deptno = dr.GetInt16("deptno").ToString();
' VB.Net
conn.Dispose() ' 包含 Close()
// 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);
} // 自動 Dispose
Dim conn As New OracleConnection(oradb)
Try
conn.Open()
' ... 執行命令 ...
Catch ex As Exception
MessageBox.Show(ex.Message.ToString())
Finally
conn.Dispose()
End Try
Catch ex As OracleException
If InStr(1, ex.Message.ToString(), "ORA-1:", CompareMethod.Text) > 0 Then
MessageBox.Show("嘗試插入重複資料。")
ElseIf InStr(1, ex.Message.ToString(), "ORA-12545:", CompareMethod.Text) > 0 Then
MessageBox.Show("資料庫不可用。")
Else
MessageBox.Show("資料庫錯誤: " + ex.Message.ToString())
End If
Catch ex As Exception
MessageBox.Show(ex.Message.ToString())
原則:OracleException 先捕獲特定錯誤碼,Exception 最後捕獲其他;Finally 確保連接關閉。
SELECT deptno, dname, loc FROM dept WHERE deptno = 10
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#
DataReader 唯前向唯讀,不支援 DataGrid 繫結,適合 ListBox:
SELECT deptno, dname, loc FROM dept
' VB.Net
While dr.Read()
ListBox1.Items.Add("The " + dr.Item(1) + " department is in " + dr.Item("loc"))
End While
// C#
while (dr.Read()) {
listBox1.Items.Add("The " + dr.GetString(1) + " department is in " + dr.GetString(2));
}
TextBox1.TextIf dr.Read() Then ... Else "deptno not found" 防無資料報錯掌握 ODP.NET 核心開發流程:
Oracle.DataAccess.dll + 匯入命名空間OracleConnection、OracleCommand、OracleDataReaderExecuteReader() + Read() + 強型別存取器讀取資料Try-Catch(OracleException)-Catch(Exception)-Finally 錯誤處理using (C#) / Dispose() (VB.Net) 確保資源釋放作者:John Paul Cook (Oracle Certified DBA, Microsoft MCSD .Net),專注 .NET 與 Oracle 整合開發。