Dapper得到“指定的演员阵容无效”。 for ReturnValue参数值

时间:2013-06-19 16:55:17

标签: c# stored-procedures dapper

我正在尝试使用SCOPE_IDENTITY将长主键返回给c#,使用DynamicParameter的ReturnValue选项。

以下是Dapper网站的示例代码:

var p = new DynamicParameters();
p.Add("@a", 11);
p.Add("@b", dbType: DbType.Int32, direction: ParameterDirection.Output);
p.Add("@c", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);

cnn.Execute("spMagicProc", p, commandType: commandType.StoredProcedure); 

int b = p.Get<int>("@b");
int c = p.Get<int>("@c");

我更愿意执行以下操作,而不是返回int,因为我的主键字段应该是bigint

var p = new DynamicParameters();
p.Add("@a", 11);
p.Add("@b", dbType: DbType.Int32, direction: ParameterDirection.Output);
p.Add("@c", dbType: DbType.Int64, direction: ParameterDirection.ReturnValue);

cnn.Execute("spMagicProc", p, commandType: commandType.StoredProcedure); 

int b = p.Get<int>("@b");
int c = p.Get<long>("@c");

在我的过程中,我正在使用“RETURN SCOPE_IDENTITY()”。

然而,这样做似乎导致“指定演员表无效”。异常。

2 个答案:

答案 0 :(得分:6)

存储过程的返回值总是隐式为整数,即int。因此,您只能将视为整数。如果您尝试将其展开为long,则会失败。

选项:

  • 如果值适合,只需将其视为.NET端的int
  • 否则使用out类型的bigint参数,并在.NET端将其视为long
  • 或使用selectQuery<long>(...).Single()

答案 1 :(得分:2)

如果我没记错的话,SCOPE_IDENTITY()会返回一个小数(http://msdn.microsoft.com/en-us/library/ms190315.aspx),因此会产生无效的强制转换异常。

您需要将其强制转换为bigint(在SQL中)才能使其按您的需要工作。