背景的
这是我的问题。在我的程序的早期阶段,System.Data.DataSet
被序列化为文件。然后一段时间后,程序中的数据集架构发生了变化,特别是在其中一个表中添加了一列。
此数据集是使用VS和C#创建的,因此它具有能够按名称访问行和列的所有属性(通过Microsoft生成的代码)。它包含VS需要知道数据集的外观和名称的所有文件(.xsd,.cs等)。
通过XML Serialization加载并保存文件。这会导致一个问题,因为当我反序列化旧文件时,它会加载到与旧架构相关的数据中。这大部分都有效,但是创建的对象(数据集)除了稍后添加的列外,还有其他所有内容。因此,当尝试访问新列时,它会失败,因为反序列化不知道它并且整个列最终为空。
这现在导致更多问题,因为它在尝试通过数据集的属性访问该列(因为它为null)时抛出异常。
问题
我的问题是,反序列化后我可以以某种方式添加列吗?我显然需要添加它,以便它符合Microsoft生成的代码,因为这样做:
myDataSet.myTable.Columns.Add("MyMissingColumn");
...不添加所需的列。它可能会添加一列,但行属性myDataRow.MyMissingColumn
将返回null并输出错误。
我是否需要以某种方式将新架构复制到此对象中?同样,这是失败的唯一原因是因为旧文件是使用旧模式序列化的。
任何建议都表示赞赏。
答案 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();