官方 EFOracleProvider 僅支援 Oracle 10g/11g,但生產環境仍在使用 Oracle 9i。本文記錄修改 Provider 原始碼以相容 9i 的關鍵步驟(紅色標註為新增/修改處)。
internal const string TokenOracle9i = "9i"; // add by xray2005
internal const string TokenOracle10g = "10g";
internal const string TokenOracle11g = "11g";
private EFOracleVersion _version = EFOracleVersion.Oracle9i; // 原為 Oracle11g
private string _token = TokenOracle9i; // 原為 TokenOracle10g
namespace EFOracleProvider {
internal enum EFOracleVersion {
Oracle9i = 9, // add by xray2005
Oracle10g = 10,
Oracle11g = 11
}
internal static class EFOracleVersionUtils {
internal static EFOracleVersion GetStorageVersion(EFOracleConnection connection) {
string serverVersion = connection.ServerVersion;
if (serverVersion.StartsWith("9."))
return EFOracleVersion.Oracle9i; // add by xray2005
else if (serverVersion.StartsWith("10."))
return EFOracleVersion.Oracle10g;
else if (serverVersion.StartsWith("11."))
return EFOracleVersion.Oracle11g;
throw new ArgumentException("Could not determine storage version...");
}
internal static string GetVersionHint(EFOracleVersion version) {
switch (version) {
case EFOracleVersion.Oracle9i: return EFOracleProviderManifest.TokenOracle9i; // add
case EFOracleVersion.Oracle10g: return EFOracleProviderManifest.TokenOracle10g;
case EFOracleVersion.Oracle11g: return EFOracleProviderManifest.TokenOracle11g;
default: throw new ArgumentException("...");
}
}
internal static EFOracleVersion GetStorageVersion(string versionHint) {
if (!string.IsNullOrEmpty(versionHint)) {
switch (versionHint) {
case EFOracleProviderManifest.TokenOracle9i: return EFOracleVersion.Oracle9i; // add
case EFOracleProviderManifest.TokenOracle10g: return EFOracleVersion.Oracle10g;
case EFOracleProviderManifest.TokenOracle11g: return EFOracleVersion.Oracle11g;
}
}
throw new ArgumentException("...");
}
internal static bool IsVersionX(EFOracleVersion storageVersion) {
return storageVersion == EFOracleVersion.Oracle9i
|| storageVersion == EFOracleVersion.Oracle10g
|| storageVersion == EFOracleVersion.Oracle11g; // add
}
}
}
修改完成後重新編譯 Provider,即可在連接字串指定 VersionHint=9i 或自動偵測 9i 環境下正常運作。