从.NET调用时,从SQL Server 2005返回的Xml原始数据不正确

本文关键字:返回 Xml 不正确 原始数据 2005 Server NET 调用 SQL | 更新日期: 2023-09-27 17:59:39

我有一个存储过程,它返回XML原始数据FOR XML RAW,格式如下:

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

当我在Management Studio中运行存储过程时,会返回1765行的数据,但当我从C#代码中调用该过程时,它似乎是882行的一半左右。似乎如果两行有相同的代码ID,那么只有一行返回

我使用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;
            }
        }

如果我将SPROC更改为输出数据而不是XML,并通过SQLDataReader读取它,它似乎可以正常工作。

有人知道为什么会发生这种情况,因为我希望数据库返回XML?

提前谢谢。

从.NET调用时,从SQL Server 2005返回的Xml原始数据不正确

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

如果将查询数据放入数据集中,然后将该数据集写入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);
}