首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

C# Oracle 資料庫操作類完整實作:連線池、參數化、交易、存儲過程、日誌、XML 配置

     編輯:Oracle 資料庫相關知識

企業級 C# (.NET Framework) 操作 Oracle 的封裝類,基於 System.Data.OracleClient(Microsoft 官方提供,已棄用但仍廣泛使用)或建議遷移至 Oracle.ManagedDataAccess。本類涵蓋:單例連線管理、參數化查詢、DataTable/DataSet 填充、交易批次、存儲過程輸出參數、XML 配置多環境、異常日誌寫入 XML。

核心類別結構

using System;
using System.Data;
using System.Configuration;
using System.Data.OracleClient;  // 建議改用 Oracle.ManagedDataAccess.Client
using System.Text;
using System.Windows.Forms;
using System.Xml;

public class MyOraDB
{
    // 連線字串從 App.config 讀取,支援多環境切換
    private OracleConnection OpenOracleDBConn() { ... }
    private void CloseOracleDBConn(OracleConnection conn) { ... }
    private OracleDataReader CreateOracleDataReader(string sql) { ... }

    // 1. 執行無回傳 SQL (INSERT/UPDATE/DELETE/DDL)
    public int ExcuteSqlWithNoQuery(string vSql) { ... }

    // 2. 查詢單一數值
    public int ExcuteSqlWithSingleNum(string vSql) { ... }

    // 3. 查詢單一字串
    public string ExcuteSqlWithSingleString(string vSql) { ... }

    // 4. 查詢 DataTable
    public DataTable ExcuteSqlWithDataTable(string vSql) { ... }

    // 5. 查詢 DataSet
    public DataSet ExcuteSqlWithDataSet(string vSql) { ... }

    // 6. 交易批次執行
    public string ExcuteSqlTransactionWithString(string[] vSqlArray) { ... }

    // 7. 執行存儲過程 (無回傳)
    public void ExcuteProcedureWithNonQuery(string vProcedureName, OracleParameter[] parameters) { ... }

    // 8. 執行存儲過程 (回傳字串輸出參數)
    public string ExcuteProcedureWithSingleString(string vProcedureName, OracleParameter[] parameters) { ... }

    // 9. 執行存儲過程 (回傳數值輸出參數)
    public int ExcuteProcedureWithSingleNum(string vProcedureName, OracleParameter[] parameters) { ... }

    // 10. 建立參數輔助
    public OracleParameter CreateParameter(string name, OracleType type, int size, ParameterDirection dir, object value) { ... }

    // 11. 異常日誌寫入 XML
    private void WriteLog(string message) { ... }
}

App.config 多環境配置範例

<configuration>
  <appSettings>
    <add key="OraDBName" value="MESDB_03" />  <!-- 切換環境:MESDB_03 / MESDBTEST_03 -->
    <add key="LogAddress" value="\Logs\OraDBLog.xml" />
  </appSettings>
  <connectionStrings>
    <add name="MESDB_03" connectionString="Data Source=SZMESDB;Persist Security Info=True;User ID=MESDB_03;Password=MESDB;Unicode=True;" />
    <add name="MESDBTEST_03" connectionString="Data Source=SZMESDB;Persist Security Info=True;User ID=MESDBTEST_03;Password=MESDB;Unicode=True;" />
  </connectionStrings>
</configuration>

關鍵實作細節

  • 連線管理: 每次操作開啟/關閉連線,依賴 ADO.NET 連線池(預設啟用),避免長連線洩漏
  • 參數化查詢: 所有公開方法僅接受 SQL 文本,**嚴禁字串拼接參數**,防 SQL 注入
  • 交易控制: ExcuteSqlTransactionWithString 接受 SQL 陣列,單一 OracleTransaction,異常自動 Rollback
  • 存儲過程輸出: 約定輸出參數名 O_FLAG,型別 VarChar/Int32,方向 Output
  • 日誌機制: 異常寫入 XML 檔(LogAddress),含行號、訊息、時間戳,支援事後追蹤
  • 資源釋放: finally 區塊確保 Connection.Close()、Command.Dispose()、Reader.Close()

遷移建議:Oracle.ManagedDataAccess

-- NuGet 安裝
Install-Package Oracle.ManagedDataAccess

-- 命名空間變更
using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.Types;

-- 連線字串相容(Managed Driver 相容 ODP.NET Unmanaged 連線字串)
-- 移除 System.Data.OracleClient 參考

使用範例

var db = new MyOraDB();

// 查詢 DataTable
DataTable dt = db.ExcuteSqlWithDataTable("SELECT * FROM emp WHERE deptno = :d", 
    db.CreateParameter("d", OracleType.Number, 0, ParameterDirection.Input, 20));

// 交易批次
string[] sqls = {
    "INSERT INTO log(msg) VALUES('start')",
    "UPDATE account SET bal = bal - 100 WHERE id = 1",
    "UPDATE account SET bal = bal + 100 WHERE id = 2",
    "INSERT INTO log(msg) VALUES('commit')"
};
string result = db.ExcuteSqlTransactionWithString(sqls);  // 回傳 "SUCCESS" 或錯誤訊息

// 存儲過程
var params = new[] {
    db.CreateParameter("p_id", OracleType.Number, 0, ParameterDirection.Input, 100),
    db.CreateParameter("O_FLAG", OracleType.Int32, 100, ParameterDirection.Output, null)
};
int ret = db.ExcuteProcedureWithSingleNum("pkg_account.transfer", params);

資料庫操作類是應用與 Oracle 的**契約層**。封裝連線池、參數化、交易、日誌、配置管理,才能在高併發、多環境、長期維護中保持穩定。**建議全專案統一引用此類,禁止散落直連 ADO.NET 程式碼**。

作者:Luos.Luo (SalePlayer.Com 創始人)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved