0

我有一个程序,我在其中运行查询并将数据存储在 DataTable 中。然后我允许用户保存该 DataTable.WriteXML。我遇到的问题是我想将该保存的文件(XML 文件)读入另一个具有不同名称的 DataTable - 它不允许这样做!它给了我一个错误“将结果表加载到文件时出错:数据表:'ImportTable' 与源中的任何数据表都不匹配”

现在我相信这条消息告诉我 XML 包含的表名与我尝试将 ReadXML 写入其中的 DataTable 不同。我尝试将 TableName 属性设置为空白 - 但这没有任何区别。

所以 - 我的问题是其他人如何解决这个问题?我正在使用标准的 DataTable.WriteXML(filename) - 和 DataTable.ReadXML 方法调用。并且由于一些设计问题 - 我确实需要将导入 DataTable 命名为与用于导出数据的名称不同的名称。

是否有不同的方法来写出和读入 DataTable 中的数据来解决这个问题?

示例代码 - 显示问题 在表单加载中 - 创建两个表 - 一个名为 Export 另一个 Import。为导出创建一个结构 - 并用 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 'Import' 与源中的任何 DataTable 都不匹配。” 现在 - 我意识到这是因为 XML 在 XML 中嵌入了导出表名称。在我的情况下,我需要将该数据导入具有不同名称的 DataTable - 我想知道其他人过去是如何(以及是否)处理过这个问题的?您是否手动更改了 XML 中的名称?您是否临时更改了数据表名称?或者是否有另一种更好的方法来解决尝试使用 DataTable 的 READXML 方法的问题?

4

1 回答 1

0

好的 - 我一直在玩这个 - 并且有一个解决方案。不确定它是否是最好的(如果我能更好地做到这一点,我将不胜感激)。

基本上,我要做的就是将 XML 写入字符串阅读器——更改模式和记录元素的表名。<> 和标签。
然后当我读入它时 - 我必须做相反的事情 - 基本上将文件读入一个字符串 - 然后将所有表名改回我需要的名称。然后我必须将文件写入磁盘(临时文件) - 然后使用 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);
于 2018-01-02T07:20:06.387 回答