ATeDe Ответов: 2

Datatable несколько строк на одну запись VB.NET


Public Class TableA
        Public Field1 As Integer
        Public Field2 As String
        Public Field3 As String
        Public Field4 As TableB()
    End Class

    Public Class TableB
        Public Fld1 As Integer
        Public Fld2 As Integer
        Public Fld3 As Decimal
    End Class


Что я уже пробовал:

Привет, кто-нибудь может помочь мне создать DataTable, состоящий из 2 таблиц, определенных ниже:

2 Ответов

Рейтинг:
12

ATeDe

<?xml version="1.0" encoding="utf-8"?>


<Таблица>
<field1>11
<field2>12
<field3>13
<деталь>
<tableb>
<fld1>1.1
<fld2>1.2
<fld3>1.3

<tableb>
<fld1>1.4
<fld2>1.5
<fld3>1.6



<Таблица>
<field1>21
<field2>22
<field3>23
<деталь>
<tableb>
<fld1>2.1
<fld2>2.2
<fld3>2.3

<tableb>
<fld1>2.4
<fld2>2.5
<fld3>2.6



<Таблица>
<field1>31
<field2>32
<field3>33
<деталь>
<tableb>
<fld1>3.1
<fld2>3.2
<fld3>3.3

<tableb>
<fld1>3.4
<fld2>3.5
<fld3>3.6

<tableb>
<fld1>3.7
<fld2>3.8
<fld3>3.9




Рейтинг:
0

Dave Kreskowiak

Нет никакого способа создать DataTable из того, что вы опубликовали в коде.

Вам придется самостоятельно создавать столбцы в таблицах данных, возможно, даже добавляя между ними отношение внешнего ключа.

DataTable table1 = new DataTable();
table1.Columns.Add("Id", typeof(int));
table1.Columns.Add("Field1", typeof(int));
table1.Columns.Add("Field2", typeof(string));
table1.Columns.Add("Field3", typeof(string));

DataTable table2 = new DataTable();
table2.Columns.Add("Id", typeof(int));
table2.Columns.Add("table1FK", typeof(int));
table2.Columns.Add("Fld1", typeof(int));
table2.Columns.Add("Fld2", typeof(int));
table2.Columns.Add("Fld3", typeof(decimal));

DataSet ds = new DataSet();
ds.Tables.Add(table1);
ds.Tables.Add(table2);
ds.Relations.Add("MasterDetail", table1.Columns["Id"], table2.Columns["Id"]);


ATeDe

Привет, Дэйв! Спасибо за ответ, но я должен был упомянуть в 1-м посте, что источник данных находится в виде XML-файла, который выглядит так, как показано ниже. У меня нет проблем с чтением XML-файла с помощью

набора данных.Метод readxml(fileXML)

или

XDocument.Load(fileXML).Root.Элементы("Детали")

и создание <tablea>, но не может создать композитный DataTable, включая <tableb> подробные данные!!!

Dave Kreskowiak

Ну, это все меняет...

Я понятия не имею, что вы подразумеваете под "не можете создать композитный DataTable, включая подробные данные tableb".

Каким должен быть конечный результат? Для чего это используется?

Набор данных будет читать XML, но я не думаю, что это будет иметь какой-либо смысл, когда вы посмотрите на таблицы в наборе данных. Это либо действительно плохие примеры данных, либо ваши реальные данные, которые практически непригодны для использования каким-либо значимым образом.

ATeDe

Привет, Дэйв!

...после того, как этот кусок кода:

Дим данных как набор данных = новый набор данных
набора данных.Метод readxml("details.XML")
Дим DataTable в качестве нового объекта DataTable
Для каждой таблицы данных в наборе данных.Таблицы
_ShowTable(объект DataTable)
Следующий
_NewLine(сообщение:="чтение с помощью ReadXml завершено, ОК! ")

.. распечатка выглядит примерно так:

->Неформатированная таблица: tableA
Field1,Field2,Field3,table_id
11,12,13,0
21,22,23,1
31,32,33,2

->Неформатированная таблица: подробно
detail_Id,table_id
0,0
1,1
2,2

