使用SQL Server的Dapper输出bigint参数返回int32

3

我有以下C#代码和一个SQL Server存储过程。

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!
无法将类型为“System.Int32”的对象强制转换为类型“System.Int64”。

这是否可以预料到?我的其他存储过程返回与 BIGINT列相关的值,但实际返回值适合于Int32。然而,我不能事先确定实际返回值将是什么,并且一旦程序运行,这将发生变化。
我知道可以更改
var output = sqlParams.Get<long>("@output_param");

to

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

但我觉得这有点像作弊。

你有什么想法吗?

此致 Paul


尝试将以下代码更改为: var output = sqlParams.Get<Int64>("@output_param"); 而不是 var output = sqlParams.Get<long>("@output_param");请参考此链接了解SQL和C#之间的数据类型映射。 - Hemant Halwai
尝试将输入参数定义为BigInt类型:sqlParams.Add("@input_param", SqlDbType.BigInt, 1); - marc_s
1
@HemantHalwai,“long”只是“System.Int64”的语言特定别名。它们是完全相同的类型。 - Aluan Haddad
1个回答

3

我认为 DynamicParametersAdd 方法不接受 SqlDbType 作为 dbType 参数。这应该改成 DbType,所以你可以尝试更改以下内容:

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

转化为:

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

赶我一步 :) 但是没错,就是这样 ^^^ - Marc Gravell
尝试将其更改为sqlParams.Add("@output_param", DbType.Int64, direction: ParameterDirection.Output);和var output = sqlParams.Get<Int64>("@output_param"); 仍然是相同的结果。 - Paul Sjoerdsma
1
尝试通过指定名称来明确传递参数的位置。请参见https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/named-and-optional-arguments。很可能您在错误的位置传递了`DbType`。 - Jens
谢谢,使用命名参数解决了问题。一旦你看到它,就很容易了。 - Paul Sjoerdsma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接