Как объединить данные в таблицы 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();
}