2015-01-21 4 views
0

Итак, я создал объект под названием «Отчет». Объект Report имеет несколько разных свойств, включая DataSet. Этот DataSet должен содержать по крайней мере один DataTable. Отчет является сериализуемым. В модульном тесте я создаю экземпляр объекта Report, задаю его значения свойств, затем сериализую его, а затем десериализую.Невозможно наложить объект типа «System.Data.DataTable» на тип «System.Collections.IEnumerable»

После добавления метода для заполнения DataSet функция Deserialization дает мне ошибку: не удалось наложить объект типа «System.Data.DataTable» на тип «System.Collections.IEnumerable». Не следует ли сериализоваться как DataSet ... не DataTable? Я точно не знаю, что вызывает у меня эту ошибку. Ниже приведены фрагменты кода. Любая помощь приветствуется!

<Serializable> Public Class Report 

    Private titleStr As String 
    Private startDateTime As DateTime 
    Private endDateTime As DateTime 
    Private numIntervalsShort As Short 
    Private binnedDataSet As DataSet 

...property gets and sets...namely: 

    Property BinnedData As DataSet 
     Get 
      Return binnedDataSet 
     End Get 
     Set(ByVal value As DataSet) 
      binnedDataSet = value 
     End Set 
    End Property 

End Class 


<TestClass()> Public Class ReportObjectTest 

    <TestMethod()> Public Sub TestCreateReport() 

     Dim testReport As New Project.Report 

     testReport.Title = "Test Title" 
     testReport.StartDate = "1/1/2015 1:00 AM" 
     testReport.EndDate = "1/2/2015 6:00 PM" 
     testReport.NumIntervals = 41 
     PopulateDataSet(testReport) 

     Serialize(testReport) 
     Deserialize() 

    End Sub 

    Private Sub PopulateDataSet(ByRef report As Project.Report) 

     report.BinnedData = New DataSet() 

     Dim DT1 As DataTable = New DataTable("Test Table1") 
     report.BinnedData.Tables.Add(DT1) 

     DT1.Columns.Add(New DataColumn("Column1", GetType(Int32))) 
     DT1.Columns.Add(New DataColumn("Column2", GetType(Int32))) 
     DT1.Columns.Add(New DataColumn("Column3", GetType(Int32))) 

     Dim Row1 As DataRow = DT1.NewRow() 
     Dim Row2 As DataRow = DT1.NewRow() 
     Dim Row3 As DataRow = DT1.NewRow() 

     Row1("Column1") = 32 
     Row1("Column2") = 15 
     Row1("Column3") = 9 

     Row2("Column1") = 3 
     Row2("Column2") = 27 
     Row2("Column3") = 98 

     Row2("Column1") = 1 
     Row2("Column2") = 12 
     Row2("Column3") = 65 

    End Sub 

    Private Sub Serialize(ByRef report As Project.Report) 

     Dim stream As New FileStream("TestReport.xxx", FileMode.Create) 
     Dim mySerializer As BinaryFormatter = New BinaryFormatter() 

     Try 
      mySerializer.Serialize(stream, report) 
     Catch ex As SerializationException 
      Console.WriteLine("Error saving the report. " & ex.Message) 
      Throw 
     Finally 
      stream.Close() 
     End Try 

    End Sub 

    Private Sub Deserialize() 

     Dim readTestReport As New Project.Report() 

     Dim stream As New FileStream("TestReport.xxx", FileMode.Open) 
     Dim myDeserializer As BinaryFormatter = New BinaryFormatter() 

     Try 
      readTestReport = DirectCast(myDeserializer.Deserialize(stream), Project.Report) 
     Catch ex As SerializationException 
      Console.WriteLine("Error opening the report. " & ex.Message) 
      Throw 
     Finally 
      stream.Close() 
     End Try 

     Console.WriteLine(Environment.NewLine & "Values after Deserialization:") 
     Console.WriteLine("Title = " & readTestReport.Title) 
     Console.WriteLine("Start Date = " & readTestReport.StartDate) 
     Console.WriteLine("End Date = " & readTestReport.EndDate) 
     Console.WriteLine("Number of Intervals = " & readTestReport.NumIntervals) 

     For Each Table In readTestReport.BinnedData.Tables 
      For Each Row In Table 
       Console.WriteLine("Table Row = " & Row.ToString) 
       For Each DataColumn In Row 
        Console.WriteLine(DataColumn.ToString) 
       Next 
      Next 
     Next 

    End Sub 

End Class 
+1

Если это не быть для каждой строки в Table.Rows? –

+1

Вам также нужно добавить строки в datatable в функции PopulateDataSet. Просто потому, что вы создаете их с помощью NewRow(), они не добавляются в таблицу. например. DT1.Rows.Add (Row1) и т. Д. –

+0

О да, я полагаю, что добавление строк поможет ... спасибо! Я также просто понял, что мне не удалось изменить «Row2» на «Row3» для установки значений для третьей строки. :П – Andarta

ответ

0

Я был прав ... понял это. Проблема заключалась в том, как я пытался отображать значения таблицы после десериализации. DataTables и DataRows не перечислимы, но способ, которым я пытался отобразить его, состоял в том, что вы можете только перечислимым типом.

Я изменил этот блок, чтобы назначить таблицу в View вместо:

Dim tableView As DataView = New DataView(readTestReport.BinnedData.Tables(0)) 
    Console.WriteLine("Table = ") 
    Dim rowView As DataRowView 
    Dim i As Integer 

    For Each rowView In tableView 
     For i = 0 To tableView.Table.Columns.Count - 1 
      Console.Write(rowView(i) & vbTab) 
     Next 
     Console.WriteLine() 
    Next 

Эти статьи помогли:
https://msdn.microsoft.com/en-us/library/23a0aths%28v=vs.110%29.aspx https://msdn.microsoft.com/en-us/library/bb669099%28v=vs.110%29.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1

Смежные вопросы