【问题标题】:Dapper with SQL Server output bigint parameter returns int32Dapper 与 SQL Server 输出 bigint 参数返回 int32
【发布时间】: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&lt;long&gt;("@output_param"); 更改为 var output = sqlParams.Get&lt;Int64&gt;("@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


【解决方案1】:

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

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

到那个:

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

【讨论】:

  • 打败了我 :) 但是是的,这个 ^^^
  • 尝试将其更改为 sqlParams.Add("@output_param", DbType.Int64, direction: ParameterDirection.Output);和 var output = sqlParams.Get("@output_param");结果还是一样
  • 尝试通过指定名称来明确传递参数的位置。见docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…。很可能您在错误的位置通过了DbType
  • 谢谢,使用命名参数成功了。一旦你看到它,就很容易了。。
猜你喜欢
  • 2016-12-14
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
  • 2012-06-28
  • 2022-12-13
  • 2013-07-24
  • 1970-01-01
  • 2011-03-28
相关资源
最近更新 更多