You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#/.NET使用Oracle Wallet连接Oracle数据库时遇异常问题

解决Oracle Wallet在C#控制台应用中连接失败的问题

核心问题定位

从调用栈的内部异常ArgumentOutOfRangeException: Index was out of range来看,Oracle驱动在读取Wallet证书集合时找不到对应索引的证书,根源是WalletLocation配置格式错误:PowerShell中使用的是直接文件路径,而C#代码误用了SQLNET.ORA风格的配置语法,导致驱动无法正确加载Wallet文件,进而触发索引越界异常。

解决方案

方案一:直接复用验证通过的连接字符串(推荐)

直接使用PowerShell中已验证有效的连接字符串,绕过OracleConfiguration的配置冲突:

using Oracle.ManagedDataAccess.Client;

OracleConnection orclCon = null;
try
{
    // 复用PowerShell中测试通过的连接字符串,注意转义反斜杠
    string connectionString = "Data Source=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCPS)(HOST = XXX)(PORT = 2484))(CONNECT_DATA = (SID = XXX)));User ID=XXX;Password=XXX!;Wallet_Location=c:\\Users\\XX\\Documents\\XX\\wallet_v5;";
    orclCon = new OracleConnection(connectionString);
    orclCon.Open();

    OracleCommand orclCmd = orclCon.CreateCommand();
    orclCmd.CommandText = "select * from wf_employees where rownum <= 10 ";
    OracleDataReader rdr = orclCmd.ExecuteReader();
    while (rdr.Read())
        Console.WriteLine("Employee Name: " + rdr.GetString(0));

    Console.ReadLine();
    rdr.Dispose();
    orclCmd.Dispose();
}
finally
{
    if (null != orclCon)
        orclCon.Close();
}

方案二:修正OracleConfiguration配置

如果需要通过OracleConfiguration统一配置,需修正WalletLocation为直接路径,并调整相关参数:

using Oracle.ManagedDataAccess.Client;

// 修正WalletLocation为直接文件路径,而非SQLNET.ORA格式
OracleConfiguration.WalletLocation = @"c:\Users\XX\Documents\XX\wallet_v5";
OracleConfiguration.SqlNetWalletOverride = true; // 启用Wallet覆盖,确保驱动优先使用指定路径
OracleConfiguration.SqlNetAuthenticationServices = "(tcps)";
OracleConfiguration.OracleDataSources.Add("V2SLCPRD", "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=XXX)(PORT=2484))(CONNECT_DATA=(SID=V2SLCPRD)))");

OracleConnection orclCon = null;
try
{
    orclCon = new OracleConnection("User ID=XXX;Password=XXX;data source=V2SLCPRD");
    orclCon.Open();

    OracleCommand orclCmd = orclCon.CreateCommand();
    orclCmd.CommandText = "select * from wf_employees where rownum <= 10 ";
    OracleDataReader rdr = orclCmd.ExecuteReader();
    while (rdr.Read())
        Console.WriteLine("Employee Name: " + rdr.GetString(0));

    Console.ReadLine();
    rdr.Dispose();
    orclCmd.Dispose();
}
finally
{
    if (null != orclCon)
        orclCon.Close();
}

额外注意事项

  • 确保C#项目中引用的Oracle.ManagedDataAccess.dll版本与PowerShell中使用的完全一致,版本差异可能导致配置解析逻辑不同
  • 检查Wallet目录下的文件完整性,必须包含cwallet.sso、ewallet.p12等核心文件
  • 若为.NET Core/.NET 5+应用,避免将Wallet放在需要管理员权限的目录下,确保应用运行时能访问该目录

内容的提问来源于stack exchange,提问作者twm1005

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:23:19