循环 Oracle 数据读取器返回不一致的结果

Posted

技术标签:

【中文标题】循环 Oracle 数据读取器返回不一致的结果【英文标题】:Looping Oracle Data Readers returns inconsistent results 【发布时间】: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();

【问题讨论】:

【参考方案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..”。这将使执行数据库调用的函数处理连接(包括关闭和处置),并且只要您使用连接池,您就不会看到任何性能损失。这样您就不必担心在循环的迭代之间维护连接状态。

以上是关于循环 Oracle 数据读取器返回不一致的结果的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 根据返回不一致结果的年份选择日期

如何php调用oracle存储过程返回的是一个结果集,该怎么从php页面中吧数据循环输出呀

求oracle高手,存储过程中取游标值时,出现数据类型不一致问题,急急

Oracle读取数据的顺序问题

oracle存储过程 中把临时表数据 返回结果集

oracle用户设置登录次数为unlimit,为啥用户还是被锁