2013-02-15 28 views
1

打電話時,我有一個存儲過程返回XML原始數據FOR XML RAW類似如下的格式2005不正確:XML RAW數據從SQL Server返回從.NET

<row 
    codelistid="1" codelistname="LOCATION" 
    codeid="1557" codename="Hors Ile de France" languageid="1" /> 

當我運行在管理存儲過程工作室1765行的價值的數據返回,但是當我從我的C#代碼調用過程似乎是882的一半左右。似乎如果兩行具有相同的codeid,那麼只有一個返回

我正在使用xmlreader按行返回XML,然後將每行作爲XElement附加到我的結果XDocument。

這裏是我正在檢索數據:

using (SqlConnection conn = new SqlConnection(con)) 
     { 
      XDocument results = new XDocument(
      new XElement("results")); 

      using (SqlCommand cmd = conn.CreateCommand()) 
      { 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.CommandText = "MyStoredProc"; 
       conn.Open(); 
       var count = 0; 
       using (XmlReader reader = cmd.ExecuteXmlReader()) 
       { 

        while (reader.Read()) 
        { 

         results.Root.Add(XElement.Parse(reader.ReadOuterXml())); 
         count += 1; 

        } 
       } 

       return results; 

      } 
     } 

如果我改變了存儲過程來輸出數據,而不是XML,並通過SqlDataReader的讀它,它似乎很好地工作。

任何人有任何想法,爲什麼會發生這種情況,因爲我最好喜歡數據庫來返回XML?

在此先感謝。

回答

4

reader.Read()reader.ReadOuterXml()在相同的環路是將跳過一行。試試這個:

using (XmlReader reader = cmd.ExecuteXmlReader()) 
      { 
       reader.Read(); //For initial first read. 
       while (!reader.EOF) 
       { 

        results.Root.Add(XElement.Parse(reader.ReadOuterXml())); 
        count += 1; 

       } 
      } 
+0

AbZy - 你是絕對正確的,你忘記了把reader.Read()在你的榜樣while循環外 - 感謝您的幫助:-) – fedor333 2013-02-15 18:09:40

+0

@ fedor333你是對的,會現在添加它。歡迎您:)感謝您的接受。 – AbZy 2013-02-15 18:10:37

0

如果將查詢數據放入DataSet中,然後將該數據集寫入XML,那麼該怎麼辦?

public GetXmlFromDataSet() 
{ 
    DataSet myDataSet = new DataSet(); 
    DbDataAdapter myDataAdapter = DatabaseFactory.CreateDataAdapter(); 
    DbConnection DatabaseConnection = new DatabaseConnection(/*put appropriate values here*/); 
    XmlTextWriter myXmlTextWriter = new XmlTextWriter(/*put appropriate values here*/) 

    myDataDapter.SelectCommand = DatabaseFactory.CreateCommand(); 
    myDataDapter.SelectCommand.CommandType = CommandType.StoredProcedure; 
    myDataAdapter.CommentText = "EXEC MyStoredProc"; 
    myDataAdapter.SelectCommand.Connection = DatabaseConnection; 
    myDataAdapter.Fill(myDataSet); 
    myDataSet.WriteXml(myXmlWriter); 
}