Как добавить столбец в набор данных, загруженный устаревшей схемой в C #? - PullRequest
2 голосов
/ 31 августа 2011

Фон Вот моя проблема.Ранее в ходе моей программы System.Data.DataSet был сериализован в файл.Затем, через некоторое время в программе была изменена схема набора данных, в частности, в одну из таблиц был добавлен столбец.

Этот набор данных был создан с использованием VS и C #, поэтому он имеет все свойства, доступные для доступастроки и столбцы по имени (через сгенерированный Microsoft код).В нем есть все файлы (.xsd, .cs и т. Д.), Которые VS должен знать, как выглядит набор данных, и имена в нем.

Файл загружается и сохраняется с помощью XML-сериализации.Это вызывает проблему сейчас, потому что, когда я десериализирую старый файл, он загружает данные, относящиеся к старой схеме.Это работает по большей части, но созданный объект (набор данных) имеет все, кроме столбца, который был добавлен позже.Таким образом, при попытке доступа к новому столбцу происходит сбой, потому что десериализация не знала об этом, и весь столбец становится нулевым.

Теперь это вызывает больше проблем, поскольку выдает исключение при попытке доступа к этому столбцу.(потому что это ноль) через свойства набора данных.

Вопрос У меня вопрос, можно ли как-нибудь добавить в колонку после десериализации?Очевидно, мне нужно добавить его, чтобы он соответствовал сгенерированному Microsoft коду, потому что при этом:

myDataSet.myTable.Columns.Add("MyMissingColumn");

... не добавляет необходимый столбец.Он может добавить столбец, но свойство строки myDataRow.MyMissingColumn возвращает ноль и ошибки.

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

Любые предложения приветствуются.

Ответы [ 2 ]

1 голос
/ 31 августа 2011

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

DataSet data = new DataSet();
data.ReadXmlSchema(schemaFile);
data.ReadXml(dataFile, XmlReadMode.IgnoreSchema);

В противном случае просто добавьте его на лету:

 if (!data.Tables[0].Columns.Contains("SomeId"))
 {
    var column = new DataColumn("SomeId", typeof(int));
    // give it a default value if you don't want null
    column.DefaultValue = 1;
    // should it support null values?
    column.AllowDBNull = false;
    data.Tables[0].Columns.Add(column);
 }
0 голосов
/ 31 августа 2011

вы добавляете новый столбец без указания его типа данных, странно, я бы указал typeof(string), используя другую перегрузку Add.

Кроме того, понятно, что вы не можете сделать: myDataRow.MyMissingColumn, потому что в начальной версии XSD не было сопоставления типа / столбца, но можете ли вы в любом случае получить доступ к этому столбцу по имени или индексу?

попробуйте что-то вроде этого

myDataRow["MyMissingColumn"] = "Test";

var s = myDataRow["MyMissingColumn"].ToString();
...