Subhash Tripathi Ответов: 1

Как вызвать хранимую процедуру в MVC, пожалуйста, проверьте мой код


Создайте таблицу [dbo].[tblDepartment](
[departmentId] [int] IDENTITY(1,1) NOT NULL,
[имя] [nvarchar](50) NULL,
Ограничение [PK_tblDepartment] первичный ключ КЛАСТЕРИЗОВАН
(
[departmentId] ASC
)С (КАК = ВЫКЛ, STATISTICS_NORECOMPUTE = OFF, ТО ЗНАЧЕНИЕ IGNORE_DUP_KEY = OFF, ТО ПАРАМЕТРЫ ALLOW_ROW_LOCKS = ON, ТО ALLOW_PAGE_LOCKS ИНСТРУКЦИИ =) НА [ОСНОВНОЙ]
) НА [ПЕРВИЧНОМ]

ГО
Создайте таблицу [dbo].[tblUser](
[userId] [int] IDENTITY(1,1) NOT NULL,
[имя] [nvarchar](50) NULL,
[адрес] [nvarchar](500) NULL,
[state] [nvarchar](50) NULL,
[зарплата] [bigint] NULL,
[departmentId] [int] NULL,
Ограничение [PK_tblUser] первичный ключ КЛАСТЕРИЗОВАН
(
[имя пользователя] АСК
)С (КАК = ВЫКЛ, STATISTICS_NORECOMPUTE = OFF, ТО ЗНАЧЕНИЕ IGNORE_DUP_KEY = OFF, ТО ПАРАМЕТРЫ ALLOW_ROW_LOCKS = ON, ТО ALLOW_PAGE_LOCKS ИНСТРУКЦИИ =) НА [ОСНОВНОЙ]
) НА [ПЕРВИЧНОМ]

ГО

ALTER TABLE [dbo].[tblUser] с проверкой добавить внешний ключ([departmentId])
Список литературы [dbo].[tblDepartment] ([столбец DepartmentID])
ГО



моя процедура
создайте proc [dbo].[tblDepartment_insertUpdate]
@userId int =0,
@name nvarchar(50) ,
@state nvarchar (50),
@address nvarchar(500),
@поле DepartmentID, инт ,
@result вывод nvarchar(50)
АС
Начать
if (@userId = 0)
начать
вставить в tblUser (имя ,адрес,штат,departmentId)
ценности
(@имя,@адрес@государству,@поле DepartmentID)
if (@@identity >0)
set @result='запись сохранена успешно'
еще
set @result ='запись не сохранена!'
конец
еще
начать
обновление набора tblUser
имя name,
адрес=адрес@,
государство=@государству,
поле DepartmentID=@поле DepartmentID
где userId=@userId
set @result='запись обновлена !'
конец
конец

Что я уже пробовал:

общественные ihttpactionresult с PostEmpDetails(имя string ,int и поле DepartmentID , адрес строки , инт зарплату , строку состояния , int идентификатор пользователя )
{
if (!ModelState.Функция IsValid)
{
возврат BadRequest(ModelState);
}

// с помощью собственной хранимой процедуры

var spName = новый SqlParameter("@name", name);
var spState = новый SqlParameter("@state", state);
var spAddress = новый SqlParameter("@address", адрес);
var spDepartmentId = новый SqlParameter("@departmentId", departmentId);
ВАР spuser, который = новый объект sqlparameter("@имя пользователя", имя пользователя);

var spOut = новый SqlParameter
{
Имяпараметра = "@результате",
Значения Sqldbtype = Система.Данных.Значения sqldbtype.Тип nvarchar,
Размер = 100,
Направление = System.Data.ParameterDirection.Выход
};

ВАР пользователя = eContext.Базы данных.SQL-запрос&ЛТ;tbluser&ГТ; ("exec для tblDepartment_insertUpdate @имя пользователя,@имя,@государству, адрес@,@поле DepartmentID ,@результат ",
spuser, который, имяхранимойпроцедуры, spState, spAddress, spDepartmentId, носик
).ToList<tbluser>();
возвращение ОК(пользователей);
}

он сохраняет данные, но дает ошибку
Средство чтения данных несовместимо с указанным "EntityTestModel.tblUser". Член типа "userId" не имеет соответствующего столбца в считывателе данных с тем же именем.

1 Ответов

Рейтинг:
9

Richard Deeming

SqlQuery<TResult> предназначен для выполнения запроса, возвращающего список сущностей.

Ваш запрос ничего не возвращает. Поэтому вам нужно использовать ExecuteSqlCommand вместо.

eContext.Database.ExecuteSqlCommand(
    "exec tblDepartment_insertUpdate @userId,@name,@state,@address,@departmentId ,@result out",
    spUser, spName, spState, spAddress, spDepartmentId, spOut);

return Ok();

Или, если вы хотите вернуть данные пользователя из вашего действия, вам понадобится дополнительная информация. SELECT оператор в конце хранимой процедуры возвращает сведения о пользователе, которого вы только что обновили.
if (@userId = 0)
begin
    insert into tblUser 
    (
        name,
        address,
        state,
        departmentId
    )
    values 
    (
        @name,
        @address,
        @state,
        @departmentId
    );
    
    -- Store the ID of the new user, so we can select the details:
    SET @userId = Scope_Identity();
end
else
begin
    update 
        tblUser 
    set
        name = @name,
        address = @address,
        state = @state,
        departmentId = @departmentId
    where 
        userId = @userId
    ;
end;

SELECT
    userId,
    name,
    address,
    state,
    departmentId
FROM
    tblUser
WHERE
    userId = @userId
;


Subhash Tripathi

Спасибо Ричард Диминг

Karthik_Mahalingam

5