[英]ADO.NET DataSet.Load() doesn't seem to handle empty tables correctly
可以通过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;
}
}
请注意,当它填充表时,它还会在读取器上(在FillNextResult
)调用NextResult
,但是如果FieldCount
为0,则没有else
可以调用NextResult
的操作,此后所有内容均不同步。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.