我试图将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,但我只想要一个简单的例子。如何将结果返回给控制器?
答案 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做一些有趣的事情,但到目前为止我完全没有想象。希望这会有所帮助。