->Неформатированная таблица: tableB
Fld1,Fld2,Fld3,detail_Id
1.1,1.2,1.3,0
1.4,1.5,1.6,0
2.1,2.2,2.3,1
2.4,2.5,2.6,1
3.1,3.2,3.3,2
3.4,3.5,3.6,2
3.7,3.8,3.9,2

->чтение с помощью ReadXml завершено, ОК! Нажмите любую клавишу, чтобы продолжить...

..как вы видите, все идет правильно, за исключением того, что таблицы tableA и tableB находятся отдельно друг от друга, а не выглядят так или иначе:

11,12,13,1.1,1.2,1.3
1.4,1.5,1.6
21,22,23,2.1,2.2,2.3
2.4,2.5,2.6
31,32,33,3.1,3.2,3.3
3.4,3.5,3.6
3.7,3.8,3.9

..- теперь ты понимаешь, в чем проблема?

Dave Kreskowiak

Да, и ReadXml не собирается это исправлять. Он не будет объединять две разные таблицы в одну. Вам придется самостоятельно написать код для синтаксического анализа XML-файла и поместить данные в соответствующую таблицу. Схема XML - файла, который у вас есть, не настроена на то, чтобы делать то, что вы хотите.

ATeDe

Привет, Дэйв!

..код, использующий XDocument и LINQ-запрос, выглядит следующим образом:

Dim listTableA = XDocument.Нагрузка("details.XML").корень.Элементы("таблица")
Дим tableAList как список(из таблицы tablea)
tableAList = (из e в listTableA
Выберите Новую Таблицу С Помощью {
.Field1 = CInt(e.<field1>.Value),
.Field2 = CStr(e.<field2>.Value),
.Field3 = CStr(e.<field3>.Value),
.Поле4 = (
Из o в e...<field4>...<tableb>
Выберите Новый TableB С Помощью {
.Fld1 = CInt(o.<fld1>.Value),
.Fld2 = CInt(o.<fld2>.Value),
.Fld3 = CDec(o.<fld3>.Value)
}).Метод toArray()
}).Список()

Дим таблицы tablea = новый объект DataTable("таблицы tablea")
табла.Столбцы.Add("Field1", GetType(Integer))
табла.Столбцы.Add("Field2", GetType(String))
табла.Столбцы.Add("Field3", GetType(String))

Dim tableB = New DataTable("tableB")
таблицы tableb.Столбцы.Add("Fld1", GetType(Integer))
таблицы tableb.Столбцы.Add("Fld2", GetType(Integer))
таблицы tableb.Столбцы.Добавить("Fld3", GetType(Decimal))

Для каждого а в таблице 1
Dim rowA как новый список(объекта) из {a.Поле1, а.Поле2, а.Поле3}
таблицы tablea.Строк.Добавить(роза.Метод toArray())
Для каждого b В a.Field4
Dim rowB как новый список(объекта) из {b.Fld1, b.Fld2, b.Fld3}
таблицы tableb.Строк.Добавить(rowB.Метод toArray())
Следующий
Следующий
_ShowTable(таблицы tablea)
_ShowTable(таблицы tableb)

...и результаты, как показано ниже:

->Неформатированная таблица: tableA
Поле1,Поле2,Поле3
11,12,13
21,22,23
31,32,33

->Неформатированная таблица: tableB
Fld1,Fld2,Fld3
1,1,1.3
1,2,1.6
2,2,2.3
2,2,2.6
3,3,3.3
3,4,3.6
4,4,3.9

..Ре: каким должен быть конечный результат? Для чего это используется?

На самом деле, я надеюсь разработать какой-то наиболее упрощенный способ, возможно, даже генерировать код для автоматического чтения моих унаследованных научных данных. На данный момент я не вижу никаких шансов упростить код. Следующим шагом будет использование словаря, поскольку он прост в использовании и эффективен. Он имеет много функций (таких как ContainsKey и TryGetValue), которые выполняют поиск. И я надеюсь, что таким образом мой код распознает структуру и получит правильный тип T для моих записей данных