5

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

以下是来自 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()”。

但是,这样做似乎会导致“指定的演员表无效”。例外。

4

2 回答 2

6

存储过程的返回值总是隐含的整数,即int. 因此,您只能将其视为整数。如果您尝试将其拆箱为long,它将失败。

选项:

  • 如果该值适合,只需将其视为int.NET 端
  • 否则使用outtype 的参数bigint,并将其视为long.NET 端
  • 或使用selectQuery<long>(...).Single()
于 2013-06-20T18:34:38.593 回答
2

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

您需要将其转换为 bigint(在 SQL 中),以便它按您的意愿工作。

于 2013-06-19T17:12:12.543 回答