1

FOR XML RAW次の形式のようなXML 生データを返すストアド プロシージャがあります。

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

Management Studio でストアド プロシージャを実行すると、1765 行分のデータが返されますが、C# コードからプロシージャを呼び出すと、その 882 の約半分のように見えます。戻ってきた

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 ではなくデータを出力するように SPROC を変更し、SQLDataReader を介して読み取ると、正常に動作するようです。

理想的にはデータベースが XML を返すようにしたいので、なぜこれが起こっているのか、誰にもアイデアがありますか?

前もって感謝します。

4

2 に答える 2

4

reader.Read()同じループにreader.ReadOuterXml()いると、1 行スキップされます。これを試して :

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 に答える