2013-02-15 66 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); 
}