Сравните результаты двух выборов, используя оракул и C # - PullRequest
0 голосов
/ 08 апреля 2019

Я пишу приложение на 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 для сравнения результатов двух выборок с / без порядка строк?

Спасибо

1 Ответ

1 голос
/ 09 апреля 2019

Вот попытка написать общий метод сравнения данных для двух 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...