2013-06-19 25 views
5

DynamicParameterのReturnValueオプションを使用して、長い主キーをC#に戻すためにSCOPE_IDENTITYを使用しようとしています。ここでDapperが「指定されたキャストは無効です。」 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型を返すので、私は私の主キーフィールドとして次のことを行うことを好む私のPROCで

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

をBIGINTする必要があります私は "RETURN SCOPE_IDENTITY()"を使用しています。

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

+0

:このdapper.rainbowはありますか?また、あなたはフィールドが "bigint"だと言います - おそらく今は.net側を取っています。ここでは、BigIntegerを意味しますか?それともInt64という言葉が長いのですか? SQLサーバーのbigintは、C# –

+0

のDapperマイクロオーミック(拡張)で「long」にマップされます。私がbigintを参照するとき、私は保存しているテーブルの主キーフィールドについて話しています。私が長い間参照しているのは、.net変数です。書きたいと思っています。 – user1790300

答えて

6

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

オプション:

  • 値が収まる場合は、単に.NET側でintとして扱い
  • そうでないタイプbigintoutパラメータを使用して、.NET側でlongとして扱いますあなたは明確にすることができ
  • または使用selectQuery<long>(...).Single()
2

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

bigint(SQL内)にキャストして、必要に応じて機能させる必要があります。

+0

OPが '' –

+0

を使用してこのRETURN CAST(SCOPE_IDENTITY()AS bigint)を試していて、まだ失敗しているので、この場合はおそらく 'bigint'です。 – user1790300

+0

@Vivek試しましたか? – Kiquenet

関連する問題