首页 > 解决方案 > C# OracleDataAdapater 填充命令抛出“索引超出数组边界”

问题描述

我遇到了这个问题,不知道如何解决它或如何获取有关错误的更多信息,以便我可以查明来源。

我正在执行一个使用数据适配器填充数据集的 Oracle 查询。它在数组边界之外抛出一个索引,我什至看不到引用的是什么数组!

我在 SQL Developer 中运行查询并运行良好并返回结果,所以我很确定它不是查询本身。

public DataSet GetItemsByDateRange(string[] saLabelIDs, DateTime dtStartDate, DateTime dtEndDate)
{
    DataSet ds = new DataSet();
    List<OracleParameter> spParams = new List<OracleParameter>();
    string sLabelIDs = "'" + String.Join("','", saLabelIDs) + "'";

    string sQuery = "SELECT /*+ FULL(t) PARALLEL(t, 32)*/ * " +
        "FROM SomeTable@DBLinkName t " +
        "WHERE (R_LAST_UPDT_DT >= :StartDate AND R_LAST_UPDT_DT <= :EndDate) " +
        "AND R_ID IN(" + sLabelIDs + ") " +
        "ORDER BY R_ID, R_ITEM_LABEL, R_LAST_UPDT_DT DESC";

    try
    {
        spParams.Add(new OracleParameter("StartDate", OracleDbType.Timestamp, dtStartDate, ParameterDirection.Input));
        spParams.Add(new OracleParameter("EndDate", OracleDbType.Timestamp, dtEndDate, ParameterDirection.Input));
        dbContext.Open();
        dbContext.ExecuteOraAdapterFillCmd(sQuery, spParams, ref ds);
    }
    catch (Exception ex)
    {
    }
    finally
    {
        dbContext.Close();
    }
    return ds;
}

public void ExecuteOraAdapterFillCmd(string sQuery, List<OracleParameter> spParams, ref DataSet dataset)
{
    using (OracleCommand command = new OracleCommand())
    {
        command.CommandType = CommandType.Text;
        command.Parameters.AddRange(spParams.ToArray<OracleParameter>());
        command.Connection = DbConnection;
        command.CommandText = sQuery;
        command.BindByName = true;

        OracleDataAdapter da = new OracleDataAdapter(command);
        try
        {
            da.Fill(dataset);
        }
        catch(OracleException oex)
        {

        }
        catch(Exception ex) // Throws error here 
        {

        }
    }
}

标签: c#datasetoracle12cindexoutofboundsexception

解决方案


这似乎是 Oracle 数据访问问题。显然它在处理数据库链接时在内部使用了一个数组,我的数据库链接看起来像 tbl_name@someName.xy; 我不确定,但可能按点拆分它并期望 2 个元素并得到 3 个。

为了测试这一点,我使用了:

create synonym tbl_name for tbl_name@someName.x.y;

我用“tbl_name”替换了查询中的数据库链接,它工作正常。


推荐阅读