使用存储过程是否将XML Path直接读入绑定到DataGridView的DataSet中?

时间:2018-10-14 19:33:03

标签: c# sql-server xml stored-procedures datagridview

我有以下存储过程:

CREATE Procedure [dbo].[usp_GetMyAlbumData]  
AS
    SELECT * 
    FROM [dbo].[tblAlbumDetails]  
    FOR XML PATH('AlbumDetail'), ROOT('AlbumDetails'), TYPE

,我需要弄清楚如何使用usp_ReportGetMyAlbumData生成的XML在datagridview中显示数据。

例如,我的数据库中有一条记录。当我在SQL Server 2012中运行usp_ReportGetMyAlbumData存储过程时,得到以下结果:

<AlbumDetails>
  <AlbumDetail>
    <MusicID>1</MusicID>
    <AlbumDesc>Jones</AlbumDesc>
    <AlbumDate>2018-10-13T15:55:49.843</AlbumDate>
    <AlbumPrice>4.0000</AlbumPrice>
  </AlbumDetail>
</AlbumDetails>

我想使用C#将此XML结果(或usp_ReportGetMyAlbumData产生的任何其他XML结果)写入DataSet,以便可以将其绑定到DataGridView。

我知道如何write XML files to a Dataset,但是存储过程返回XML,而不是XML 文件

我需要编写什么代码来使用存储过程生成的XML数据填充数据集?

2 个答案:

答案 0 :(得分:2)

xml将是数据库中的字符串。因此,我将使用xml linq parse方法将字符串放入数据表中。然后使数据表成为DGV的来源。参见下面的代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        const string FILENAME = @"c:\temp\test.xml";
        public Form1()
        {
            InitializeComponent();

            //data will be from the database a string
            //I'm reading fron a file for testing
            string xml = File.ReadAllText(FILENAME);

            DataTable dt = new DataTable();
            dt.Columns.Add("MusicID", typeof(int));
            dt.Columns.Add("AlbumDesc", typeof(string));
            dt.Columns.Add("AlbumDate", typeof(DateTime));
            dt.Columns.Add("AlbumPrice", typeof(decimal));

            XDocument doc = XDocument.Parse(xml);

            foreach(XElement album in doc.Descendants("AlbumDetail"))
            {
                dt.Rows.Add(new object[] {
                    (int)album.Element("MusicID"),
                    (string)album.Element("AlbumDesc"),
                    (DateTime)album.Element("AlbumDate"),
                    (decimal)album.Element("AlbumPrice")
                });
            }

            dataGridView1.DataSource = dt;

        }
    }
}

答案 1 :(得分:1)

string xml = "your xml here";
var ds = new DataSet();

using (var reader = new StringReader(xml))
{
    ds.ReadXml(reader);
}

dataGridView.DataSource = ds.Tables[0];