Dapper с SQL выходным параметром сервера bigint возвращает int32 - PullRequest
3 голосов
/ 07 августа 2020

У меня есть следующий код C# и SQL серверная хранимая процедура.

private static long GetTestBigintOutput(SqlConnection dbConn) 
{
    var sqlParams = new DynamicParameters();
    sqlParams.Add("@input_param", 1);
    sqlParams.Add("@output_param", SqlDbType.BigInt, direction: ParameterDirection.Output);

    dbConn.Execute("stp_zzz_test_output_bigint", sqlParams, commandType: CommandType.StoredProcedure);

    var output = sqlParams.Get<long>("@output_param");

    return output;
}

static void Main(string[] args) 
{
    Console.WriteLine("Hello World!");

    try 
    {
        var output = GetTestBigintOutput(GetDbConnection());
        Console.WriteLine($"Output = {output}");
    }
    catch (Exception ex) 
    {
        Console.WriteLine(ex.Message);                
    }

    Console.ReadKey();
}

Хранимая процедура:

CREATE PROCEDURE stp_zzz_test_output_bigint
    (@input_param bigint,
     @output_param bigint OUTPUT)
AS
BEGIN
    SET @output_param = @input_param  
END

Результатом этого простого консольного приложения является

Привет, мир! Невозможно привести объект типа System.Int32 к типу System.Int64.

Ожидается ли этого? Другие мои хранимые процедуры возвращают значения, привязанные к BIGINT столбцам, но фактическое возвращаемое значение умещается в Int32. Однако я не могу быть уверен заранее, каким будет фактическое возвращаемое значение, и это изменится после запуска программы.

Я знаю, что могу изменить

var output = sqlParams.Get<long>("@output_param");

на

var output = sqlParams.Get<dynamic>("@output_param");

Однако я чувствую, что это своего рода обман.

Есть какие-нибудь мысли?

относительно Пола

1 Ответ

3 голосов
/ 07 августа 2020

Я не думаю, что метод Add из DynamicParameters принимает SqlDbType как параметр dbType. Вместо этого должно быть DbType, так что вы можете попробовать изменить следующее:

sqlParams.Add("@output_param", SqlDbType.BigInt, direction: ParameterDirection.Output);

на это:

sqlParams.Add("@output_param", dbType: DbType.Int64, direction: ParameterDirection.Output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...