我有一个程序,在该程序中我运行查询并将数据存储在数据表中。然后,我允许用户保存该datatable.writexml。我遇到的问题是,我想将保存的文件(XML文件)读取到另一个名称的数据表中,并且不允许它!它给我一个错误"加载结果表的错误:数据表:'importTable'与源中的任何数据级都不符'
现在,我相信此消息告诉我,XML包含的表名与我试图将其读取到其中的数据名称不同。我已经尝试将TaberAme属性设置为空白 - 但这没有任何区别。
所以 - 我的问题是其他人如何解决这个问题?我使用的是标准datatable.writexml(fileName) - 和datatable.readxml方法调用。而且由于某些设计问题 - 我确实需要将导入数据列出的命名与导出数据的命名不同。
是否有不同的方法可以在数据数据中写出并阅读该问题的数据?
示例代码 - 显示问题在表单负载中 - 创建两个表 - 一个名为"导出另一个导入"。为导出创建一个结构 - 并用10个记录填充它。
private void Form_Main_Load(object sender, EventArgs e)
{
ExportTable = new DataTable("Export");
ImportTable = new DataTable("Import");
ExportTable.Columns.Add("ID", Type.GetType("System.Int32"));
ExportTable.Columns.Add("Name", Type.GetType("System.String"));
ExportTable.Columns.Add("Amount", Type.GetType("System.Int32"));
// Populate the first one
DataRow workRow;
for (int i = 0; i <= 9; i++)
{
workRow = ExportTable.NewRow();
workRow[0] = i;
workRow[1] = "CustName" + i.ToString();
workRow[2] = i;
ExportTable.Rows.Add(workRow);
}
}
然后创建两个按钮 - 一个用于导出数据的按钮 - 另一个用于导入数据的按钮。
private void button_Export_Click(object sender, EventArgs e)
{
ExportTable.WriteXml("c:\Temp\TableOut.xml");
}
private void button_Import_Click(object sender, EventArgs e)
{
ImportTable.ReadXmlSchema("c:\Temp\TableOut.xml");
ImportTable.ReadXml("c:\Temp\TableOut.xml");
}
运行程序 - 导出数据 - 然后单击"导入"按钮。当您这样做时 - 您将收到错误 - " DataTable'导入'与源中的任何数据表不匹配。"现在 - 我意识到这是因为XML的导出表名称嵌入了XML中。就我而言,我需要将这些数据导入具有不同名称的数据词 - 我想知道过去是否(以及是否)与其他名称进行处理?您是否手动更改XML中的名称?您是否暂时更改数据名称?还是在尝试使用DataTable的ReadXML方法的问题上还有另一种更好的方法?
好的 - 我一直在玩这个 - 并有一个解决方案。不确定这是最好的(我很感谢我如何做得更好的任何评论)。
基本上我要做的就是将XML写入字符串读取器 - 更改模式和记录元素的表名。&lt;>和标签。
然后,当我阅读它时 - 我必须进行反向 - 基本上将文件读为字符串 - 然后将所有表名称更改回我需要的名称。然后,我必须将文件写入磁盘(临时文件) - 然后使用readxml方法读取该临时文件,然后删除文件。我不确定为什么使用字符串读取器的readxml无法使用(这似乎是一个有效的参数) - 但是我发现了一些帖子,说明readxml方法和字符串读取器存在问题 - 所以我只是简单地将其写出来要文件并使用文件名的readxml-效果很好。
我希望这对他人有所帮助 - 即使不是"最好的"解决方案 - 也许其他人可以改善它。
写XML
// Write XML
StringWriter sw = new StringWriter();
ResultDT.WriteXml(sw, XmlWriteMode.WriteSchema);
string OutputXML = sw.ToString();
// now replace the Table Name
OutputXML = OutputXML.Replace("<" + ResultDT.TableName + ">", "<" + "ExportTable" + ">");
OutputXML = OutputXML.Replace("</" + ResultDT.TableName + ">", "</" + "ExportTable" + ">");
OutputXML = OutputXML.Replace("MainDataTable="" + ResultDT.TableName + """, "MainDataTable="" + "ExportTable" + """);
OutputXML = OutputXML.Replace("name="" + ResultDT.TableName + """, "name="" + "ExportTable" + """);
System.IO.File.WriteAllText(fileName, OutputXML);
阅读XML
// Read XML
InputXML = System.IO.File.ReadAllText(fileName);
// now replace the Table Name
InputXML = InputXML.Replace("<" + "ExportTable" + ">", "<" + ResultTable.TableName + ">");
InputXML = InputXML.Replace("</" + "ExportTable" + ">", "</" + ResultTable.TableName + ">");
InputXML = InputXML.Replace("MainDataTable="" + "ExportTable" + """, "MainDataTable="" + ResultTable.TableName + """);
InputXML = InputXML.Replace("name="" + "ExportTable" + """, "name="" + ResultTable.TableName + """);
string TempFileName = "TempDumpFile.idt";
System.IO.File.WriteAllText(TempFileName, InputXML);
ResultTable.ReadXmlSchema(TempFileName);
ResultTable.ReadXml(TempFileName);
System.IO.File.Delete(TempFileName);