【问题标题】:Loading a datatable into a xml and xml back into a datatable将数据表加载到 xml 并将 xml 加载回数据表
【发布时间】:2012-09-09 10:47:37
【问题描述】:

所以我有一个我将数据查询到 DataTable 中

using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
       DataSet dataSet = new DataSet();
       adapter.Fill(dataSet, "AccessRights");

       return dataSet.Tables[0];
}

现在我开始构造 XML 以发送回客户端

string tableData = null;
using(StringWriter sw = new StringWriter())
{                    
      rightsTable.WriteXml(sw);
      tableData = sw.ToString();                    
}

 StringBuilder build = new StringBuilder();               
 using (XmlWriter writer = XmlWriter.Create(build, new XmlWriterSettings { OmitXmlDeclaration = true }))
 {
      writer.WriteStartElement("useraccess");
      writer.WriteCData(xmlTable.OuterXml);
      writer.WriteEndElement();
 }

现在在客户端我需要从 Xml 中获取 DataTable

XmlCDataSection cDataNode = (XmlCDataSection)xdoc.SelectSingleNode("./mp_getindividualaccessrights_response/data/useraccess").ChildNodes[0];
string xmlDataString = cDataNode.Data.ToString();
StringReader sReader = new StringReader(xmlDataString);
string s = sReader.ToString();
DataSet ds = new DataSet();

ds.ReadXml(sReader);

return ds.Tables[0];

如果数据库中有数据将返回 DataTable 中的列和行,则此方法有效

如果数据库中没有结果,我的问题就出现了,那么即使没有行数据,我也希望将列存储在 xml 字符串中(当 dt.WriteXml() 时)。但是当 dt.WriteXml() 返回的 xml 字符串是一个我不想要的空标签时会发生什么。基本上我希望标签在数据库查询中有列,即使没有数据行,例如

我知道 DataTable 有列 (dt.Tables[0].Columns.Count) 我得到一个大于 0 的数字,当我 (dt.Tables[0].Rows.Count) 我得到 0。这很好,因为当我查询时,我没有找到我正在寻找的结果,但列仍然存在。但是当我 DataTable.WriteXML() 列消失的那一刻。

无论是否找到行,我都希望列显示在 xml 字符串中。但 DataTable.WriteXml 似乎没有正确执行此操作。

有人可以帮我解决这个问题吗?

编辑:添加了一些测试代码以更好地说明此问题

DataTable dt = new DataTable();
        DataColumn[] dtc = new DataColumn[] { new DataColumn("Name"), new DataColumn("Age"), new DataColumn("Surname") };
        DataSet ds = new DataSet();
        ds.Tables.Add(dt);
        dt.Columns.AddRange(dtc);

        string xmlString = null;
        using (StringWriter sw = new StringWriter())
        {
            ds.WriteXml(sw);
            xmlString = sw.ToString();
        }

        XmlDocument doc = new XmlDocument();
        StringBuilder build = new StringBuilder();
        using (XmlWriter writer = XmlWriter.Create(build, new XmlWriterSettings { OmitXmlDeclaration = true }))
        {
            writer.WriteStartElement("Root");
            writer.WriteCData(xmlString);
            writer.WriteEndElement();
        }

        XmlDocument xdoc = new XmlDocument();
        xdoc.LoadXml(build.ToString());

        XmlCDataSection cDataNode = (XmlCDataSection)xdoc.SelectSingleNode("./Root").ChildNodes[0];
        string xmlDataString = cDataNode.Data.ToString();
        StringReader sReader = new StringReader(xmlDataString);
        DataSet ds1 = new DataSet();

        ds1.ReadXml(sReader);

        Console.WriteLine(ds1.Tables[0].Columns.Count);

        Console.ReadLine();

从上图看:这会导致我的 DataTable 中没有行,但 DataTable 确实有列,这些列没有反映在我需要的 xml 中。所以基本上我需要让xml看起来如下

<DataSet>
   <Name></Name>
   <Age></Age>
   <Surname></Surname>
<DataSet>

但是 ds.WriteXml() 不允许这样做。

【问题讨论】:

  • WriteXmlSchema/ReadXmlSchema 有什么问题?
  • 我添加了 WriteXmlSchema/ReadXmlSchema 并且它可以工作。谢谢:)

标签: c# xml datatable dataset


【解决方案1】:

无论是否存在行数据,为了显示列,您都需要执行此操作。 Schema 将保留数据表元数据。只需确保将 XmlWriteMode 和 XmlReadMode 设置为 Schema

ds.WriteXml(sReader, XmlWriteMode.WriteSchema);
ds.ReadXml(sReader, XmlReadMode.ReadSchema);

这将保留所有表格数据,包括列名和列数据类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多