所以我有一个查询数据到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
获取DataTableXmlCDataSection 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
中的列和行,则此方法有效如果DataBase中没有结果,我的问题就出现了,那么我希望列存储在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()不允许这样做。
答案 0 :(得分:2)
无论是否存在行数据,都需要执行此操作才能显示列。 Schema将保留数据表元数据。只需确保将XmlWriteMode和XmlReadMode设置为Schema
ds.WriteXml(sReader, XmlWriteMode.WriteSchema);
ds.ReadXml(sReader, XmlReadMode.ReadSchema);
这将保留所有表数据,包括列名和列数据类型。