Как сохранить несколько наборов данных в один файл?

У меня есть 2 строго типизированных набора данных. Мне нужно сохранить содержащиеся данные в один файл (и, конечно, иметь возможность читать и загружать их обратно в наборы данных позже). Обычно я использую метод DataSet.WriteXml() для сохранения данных в виде текста и DataSet.ReadXml() для его чтения, когда у меня есть один набор данных.

Первая идея, которая приходит в голову, - сохранить каждый набор данных в потоке памяти, затем преобразовать потоки в байтовые массивы, а затем записать байты в файл.

Но эта идея кажется мне не очень изящной и не самой лучшей, поэтому я подумал, есть ли лучший способ сделать это.

Любые идеи? (Закодированные ответы были бы полезнее)

Существует множество движков баз данных на основе файлов. Почему бы не использовать один из них для хранения реляционных данных в файле?

David 29.11.2018 15:02

У меня есть приложение WinForms. Мои наборы данных представляют собой файл. Допустим, это требование.

DotNet Developer 29.11.2018 15:05

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

Kevin LaBranche 29.11.2018 15:27

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

Jaskier 29.11.2018 15:45

К сожалению, похоже, что сериализаторы Xml не обрабатывают несколько объектов в одном файле. К счастью, двоичные сериализаторы умеют - см. эта статья.

NetMage 29.11.2018 21:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
394
2

Ответы 2

Класс DataSet имеет Метод слияния. Это предназначено для объектов набора данных, схемы которых похожи / связаны и будут объединять их вместе. Есть много параметров, которые могут управлять тем, как вы хотите, чтобы это слияние работало.

Пример слияния

dataset1.Merge(dataset2,true); //true will preserve changes in dataset1 if dataset2 has matching/related data that is different

Более полный пример.

У нас не так много работы, но, судя по вашему вопросу, кажется, что Merge, похоже, не соответствует вашим потребностям (отсюда и мой вопрос в комментариях), плюс непонимание, почему нужен один файл xml и / или как создаются исходные наборы данных (например, из двух внешних XML-файлов, находящихся вне вашего контроля, или ....).

Идея 2

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

Пример добавления таблиц

dataset1.Tables.Add(dataset2.Tables["tablename"]);

Возвращение к двум наборам данных после чтения xml с опцией Tables будет выглядеть примерно так:

foreach(DataTable table in dataset1)
{
  if (table.TableName == "TableForDataset2")
  {
   dataset2.Tables.Add(table);
  }
}

Вот тестовый код, который я написал с LINQPad, чтобы использовать BinaryFormatter для нескольких DataSet:

var fsw = new FileStream(@"D:\testdataset.ser", FileMode.Create);
var b = new BinaryFormatter();
b.Serialize(fsw,ds);
b.Serialize(fsw,ds2);
fsw.Close();

var fsr = new FileStream(@"D:\testdataset.ser", FileMode.Open);
var rds = (DataSet)b.Deserialize(fsr);
var rds2 = (DataSet)b.Deserialize(fsr);
fsr.Close();

Другие вопросы по теме