【问题标题】:Looping Oracle Data Readers returns inconsistent results循环 Oracle 数据读取器返回不一致的结果
【发布时间】:2011-03-11 18:27:03
【问题描述】:

我有问题。我为两个函数的统计分析设置了一个循环。第一次通过循环,这两个函数都很好。第二次通过循环第二个函数不返回任何结果。

我不明白为什么第一次通过循环我从 dataReader 获得结果,而随后的每一次我都一无所获 (datareader.hasRows == false)

任何帮助都会很棒。提前谢谢你。

下面是循环结构和第二个函数(失败)的代码概要

startDate = new DateTime(2010, 1, 1);
for(int i = 0; i < 20; i++)
{
    for(int j = 1; j <= 12; j++)
    {
        endDate = new DateTime(2010, j, 1);
        schedule = new Schedule();
        scheduleXml = string.Empty;

        ISession newSession = session.SessionFactory.OpenSession();
        scheduleXml = GetScheduleXml(startDate, endDate, locationIds, newSession);
        schedule = GetSchedule(schedule, startDate, endDate, locationIds, newSession);
        newSession.Close();
    }
}

public static Schedule GetSchedule(Schedule schedule, DateTime startDate, DateTime endDate, int locationIds, ISession session)
{
    string sqlGetActivitiesTreatmentsRegimens = // Custom SQL Select Statement (I have verified it returns results)
    using (OracleCommand comm = new OracleCommand(sqlGetActivitiesTreatmentsRegimens, (OracleConnection)session.Connection))
    {
        try
        {
            OracleParameter plantIdParam = comm.CreateParameter();
            plantIdParam.DbType = DbType.Int32;
            plantIdParam.Value = plantId;
            comm.Parameters.Add(plantIdParam);

            OracleParameter startDateParam = comm.CreateParameter();
            startDateParam.DbType = DbType.DateTime;
            startDateParam.Value = startDate;
            comm.Parameters.Add(startDateParam);

            OracleParameter endDateParam = comm.CreateParameter();
            endDateParam.DbType = DbType.DateTime;
            endDateParam.Value = endDate;
            comm.Parameters.Add(endDateParam);

            using(OracleDataReader dr = comm.ExecuteReader())
            {
                while(dr.Read())
                {
                    // does stuff here
                }
            }
        }
        catch (Exception ex)
        {
            throw new Exception("Source:GetRegimensEx:" + ex.Message, ex.InnerException);
        }
    }
    return new Schedule();
}

【问题讨论】:

    标签: c# oracle datareader


    【解决方案1】:

    据我所知,除了明显的语法错误外,您发布的代码都很好。错误要么在GetScheduleXml 中,要么在实现ISession 的类的实现中。

    【讨论】:

      【解决方案2】:

      同意丹尼尔。另外,你在using语句中使用了session.Connection,但是方法签名中的参数是newSession。

      DataReader 正在使用中,以便处理关闭。无需额外的 .Close() 调用。

      【讨论】:

      • 我对参数也有同样的想法,但如果第一次循环迭代有效,那不应该是这样吗?
      • 我一般同意,但是因为函数是静态的,我们看不到 GetScheduleXml 或实现 ISession 的类对静态变量做了什么,我们不知道。
      • hmmmm... 这给了我一些想法。我将研究 ISession 是如何实现的。本质上,GetScheduleXml 是从存储过程中读取并返回一个基于存储过程输出的 xml 字符串。
      • 当我将代码提取为更简单的格式时,newSession 与会话变量也是一个错字。
      • 运气好吗?我建议用“using(OracleConnection conn = new OracleConnection(connString){}”包装“using(OracleCommand comm..”。这将使执行数据库调用的函数处理连接(包括关闭和处置),并且只要您使用连接池,您就不会看到任何性能损失。这样您就不必担心在循环的迭代之间维护连接状态。
      猜你喜欢
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 2016-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多