ASP. NET Core MVC и выходной параметр Entity Framework не возвращается при вызове хранимой процедуры - PullRequest
1 голос
/ 13 июля 2020

У меня есть процедура, которая возвращает идентификатор добавленной записи. Я использую Entity Framework для вызова процедуры и получения значения, но оно всегда равно 0.

Это код - вы можете понять, почему он не возвращает значение идентификатора?

C# Код домена Entity Framework:

var cNumber = new SqlParameter("CNumber", acctSl.cNumber);
var fId = new SqlParameter("FId", acctSl.FId);
var splAmt = new SqlParameter("SplAmt", acctSl.SplAmt);
var frDt = new SqlParameter("FrDt", acctSl.FrDate);
var toDt = new SqlParameter("ToDt", acctSl.ToDate);
var user = new SqlParameter("User", acctSl.User);

var id = new SqlParameter("Id", "")
            {
                Direction = ParameterDirection.Output,
                SqlDbType = SqlDbType.VarChar
            };

var sql = "EXECUTE [dbo].[InsertAcctSpl] @CNumber, @FID, @SplAmt, @FrDt, @ToDt, @User, @Id OUTPUT";
var result = DbContext.Database.ExecuteSqlRaw(sql, cNumber, fId, splAmt, frDt, toDt, user, id);

int rowsAffected;
var yourOutput = Convert.ToInt32(id.Value);

if (result > 0)
{
    acctSl.AcctId = yourOutput;
}
else
{
    acctSl.AcctId = 0;
}

SQL Серверная процедура:

ALTER PROCEDURE [dbo].[InsertAccountsSpend]
    @CNumber varchar(15),
    @FId bigint,
    @SplAmt money,
    @FrDt date,
    @ToDt date,
    @User bigint,
    @Id bigint OUTPUT
AS
    INSERT INTO AcctSpend (CNmbr, FID, SplAmt, FrDt, ToDt, 
                           Cr8Dt, Cr8User_ID, UpdtDt, UpdtUser_ID)
    VALUES (@CNumber, @FId, @splAmt, @FroDt,@ ToDt,
            GETDATE(), @User, GETDATE(), @User)
    
    SET @id = SCOPE_IDENTITY()
    RETURN @id

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

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

var id = new SqlParameter("Id", "")
            {
                Direction = ParameterDirection.Output,
                **SqlDbType = SqlDbType.BigInt**
            };
0 голосов
/ 13 июля 2020

Кажется, ваша проблема связана с этим разделом вашего кода:

int rowsAffected;
var yourOutput = Convert.ToInt32(id.Value);

if (rowsAffected > 0)
{
    acctSl.AcctId = yourOutput;
}
else
{
    acctSl.AcctId = 0;
}

Вы основываете свое if-else logi c на переменной rowsAffected, но этой переменной никогда не назначается значение из вывода хранимых процедур. Поскольку rowsAffected объявлен как переменная типа int, он не может быть null, поэтому ему автоматически присваивается значение 0.

Чтобы получить фактическое значение для rowsAffected, вам необходимо: используйте данные, возвращенные в вашей переменной result, которую вы объявили здесь:

var result = DbContext.Database.ExecuteSqlRaw(sql, cNumber, fId, splAmt, frDt, toDt, user, id);

EDIT

Похоже, что синтаксис вокруг вашего id SQL объект параметра неверен. Попробуйте создать этот объект следующим образом:

var id = new SqlParameter
{
    ParameterName = "Id",
    DbType = System.Data.DbType.String,
    Direction = System.Data.ParameterDirection.Output
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...