System.DllNotFoundException: 無法載入 DLL 'oci.dll':找不到指定的模組。 (HRESULT: 0x8007007E)
或
Oracle.DataAccess.Client.OracleException: The provider is not compatible with the version of Oracle client
發生環境:Windows 2000 / XP / 2003 Server,Oracle Client 9.2.0.x,.NET Framework 1.1/2.0
oci.dll 位於 Oracle Client 安裝目錄 %ORACLE_HOME%\binoci.dll 所在目錄:%ORACLE_HOME%\bin%ORACLE_HOME% (含 bin 目錄的父目錄)檔案總管 → %ORACLE_HOME% (如 C:\Oracle\Ora92)
右鍵 → 內容 → 安全性 標籤 → 進階 按鈕
→ 權限 標籤 → 找到 Authenticated Users → 編輯
→ 勾選「完全控制」 → 確定 → 全部確定
→ 重新啟動 IIS (iisreset) 或重開機
# Windows Server 2003 / Vista+ (ICACLS)
icacls "C:\Oracle\Ora92" /grant "Authenticated Users:(OI)(CI)F" /T
# Windows 2000 / XP (CACLS)
cacls "C:\Oracle\Ora92" /E /G "Authenticated Users:F" /T
| 權限層級 | 包含權限 | 是否足夠 |
|---|---|---|
| 讀取與執行 | 列出資料夾、讀取檔案、執行 DLL | 理論足夠,但實測常失敗 |
| 修改 | 讀取+寫入+刪除 | 通常足夠 |
| 完全控制 | 修改+變更權限+取得擁有權 | 最穩健,解決所有衍生權限問題 |
實務經驗:Oracle Client 執行時可能需在目錄下建立暫存檔、日誌、追蹤檔,唯有完全控制能無條件滿足。
%ORACLE_HOME%\bin 授權,而非整個 ORACLE_HOMEOracleClientUser),設定 IIS 應用程式集區身分為此帳號,僅授權此帳號# 確保 Oracle Client bin 目錄在 PATH 最前段
PATH=C:\Oracle\Ora92\bin;%PATH%
HKLM\SOFTWARE\ORACLE\KEY_* 中的 ORACLE_HOMEohome.exe (Oracle Home Selector) 切換優先順序gacutil /l Oracle.DataAccess 檢查並清理# 簡單測試程式 (C#)
using System;
using Oracle.DataAccess.Client;
class TestOci {
static void Main() {
string connStr = "Data Source=ORCL;User Id=scott;Password=tiger;";
using (OracleConnection conn = new OracleConnection(connStr)) {
conn.Open();
Console.WriteLine("連線成功! Server Version: " + conn.ServerVersion);
}
}
}
結語:oci.dll 載入失敗 90% 以上為 %ORACLE_HOME% 目錄權限不足。授權 Authenticated Users 完全控制是最快修復,生產環境建議改用專用服務帳號實現最小權限原則。