2012-09-17 48 views
1

所以我有一個我查詢數據到一個DataTable加載數據表到XML和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

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]; 

這工作如果在數據庫中的數據得到的數據表whic h將返回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(); 

DataSet to xml output

從上面的圖片:這個回報會出現在我的DataTable沒有行,但數據表中確實有列其中沒有反映在我需要的xml中。所以基本上我需要有XML來看看如下

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

但ds.WriteXml()不允許此。

+1

WriteXmlSchema/ReadXmlSchema有什麼問題? –

+0

我添加了WriteXmlSchema/ReadXmlSchema,它的工作原理。謝謝 :) – SpaceApple

回答

2

無論是否存在行數據,您都需要這樣做才能顯示列。 Schema將保留數據表元數據。只要確保有設置模式

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

這會保留所有的表格數據,包括列名的列和數據類型的XmlWriteMode和XmlReadMode。