企業級 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) { ... }
}
<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>
ExcuteSqlTransactionWithString 接受 SQL 陣列,單一 OracleTransaction,異常自動 RollbackO_FLAG,型別 VarChar/Int32,方向 OutputLogAddress),含行號、訊息、時間戳,支援事後追蹤finally 區塊確保 Connection.Close()、Command.Dispose()、Reader.Close()-- 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 創始人)