Dapper with SQL 服务器输出 bigint 参数 returns int32

Dapper with SQL Server output bigint parameter returns int32

我有以下 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

这个简单的控制台应用程序的输出是

Hello World!
Unable to cast object of type 'System.Int32' to type 'System.Int64'.

这是意料之中的事吗?我的其他存储过程 return 值绑定到 BIGINT 列,但实际 returned 值将适合 Int32。但是我无法事先确定实际的 returned 值是多少,一旦程序是 运行.

,这就会改变

我知道我可以改变

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

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

不过我觉得这是一种作弊行为

有什么想法吗?

问候 保罗

我不认为 DynamicParametersAdd 方法接受 SqlDbType 作为 dbType 参数。它应该是 DbType 而不是,因此您可以尝试更改以下内容:

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

到那个:

sqlParams.Add("@output_param", dbType: DbType.Int64, direction: ParameterDirection.Output);