带有SQL Server输出bigint参数的Dapper返回int32



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

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

你好,世界
无法将"System.Int32"类型的对象强制转换为"System.Int64"类型。

这是意料之中的事吗?我的其他存储过程返回的值绑定到BIGINT列,但实际返回的值将适合Int32。然而,我事先不能确定实际返回的值是多少,一旦程序运行,这一点就会改变。

我知道我可以更改

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

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

但是我觉得这是一种欺骗。

有什么想法吗?

问候Paul

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

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

到:

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

最新更新