2015-08-13 3 views
0

Я пытаюсь вернуть результаты запроса в sproc на контроллер C# .NET MVC4 в виде строки XML. Насколько я понимаю, вам не разрешено отправлять XML в контроллер в качестве выходного параметра без предварительного преобразования его в varchar. У меня возникли проблемы с синтаксисом для преобразования инструкции SELECT, которая выводит XML с использованием FOR XML AUTO в varchar, который может быть передан обратно в качестве выходного параметра.Как вернуть XML в контроллер в качестве выходного параметра

Вот некоторые из кода sproc:

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

EXECUTE sp_executesql @sql 

Этот пример не использует `sp_executesql правильно, но я просто хотел быстрый пример. Как результат может быть возвращен контроллеру?

ответ

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) Теперь, я хочу посмотреть, что я выберусь: Я поставил мой Index.cshtml в папке Home использовать XDocument в качестве модели и падение сбежавшего строкового представления прямо:

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

и Я вижу t его выход на моей странице: < результаты > < TestTable StatusId = "3" SomeStuff = "Foo бар quux"/> < TestTable StatusId = "4" SomeStuff = "некоторые другие вещи"/> </Результаты >

что представляет особый интерес в том, что вы, вероятно, хотите, чтобы включить

, ROOT(''results'')' 

часть технологич я очертить выше - в противном случае SQL Server возвращает документ с одним узлом в результате и без корневого узла, так XDocument имеет плохой день, анализируя это.

Я бы предположил, что более реалистичный проект будет делать что-то интересное с XML в действии Index(), но я все это не мог вообразить. Надеюсь это поможет.

Смежные вопросы