Запустить SQL серверную хранимую процедуру прямо из контроллера - PullRequest
1 голос
/ 08 мая 2020

У меня есть эта хранимая процедура на SQL сервере:

CREATE PROCEDURE current_call
    @call_id int
AS
BEGIN
    SET NOCOUNT ON;

    SELECT 
        dbo.Call.call_id, dbo.Call.city, dbo.Call.call_received, 
        dbo.Call.call_transfer, dbo.Call.call_response, dbo.Call.call_depart, 
        dbo.Call.call_arrive, dbo.Call.call_return, dbo.Call.call_end, 
        dbo.Priority.name AS priorityName, dbo.Call_Status.name as Call_Status, 
        dbo.Station.station_name, dbo.City.city_name, dbo.Protocol.name AS protocolName
    FROM     
        dbo.City 
    INNER JOIN
        dbo.Call 
    INNER JOIN 
        dbo.Priority ON dbo.Call.priority = dbo.Priority.priority_id 
        ON dbo.City.city_id = dbo.Call.city 
    INNER JOIN
        dbo.Protocol ON dbo.Call.protocol_category = dbo.Protocol.id 
    LEFT OUTER JOIN
        dbo.Station 
    INNER JOIN
        dbo.Ambulance ON dbo.Station.station_id = dbo.Ambulance.ambulance_station 
        ON dbo.Call.amb_id = dbo.Ambulance.ambulance_id
    INNER JOIN
        dbo.Call_Status ON dbo.Call.call_status = dbo.Call_Status.call_status_id
    WHERE 
        dbo.Call.call_id = @call_id;
END

Я пытаюсь вызвать ее через контроллер и распечатать полученные поля как строку json, но безуспешно!

Это мой контроллер:

public System.Web.Http.Results.JsonResult<String> GetTwo(int c_id)
{
    using (EMSMVCEntities entities = new EMSMVCEntities())
    {
        entities.Configuration.ProxyCreationEnabled = false;

        var query = entities.Database.SqlQuery<ObjectResult>("exec [dbo].[current_call] @call_id", new SqlParameter("call_id", c_id)).ToList();

        return Json (query.ToString());
    }
}

Однако я получаю следующую ошибку:

System.InvalidOperationException: 'Тип результата' System.Data. Entity.Core.Objects.ObjectResult 'может не быть абстрактным и должен включать конструктор по умолчанию.'

Я также попробовал следующий код, и результат был "-1"

var query = entities.Database.ExecuteSqlCommand("exec [dbo].[current_call] @call_id", new SqlParameter("call_id", c_id)).toString();

1 Ответ

3 голосов
/ 12 мая 2020

SqlQuery не работает с динамическими c типами:

, если вы хотите использовать тип Dynami c или анонимный тип как его [SqlQuery] возвращаемый тип, вы, вероятно, скомпилируете свой код, но получите исключения во время выполнения.

Также обратите внимание, что вы не можете просто позвонить ToString() для преобразования вашего List<object> в json, вы необходимо сериализовать их.

Примечание: в этом ответе я собираюсь использовать Newtonsoft. Json для сериализации, однако есть и другие параметры .


Я рекомендую создать модель для вашего результата SP, таким образом вы можете спроецировать результат SqlQuery в свою модель ... определение модели также имеет преимущество использования атрибута [JsonProperty], который является полезно для сопоставления ваших свойств с другим именем при их сериализации в json.

public class CurrentCall
{
    // [JsonProperty(PropertyName = "Caller_Id")] <-- json property name (if different)
    public long call_id { get; set }
    public string city { get; set }
    public DateTime call_received { get; set }
    public string call_transfer { get; set }
    public string call_response { get; set }
    public DateTime call_depart { get; set }
    public DateTime call_arrive { get; set }
    public DateTime call_return { get; set }
    public DateTime call_end { get; set }
    public string priorityName { get; set }
    public bool Call_Status { get; set }
    public string station_name { get; set }
    public string city_name { get; set }
    public string protocolName { get; set }
}

Затем вы можете получить результат:

var currentCalls = entities.Database.SqlQuery<CurrentCall>("exec [dbo].[current_call] @call_id", new SqlParameter("call_id", c_id)).ToList();

Если вы хотите вернуть результат как сериализованный json, затем попробуйте:

var jsonResult = JsonConvert.SerializeObject(currentCalls); 
return Json(jsonResult)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...