Как консолидировать данные в таблицы c# SQL

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

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

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

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

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

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

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

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

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

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


person Ken    schedule 19.09.2018    source источник
comment
Рассматривали ли вы возможность нормализации БД? Это решит вашу проблему.   -  person dj079    schedule 19.09.2018
comment
@ dj79 Я получаю xml-файлы из внешнего источника, они поставляются с данными как есть. Я прочитал эти файлы XML в наборе данных, который в основном дает мне 8 таблиц, которые, кажется, правильно нормализованы, за исключением одной таблицы (которую я обрабатываю при импорте xml). Можете ли вы объяснить мне, как нормализация базы данных позволит мне вставлять в базу данных записи, которые я получаю и которым уже назначен последовательный идентификатор, без дублирования ранее импортированных файлов xml?   -  person Ken    schedule 19.09.2018


Ответы (1)


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

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 отрицательного значения — это способ справиться с коллизиями. Вы должны обновлять одну таблицу за раз в правильном порядке. Я бы лично оставил наборы данных и использовал datacontext. Это будет выглядеть как

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();
}
person Antonín Lejsek    schedule 20.09.2018
comment
Да Insert Parent - get ID , а затем обновить дочерние элементы с помощью этого идентификатора, я думал, что мне нужно будет это сделать, но это кажется таким «растянутым» - как вождение жука, когда у вас есть новый Porsche. xmlreader в наборе данных делает xml доступным для обработки и вставки - именно поэтому я использую набор данных - я не знаю, есть ли у datacontext такая быстрая крутая функция (но теперь вы меня уклоняетесь от нее (DuckDuckGo).) - person Ken; 20.09.2018