Как объединить данные в таблицы c # SQL - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть данные XML, которые я считываю в набор данных через xml reader.

Сгенерированные таблицы имеют несколько отношений, но в основном это родительский узел и дочерний узел.

Я планирую читать несколько файлов каждый день и объединять файлы на сервере sql.Где они могут быть легко использованы другими системами.

Учитывая XML-файл, дочерние узлы имеют последовательные идентификаторы для каждого узла, например:

<main mainGUID='BlahWeSayItIsUnique' stuff type=1>
   <children thingy Number> 
      <child other things>
      <child other things>

Дети получат children_Id в качестве первичного ключа, а child получит children_id как отношение и свой собственный child_Idв качестве первичного ключа.Эти числа будут последовательными в 1 ... n, поэтому в каждом xml-файле эти идентификаторы будут дублироваться.

Итак, каков правильный метод или хороший метод для вставки данных без дублирования идентификаторов?Получу ли я, что серверы sql в последний раз вставили значения id, а затем изменили таблицы данных, которые существуют в c #, хранятся в памяти, и затем вставили в sql?

Или есть лучший способ, например, метод контроля версий с использованием GUIDиз корневого узла?

РЕДАКТИРОВАТЬ: Я получаю XML-файлы из внешнего источника, они приходят с данными, как они есть.Я прочитал эти XML-файлы в набор данных, который в основном дает мне 8 таблиц, и строки в этих таблицах являются последовательными, и таблицы связаны друг с другом на основе этого последовательного номера.

Данные уже имеют последовательные идентификаторыназначен, так как мне вставить эти записи в базу данных SQL без дублирования ранее импортированных файлов XML?

1 Ответ

0 голосов
/ 20 сентября 2018

У вас должен быть идентификатор в каждом столбце идентификатора.Когда вы вставляете запись, база данных генерирует новый уникальный идентификатор для вас.Вы можете прочитать значение идентификатора и обновить все ссылки с этим новым значением.Это может выглядеть так:

DataSet dataSet = new DataSet();

ParentDataTable parentTable = dataSet.Parent;
ParentTableAdapter parentAdapter = new ParentTableAdapter();
ParentRow parentRow = parentTable.NewParentRow();
parentRow.p_id = -1;
parentRow.p_name = "Best parent";
parentTable.AddParentRow(parentRow);
parentAdapter.Update(parentTable);            

ChildDataTable childTable = dataSet.Child;
ChildTableAdapter childAdapter = new ChildTableAdapter();
ChildRow childRow = childTable.NewChildRow();
childRow.ch_id = -1;                         
childRow.ch_name = "Best child";            

childRow.ch_parent = parentRow.p_id;
or
childRow.ParentRow = parentRow;

childTable.AddChildRow(childRow);
childAdapter.Update(childRow);

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

var parent = new Parent()
{
    p_name = "Best parent"
};
var child = new Child()
{
    ch_name = "Best child",
    Parent = parent
};

using (var dc = new DataContext())
{
    dc.Parents.InsertOnSubmit(parent);
    dc.Childs.InsertOnSubmit(child);
    dc.SubmitChanges();
}
...