如何将XML作为输出参数返回到控制器

时间:2015-08-13 18:38:37

标签: c# sql xml sql-server-2008 asp.net-mvc-4

我试图将sproc中的查询结果作为XML字符串返回给C#.NET MVC4控制器。据我了解,您不允许将XML作为输出参数发送到控制器,而无需先将其转换为varchar。我在使用SELECT语句将FOR XML AUTO语句转换为可以作为输出参数传回的varchar时遇到问题。

以下是一些代码:

set @sql='select StatusId from TestTable where StatusId = 3 FOR XML AUTO'

EXECUTE sp_executesql @sql

这个例子没有正确使用`sp_executesql,但我只想要一个简单的例子。如何将结果返回给控制器?

1 个答案:

答案 0 :(得分:0)

我不确定是不允许将XML发送到控制器;然而,对你的场景作出一些假设(因为问题有点模糊),我确实得到了一个全新的MVC5项目的输出(我认为没有理由相信这在MVC4中不起作用)。

重现的步骤:

1)我在SSMS中创建了一个表:

    use test; -- a testing database I leave lying about
    create table TestTable(StatusId int, SomeStuff nvarchar(max));

2)我在该表中放了一些数据:

    insert into TestTable(StatusId, SomeStuff) values (3, 'foo bar quux');
    insert into TestTable(StatusId, SomeStuff) values (4, 'some other stuff');

3)我写了一个proc来获取数据;具体来说,我想看看如果我收到多个结果会发生什么,因此我与你的示例sql的差异很小:

    create procedure sp_xmlresult as
    begin
        declare @sql nvarchar(max);
        set @sql='select * from TestTable where StatusId in(3,4) FOR XML AUTO, ROOT(''results'')'

        EXECUTE sp_executesql @sql
    end;

3)在我的MVC HomeController中,我添加了一些代码:

    public ActionResult Index()
    {
        var builder = new SqlConnectionStringBuilder();
        builder.DataSource = "localhost";
        builder.IntegratedSecurity = true;
        builder.InitialCatalog = "test";
        XDocument doc = null;
        using (var conn = new SqlConnection(builder.ConnectionString))
        {
            conn.Open();
            using (var cmd = conn.CreateCommand())
            {
                cmd.CommandText = "exec sp_xmlresult";
                using (var reader = cmd.ExecuteReader())
                {
                    if (reader.Read())
                        doc = XDocument.Parse(reader[0].ToString());
                }
            }
        }
        return View(doc);
    } 

4)现在,我想看看我得到了什么:我在Home文件夹中设置我的Index.cshtml以使用XDocument作为模型并将转义的字符串表示放在那里:

   @model System.Xml.Linq.XDocument
   ...
   @{ Write(Model.ToString()); }

我在页面中看到了这个输出:        <结果> < TestTable StatusId =“3”SomeStuff =“foo bar quux”/> < TestTable StatusId =“4”SomeStuff =“其他一些东西”/> < /结果>

特别感兴趣的是您可能想要包含

, ROOT(''results'')'

上面概述的proc部分 - 否则SQL Server会返回一个文档,每个结果有一个节点而没有根节点,因此XDocument解析它的日子不好。

我认为一个更现实的项目会在Index()动作中使用XML做一些有趣的事情,但到目前为止我完全没有想象。希望这会有所帮助。