首页 > 解决方案 > 使用 oracle 和 C# 比较两个选择的结果

问题描述

我正在编写一个 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 的预构建方法来比较有/无行顺序的两个选择的结果?

谢谢

标签: c#oraclecompare

解决方案


这是为两个 编写通用数据比较方法的尝试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;
}

推荐阅读