| Oracle DB 版本 | ODAC 下載包 | 關鍵組件 |
| 19c/21c | ODAC 19.x / 21.x | Instant Client 19/21 + ODP.NET Core/Managed |
| 12c/18c | ODAC 12.2 / 18.3 | Instant Client 12/18 + ODP.NET 4.x |
| 11g | ODAC 11.2.0.4 | Instant Client 11.2 + ODP.NET 2.x/4.x |
下載地址:Oracle ODAC 官方下載頁
三步輕量化部署流程
1. 解壓核心文件
從 ODAC 包提取以下文件至應用目錄 bin\Oracle:
oci.dll、oraociei19.dll(Instant Client 核心)
Oracle.ManagedDataAccess.dll(Managed Driver,推薦)
- 或
Oracle.DataAccess.dll(Unmanaged Driver,需匹配位數)
2. 環境變量配置(僅 Unmanaged Driver 需要)
SET ORACLE_HOME=C:\App\bin\Oracle
SET PATH=%ORACLE_HOME%;%PATH%
SET TNS_ADMIN=%ORACLE_HOME%\network\admin
Managed Driver 完全無需環境變量,配置全在 app.config 中完成。
3. TNS 配置文件
在 TNS_ADMIN 目錄創建 tnsnames.ora:
ORCL_PROD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ORCL)
(SERVER = DEDICATED)
)
)
C# 連接代碼最佳實踐
托管驅動標準模式(推薦)
using Oracle.ManagedDataAccess.Client;
using System.Configuration;
public class OracleRepository : IDisposable
{
private readonly OracleConnection _conn;
public OracleRepository(string connectionName = "OracleConn")
{
var connStr = ConfigurationManager.ConnectionStrings[connectionName].ConnectionString;
_conn = new OracleConnection(connStr);
_conn.Open();
}
public IEnumerable<T> Query<T>(string sql, object param = null)
{
using var cmd = _conn.CreateCommand();
cmd.CommandText = sql;
cmd.BindByName = true; // 關鍵:按名稱綁定參數
if (param != null)
{
foreach (var prop in param.GetType().GetProperties())
{
cmd.Parameters.Add(prop.Name, prop.GetValue(param));
}
}
using var reader = cmd.ExecuteReader();
while (reader.Read())
{
yield return MapToEntity<T>(reader);
}
}
public void Dispose() => _conn?.Dispose();
}
配置文件範本
<configuration>
<configSections>
<section name="oracle.manageddataaccess.client"
type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess" />
</configSections>
<connectionStrings>
<add name="OracleConn"
connectionString="Data Source=ORCL_PROD;User Id=app_user;Password=***;Pooling=true;Min Pool Size=5;Max Pool Size=100;"
providerName="Oracle.ManagedDataAccess.Client" />
</connectionStrings>
<oracle.manageddataaccess.client>
<version number="*"/>
<settings>
<setting name="TNS_ADMIN" value=".\Oracle\network\admin" />
<setting name="SQLNET.ENCRYPTION_CLIENT" value="REQUIRED" />
<setting name="SQLNET.ENCRYPTION_TYPES_CLIENT" value="AES256" />
</settings>
</oracle.manageddataaccess.client>
</configuration>
連接池優化參數
| 參數 | 默認值 | 建議生產值 | 說明 |
| Pooling | true | true | 必須啟用 |
| Min Pool Size | 1 | 5-10 | 預熱連接,減少冷啟動延遲 |
| Max Pool Size | 100 | 200-500 | 根據並發量調整 |
| Connection Lifetime | 0 | 300 | 秒,定期回收防止連接泄漏 |
| Validate Connection | false | true | 獲取連接時驗證有效性 |
常見問題排查
ORA-12541: TNS:無監聽程序
- 檢查防火牆 1521 埠
- 驗證
lsnrctl status 監聽狀態
- 確認
tnsnames.ora HOST/PORT 正確
ORA-01017: 用戶名/密碼無效
- 檢查大小寫敏感性(12c+ 默認區分大小寫)
- 確認賬號未鎖定/過期
- 驗證
SEC_CASE_SENSITIVE_LOGON 參數
BadImageFormatException
- Unmanaged Driver 位數不匹配:32位應用需 32位 ODP.NET
- 強烈建議遷移至 Managed Driver 避免此類問題
遷移建議:Unmanaged → Managed
- NuGet 安裝
Oracle.ManagedDataAccess.Core(.NET Core/5+)或 Oracle.ManagedDataAccess(.NET Framework)
- 移除
Oracle.DataAccess.dll 所有引用
- 命名空間統一為
Oracle.ManagedDataAccess.Client
- 刪除環境變量依賴,配置下沉至
app.config
- 測試驗證:連接池、事務、REF CURSOR、Udt 等場景
- 上一篇文章: Oracle 存儲過程開發完全指南:語法、進階特性與企業級最佳實踐
- 下一篇文章: Linux 下 Oracle 數據庫徹底卸載清理指南:從進程終止到用戶刪除的標準化操作手冊
Copyright ©
程式碼之家 All Rights Reserved