【发布时间】:2020-11-27 14:18:17
【问题描述】:
我有以下 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");
但是我觉得这是一种作弊。
有什么想法吗?
问候 保罗
【问题讨论】:
-
尝试将
var output = sqlParams.Get<long>("@output_param");更改为var output = sqlParams.Get<Int64>("@output_param");请参阅 [此链接] (docs.microsoft.com/en-us/dotnet/framework/data/adonet/…) 以了解 SQL 和 C# 之间的数据类型映射 -
尝试将输入参数定义为
BigInt类型:sqlParams.Add("@input_param", SqlDbType.BigInt, 1); -
@HemantHalwai,
long只是System.Int64的特定语言别名。它们是完全相同的类型。
标签: c# sql-server dapper sqldatatypes output-parameter