c# - 使用 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 的预构建方法来比较有/无行顺序的两个选择的结果?
谢谢
解决方案
这是为两个 编写通用数据比较方法的尝试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;
}
推荐阅读
- azure - 使用 MS 图形从 O365 租户或 AAD 中提取所有用户的 API
- c# - Unity - 在不破坏现有粒子的情况下停止生成新粒子?
- reactjs - Firebase 云消息传递 onMessage 和 setBackgroundMessageHandler 未正确执行
- html - 如何让这个缩略图幻灯片居中
- rust - 似乎提供了可变变量的不可变变量
- android - 无法生成签名包 - Android 资源链接失败,错误:-c 选项的配置“自动”无效
- php - 如何使用ajax在html输入框中显示mysql数据?
- html - 仅当链接具有特定类时才显示链接
- javascript - NodeJS和MongoDB中的过滤器问题
- c++ - C++ 联合,两个仅在 CV 资格上有所不同的活跃成员