2011-10-15 47 views
2

據我所知,你可以從另一個數據集通過的IDataReader加載一個數據集即ADO.NET DataSet.Load()似乎並沒有處理空表正確

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中發現了一個錯誤嗎?或者有沒有解釋這種行爲?

回答

1

在我研究代碼之前,我對這可能是一個bug表示懷疑,但現在我相信它。

查看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[] t Ø填充每個表,但它只是填充表,如果它有字段:

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調用NextResult如果FieldCount爲0,並且拋出所有事後不同步。

+0

好的發現 - 那肯定會解釋它。我將在Connect上提出一張票。 –

+0

更新:https://connect.microsoft.com/VisualStudio/feedback/details/695262/bug-in-ado-net-dataset-load-empty-table-handling#details –