gpt4 book ai didi

c# - ADO.NET DataSet.Load() 似乎无法正确处理空表

转载 作者:太空宇宙 更新时间:2023-11-03 14:11:19 24 4
gpt4 key购买 nike

据我所知,您可以通过 IDataReader 从另一个数据集中加载一个数据集,即

new DataSet().Load(existingDataSet.CreateDataReader());
// should now have two DataSets with the same contents

我还没有找到任何表明这是不可能的文件。那么,谁能解释为什么以下 NUnit 测试失败了?

[Test]
public void Should_be_able_to_load_one_dataset_from_another()
{
var tableA = new DataTable("A");
//tableA.Columns.Add("ColumnA", typeof(int));

var tableB = new DataTable("B");
tableB.Columns.Add("ColumnB", typeof(int));

var tableC = new DataTable("C");

using (var original = new DataSet())
{
original.Tables.Add(tableA);
original.Tables.Add(tableB);
original.Tables.Add(tableC);

using (var expectedReader = original.CreateDataReader())
using (var actual = new DataSet())
{
actual.Load(expectedReader, LoadOption.OverwriteChanges, "A", "B", "C");

Assert.That(actual.HasErrors, Is.False);

for (var i = 0; i < original.Tables.Count; i++)
Assert.That(actual.Tables[i].Columns.Count, Is.EqualTo(original.Tables[i].Columns.Count),
"Table {0} had the wrong number of columns.", i); // fails here
}
}
}

如果您取消注释 ColumnA,则测试通过。所以看起来 DataSet.Load() 中可能存在错误,在遇到没有列的表后,下一个表也将被导入,也没有列。请注意,空表不受影响,仅影响紧随其后的表,因此如果只有最后一张表为空,则测试将通过。

我在 BCL 中发现了错误吗?或者对这种行为有解释吗?

最佳答案

在查看代码之前,我怀疑这可能是一个错误,但现在我相信它是。

查看 Reflector 中的 DataSet.Load 方法,它遍历提供的表名并创建表(如果不存在)。因此在本例中,它创建了表“A”、“B”和“C”。

然后它加载数据,通过以下方法调用并将目标数据集中的目标表作为 DataTable[] 传递:

  • DataSet.Load(IDataReader, LoadOption, FillErrorEventHandler, params DataTable[])
  • LoadAdapter.FillFromReader(DataTable[], IDataReader, int, int)
  • LoadAdapter.Fill(DataTable[], IDataReader, int, int)

在最后一个 Fill 方法中,它循环遍历 DataTable[] 来填充每个表,但它只填充有字段的表:

if (container.FieldCount > 0)
{
if ((0 < i) && !this.FillNextResult(container))
{
goto Label_00DE;
}
int num4 = this.FillFromReader(null, dataTables[i], null, container, startRecord, maxRecords, null, null);
if (i == 0)
{
num2 = num4;
}
}

请注意,当它填充表格时,它还会调用读取器上的 NextResult(在 FillNextResult 中),但是没有 else如果 FieldCount 为 0,则调用 NextResult,这会使之后的所有内容都不同步。

关于c# - ADO.NET DataSet.Load() 似乎无法正确处理空表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7778211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com