Выполнение хранимой процедуры SQL Server с помощью c # linq без DBSet - PullRequest
2 голосов
/ 10 марта 2019

Я сейчас работаю над проектом, и для этой части, над которой я работаю, мне необходимо вызвать хранимую процедуру, которая возвращает строку TicketNumber в формате TodaysDate.Number (например, 11032019.0001).

Вот в чем проблема.Процедура работает, и я могу вызвать это, запустив оператор SQL в базе данных, однако, похоже, ничего не работает при попытке запустить это с C # в контроллере.

В настоящее время у меня есть это:

var NewOrderIdOut = new SqlParameter("@NewOrderIdOut", "");
var result = await db.Tickets.SqlQuery("[dbo].[usp_NewOrderId] @NewOrderIdOut", NewOrderIdOut).SingleAsync();

Хранимая процедура выглядит следующим образом:

CREATE PROCEDURE usp_NewOrderId 
    (@NewOrderIdOut CHAR(13) OUTPUT ) 
AS 
BEGIN
    IF EXISTS (SELECT 1 FROM OrderNumberGenerator 
               WHERE CreatedDate <> CAST(GETDATE() AS DATE))
        TRUNCATE TABLE OrderNumberGenerator   -- restart the counter everyday :)

    INSERT INTO OrderNumberGenerator 
    DEFAULT VALUES

    SELECT @NewOrderIdOut =
           CONVERT(CHAR(8), GETDATE(), 112) +
           RIGHT( '.000' + CAST(SCOPE_IDENTITY() AS VARCHAR(4)), 4)  
END

Я получаю эту ошибку:

Устройство чтения данных несовместимо с указанным PSARMM.Models.Ticket.Элемент типа TicketId не имеет соответствующего столбца в считывателе данных с тем же именем.

Единственная проблема заключается в том, что процедура не возвращает все параметры, которые находятся всмоделируйте только одну строку ticketNumber, чтобы была выдана ошибка.

Другая проблема, я не могу использовать db.ExecuteSqlCommand, потому что не могу установить Microsoft.EntityFrameworkCore, потому что есть некоторые несовместимые файлы в соответствии с nuget.

Я мог бы создать новую таблицу, которая просто использовалась для временного хранения этой новой ticketNumber Я создаю, но чувствовал, что, возможно, есть лучший способ, поэтому я обращаюсь к вам, чтобы узнать, есть ли у вас какие-нибудь гениальные идеи: D

Что касается направления параметра, я понятия не имею.

Приветствия

РЕДАКТИРОВАТЬ: я закончил отбрасывать эту идею и вместо этого использовал триггер в самой таблице для вызова процедуры ипоместите результат в новую строку в правильном столбце.И это сработало как шарм.

1 Ответ

1 голос
/ 11 марта 2019

Другая проблема, я не могу использовать db.ExecuteSqlCommand, потому что

Конечно, вы можете.

Доступно как EF6 , так и EF Core , DbContext.Database.ExecuteSqlCommand - это правильный метод для вызова хранимой процедуры, которая не возвращает набор результатов, сопоставленный с сущностью.

Так что-то вроде:

var NewOrderIdOut = new SqlParameter("@NewOrderIdOut",System.Data.SqlDbType.Int);
NewOrderIdOut.Direction = System.Data.ParameterDirection.Output;

var result = await db.Database.ExecuteSqlCommandAsync("exec [dbo].[usp_NewOrderId] @NewOrderIdOut output", NewOrderIdOut);
...