Dapperが "指定されたキャストは有効ではありません。" ReturnValueパラメータ値の場合

c# dapper stored-procedures

質問

DynamicParameterのReturnValueオプションを使用して、長い主キーを返すためにSCOPE_IDENTITYを使用しようとしています。

DapperのWebサイトのサンプルコードは次のとおりです。

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");

私のprocでは、私は "RETURN SCOPE_IDENTITY()"を使用しています。

ただし、これを行うと、「指定されたキャストは無効です」と表示されます。例外。

受け入れられた回答

ストアド・プロシージャからの戻り値は、常に暗黙的に整数、つまりintです。したがって、あなたは整数として扱うことができます。それをlongものとしてアンボックスしようとすると、失敗します。

オプション:

  • 値が収まる場合は、.NET側でintとして扱うだけです
  • それ以外の場合は、 bigint型のoutパラメータを使用し、.NET側でlong型として扱います
  • selectQuery<long>(...).Single()

人気のある回答

私が正しく覚えている場合、SCOPE_IDENTITY()は小数点( http://msdn.microsoft.com/en-us/library/ms190315.aspx )を返します。したがって、無効なキャスト例外が発生します。

それを必要に応じて動作させるには、bigint(SQL内)にキャストする必要があります。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow