1

我有一个存储过程,它返回FOR XML RAW类似于以下格式的 XML 原始数据:

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

当我在 Management Studio 中运行存储过程时,返回了 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;

            }
        }

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

任何人对为什么会发生这种情况有任何想法,因为我希望数据库返回 XML?

提前致谢。

4

2 回答 2

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;

                }
            }
于 2013-02-15T17:48:36.050 回答
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);
}
于 2013-02-15T17:40:47.767 回答