Как объединить данные в таблицы C# SQL

У меня есть данные XML, которые я прочитал в набор данных с помощью программы чтения XML.

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

Я планирую читать несколько файлов каждый день и объединить файлы на сервере 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 ответ

Решение

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

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();
}
Другие вопросы по тегам