【问题标题】:How do I add a column into a data set loaded with an outdated schema in C#?如何在 C# 中将列添加到使用过时模式加载的数据集中?
【发布时间】:2011-11-07 21:06:41
【问题描述】:

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

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

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

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

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

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

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

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

欢迎提出任何建议。

【问题讨论】:

    标签: c# dataset schema nullreferenceexception


    【解决方案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);
     }
    

    【讨论】:

    • 我们可能不得不即时添加它。从技术上讲,数据集是序列化的,但它是更大对象序列化的一部分,因此 XML 文件中除了数据集之外还有更多内容。
    • 在这种情况下,您只需要确保在列上设置默认值或在添加时允许空值。
    【解决方案2】:

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

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

    试试这样的

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

    【讨论】:

    • 是的,如果你在VS中通过“添加->新建项->数据集”添加一个数据集并通过设计器定义表/列,就可以这样访问。 VS 会为你设计的数据集自动生成代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2012-09-27
    • 2016-10-12
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多