【问题标题】:Compare results from two selects using oracle and C#使用 oracle 和 C# 比较两个选择的结果
【发布时间】:2019-04-08 08:32:48
【问题描述】:

我正在编写一个 C# 应用程序,用于比较两个不同选择的结果是否相同以及它们是执行时间,以进行优化。

其实我是用秒表来获取执行时间,然后将OracleDataReaders转换成DataTable并比较行,顺序独立,像这样:

        var tableA = new DataTable();
        tableA.Load(readerA);

        var tableB = new DataTable();
        tableB.Load(readerB);

        bool equals = true;
        for (int i = 0; i < tableA.Rows.Count; i++)
        {
            if (!DataRowComparer.Default.Equals(tableA.Rows[i],tableB.Rows[i]))
            {
                equals = false;
                break;
            }
        }

        return equals;

但我假设将 OracleDataReader 转换为 DataTable,然后使用循环比较行是相同的,并且顺序相同。

是否有任何使用 C# 和 Oracle 的预构建方法来比较有/无行顺序的两个选择的结果?

谢谢

【问题讨论】:

  • 我不确定tableBRow == tableARow 是否会以您想要的方式比较行。默认的Equals 实现将比较等号的两侧是否引用同一个对象(同一个对象,同时创建)。可能您想比较每列中的值以查看值是否相同。这个答案似乎很相关:stackoverflow.com/questions/9064485/…
  • @mortb true,我没有正确比较对象,更新了。
  • 但我真正的问题是,如果不将 OracleDataReaders 转换为 DataTables 然后循环它们,无论如何都知道两个选择的结果是否相同(有或无顺序)?
  • 您的问题的答案并不完全直截了当,这取决于您究竟想要达到什么目标,以及您希望在解决方案上付出多少努力。似乎您的解决方案可以重写,因此它只使用两个 OracleDataReaders 循环它们,通过在第一个 Read() 上调用第一个 Read() 方法,然后第二个,逐个循环遍历它们上的列并比较它们,直到你发现任何不同。当您跳过填充两个DataSets 的步骤时,这至少会更快一些。

标签: c# oracle compare


【解决方案1】:

这里尝试为两个OracleDataReaders 编写通用数据比较方法。该代码逐行、逐列地比较阅读器,以发现任何差异。它考虑到读者可能包含来自多个查询的结果。如果要比较更复杂的数据类型(二进制等),则需要增强代码。该代码还假设数据的顺序很重要;如果即使在不同排序的情况下也要考虑读者是平等的,则需要重写代码以将行放入列表或字典等中。

private bool ReadersContainEqualData(OracleDataReaders readerA, OracleDataReaders readerB)
{
    bool moreResultsA = false;
    bool moreResultsB = false;
    do {
        if(readerA.FieldCount != readerB.FieldCount)
        {
            return false; // the readers have different number of columns
        }
        while(readerA.Read() && readerB.Read())
        {
            for(int i = 0; i < readerA.FieldCount; i++)
            {
                if(readerA.GetName(i) != readerB.GetName(i)) // different column names, remove this check if it is not important to you
                {
                   return false;
                }
                if(readerA[i] != readerB[i]) // the columns are either string, numeric or booean, so simple equals comparison works. If more complex columns like varbinary etc is used, this check will need to be enhanced
                {
                    return false;
                }
           }
        }
        if(readerA.Read() || readerB.Read()) // one of the readers still has more rows and the other is empty
        {
            return false;
        }

        // check if the readers contains results from another query than the recently processed
        moreResultsA = readerA.NextResult();
        moreResultsB = readerB.NextResult();
        if(moreResultsA != moreResultsB)
        {
            return false;
        }
    } while(moreResultsA && moreResultsB);
    return true;
}

【讨论】:

  • 非常感谢,我会尝试并发布结果。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多