【问题标题】:DataTable does not support schema inferenceDataTable 不支持模式推断
【发布时间】:2018-05-12 08:02:56
【问题描述】:

我的应用程序中有许多数据表,其中一些需要从 xmls 导入。每个 readxml 函数都运行良好,除了一个。

这里是一些xml内容;

 <dtSysStat>
    <ST>2017-11-28T21:14:58+03:00</ST>
    <INST_ID>1</INST_ID>
    <RM>1.34</RM>
    <WM>0.04</WM>
    <RR>86</RR>
    <WR>2</WR>
    <TR>0</TR>
  </dtSysStat>

这是数据表结构;

dtSysStatTemp.Columns.Add("ST", typeof(DateTime));
dtSysStatTemp.Columns.Add("INST_ID", typeof(int));
dtSysStatTemp.Columns.Add("RM", typeof(double));
dtSysStatTemp.Columns.Add("WM", typeof(double));
dtSysStatTemp.Columns.Add("RR", typeof(double));
dtSysStatTemp.Columns.Add("WR", typeof(double));
dtSysStatTemp.Columns.Add("TR", typeof(double));

这里是阅读部分;

dtSysStatTemp.TableName = "dtSysStat";
dtSysStatTemp.ReadXml(AppDomain.CurrentDomain.BaseDirectory + pathnameicustom);

我还从 dtsysstat 数据表结构中编写了这个 xml。所以我确信架构结构是相同的。

我不明白为什么会出现“DataTable 不支持架构推断”错误。因为所有其他带有 readxml 的数据表都可以正常工作。

我想在不使用数据集的情况下这样做

【问题讨论】:

  • 为什么首先使用 DataTable?为什么不是强类型对象?
  • DataSet WriteXml 和 DataTable WriteXml 之间存在细微差别。 DataSet 一直在工作。 DataTable 仅在 DataTable 具有名称时才有效。别问我为什么。读取 DataSet 时,第一级标记是 DataSet 名称。二级标签是 DataTable 名称。第三级标签是列名。第四级标签是行数据。当您有超过四层时,网络库会将数据分解为许多无用的数据表。当您尝试读取与 DataTable 相同的文件时,它变得不可能,因为您无法创建多个数据表。

标签: c# xml winforms datatable


【解决方案1】:
  1. 确保标签中没有空格,例如:
    错误&lt; ST &gt; &lt; /ST&gt; 正确&lt;ST&gt; &lt;/ST&gt;
  2. 使用DataSet 而不是DataTable - DataTable 不支持架构 从 Xml 推断。

我已经对其进行了测试,它可以按预期工作:

private void XmlToDataset() 
{
    DataSet dsysStatTemp = new DataSet();
    XmlDocument doc = new XmlDocument();
    string xmlString = @"<dtSysStat>
     <ST> 2017 - 11 - 28T21: 14:58 + 03:00 </ST>
     <INST_ID> 1 </INST_ID>
     <RM> 1.34 </RM>
     <WM> 0.04 </WM>
     <RR> 86 </RR>
     <WR> 2 </WR>
     <TR> 0 </TR>
     </dtSysStat>";

    doc.Load(new StringReader(xmlString));

    XmlTextReader xtr = new XmlTextReader(doc.OuterXml, XmlNodeType.Element, null);
    dsysStatTemp.ReadXml(xtr);
    MessageBox.Show(dsysStatTemp.Tables[0].Rows[0]["ST"].ToString());
}

【讨论】:

  • 但是我可以在不使用数据集的情况下使用所有其他数据表。
  • 我不明白你的评论。另外,我希望人们能解释为什么他们投反对票。
【解决方案2】:

您可以使用数据集尝试以下操作。

DataSet ds = new DataSet();
ds.ReadXml("testfile.xml");
DataTable dt = ds.Tables["dtSysStat"];
return dt.Rows[0]["ST"].ToString();

Alt 解决方案(添加 ReadXmlSchema):

dtSysStatTemp.TableName = "dtSysStat";
dtSysStatTemp.ReadXmlSchema(AppDomain.CurrentDomain.BaseDirectory + pathnameicustom);
dtSysStatTemp.ReadXml(AppDomain.CurrentDomain.BaseDirectory + pathnameicustom);

【讨论】:

  • 我不想使用数据集。
  • 人们正在付出努力和时间来帮助你,我认为“我不想使用数据集”是不值得尊重的评论,请解释原因。
  • 如果您在 ReadXml 之前使用 ReadXmlSchema,会有所不同吗?我已经用一个例子更新了我的答案。
猜你喜欢
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2021-06-12
  • 2014-06-09
  • 1970-01-01
  • 2021-11-05
相关资源
最近更新 更多