如何在C#中加载过时模式的数据集中添加列?

时间:2011-08-31 18:46:34

标签: c# dataset schema nullreferenceexception

背景
这是我的问题。在我的程序的早期阶段,System.Data.DataSet被序列化为文件。然后一段时间后,程序中的数据集架构发生了变化,特别是在其中一个表中添加了一列。

此数据集是使用VS和C#创建的,因此它具有能够按名称访问行和列的所有属性(通过Microsoft生成的代码)。它包含VS需要知道数据集的外观和名称的所有文件(.xsd,.cs等)。

通过XML Serialization加载并保存文件。这会导致一个问题,因为当我反序列化旧文件时,它会加载到与旧架构相关的数据中。这大部分都有效,但是创建的对象(数据集)除了稍后添加的列外,还有其他所有内容。因此,当尝试访问新列时,它会失败,因为反序列化不知道它并且整个列最终为空。

这现在导致更多问题,因为它在尝试通过数据集的属性访问该列(因为它为null)时抛出异常。

问题
我的问题是,反序列化后我可以以某种方式添加列吗?我显然需要添加它,以便它符合Microsoft生成的代码,因为这样做:

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

...不添加所需的列。它可能会添加一列,但行属性myDataRow.MyMissingColumn将返回null并输出错误。

我是否需要以某种方式将新架构复制到此对象中?同样,这是失败的唯一原因是因为旧文件是使用旧模式序列化的。

任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:1)

为什么不从新架构文件加载架构,然后加载旧数据。如果你的列允许空值,它应该没问题。

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);
 }

答案 1 :(得分:0)

您正在添加新列而未指定其数据类型,很奇怪,我会使用Add的另一个重载来指定typeof(string)

除此之外,你可以理解:myDataRow.MyMissingColumn是可以理解的,因为在XSD的初始版本中没有类型/列映射,但是你能不能通过名称或索引访问这个列?

尝试这样的事情

myDataRow["MyMissingColumn"] = "Test";

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