c# - 如何将数据表保存到 xml 并将 xml 保存回数据表并保留列,即使没有行?

标签 c# xml datatable dataset

我正在将 DataTable 序列化为 XML,然后反序列化回另一个 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();

DataSet to xml output

从上图中:这返回是因为我的 DataTable 中没有行,但 DataTable 确实有列,这些列未反射(reflect)在我需要的 xml 中。所以基本上我需要 xml 如下所示

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

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

最佳答案

这是您需要执行的操作,以便无论是否有行数据都显示列。 Schema将保留数据表元数据。只需确保 XmlWriteMode 和 XmlReadMode 设置为 Schema

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

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

关于c# - 如何将数据表保存到 xml 并将 xml 保存回数据表并保留列,即使没有行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12455539/

相关文章:

c# - ParallelOptions.CancellationToken 似乎没用

c# - 后台 worker 不工作

java - 如何使用 xml 解析器解析 java.lang.string 无法转换为 java.lang.integer android

java - Android/Java 开发 : How to change TextView text, 使用 Java,在 strings.xml 中预定义字符串?

c# - 数据表上的行标题 - 显示在数据 GridView 中

c# - 使用 DataTable 作为数据源在网格中增量加载

c# - 日期选择器未设置阿拉伯文化中的日期

c# - CheckMarx 中等严重性警告 - 启动时仅使用 HttpOnly cookie

xml - 删除与特定属性值匹配的节点

c# - 如何在 Rows.Add 之后触发 DataTable NewRow 事件