2013-06-19 27 views
5

için DynamicParameter için ReturnValue seçeneğini kullanarak uzun bir birincil anahtarı geri döndürmek için SCOPE_IDENTITY kullanmaya çalışıyorum.Dapper "Belirtilen döküm geçerli değil." ReturnValue parametre değeri

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

yerine int döndürmek, benim proc olarak

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 edilmelidir benim birincil anahtar alanı olarak aşağıdakileri yapmayı tercih ediyorum: Burada

Zarif web sitesinden örnek kod "RETURN SCOPE_IDENTITY()" kullanıyorum.

Ancak bunun yapılması, "Belirtilen döküm geçerli değil" şeklinde görünüyor. istisna.

+0

: Bu dapper.rainbow nedir? Ayrıca: alanın "bigint" olduğunu söylüyorsunuz - muhtemelen şimdi .net tarafını ele alıyorsunuz. Burada "BigInteger" mi demek istiyorsun? Yoksa Int64 aka 'long' mu demek istiyorsun? SQL server'ın bigint haritaları ile "long" in C# –

+0

Dapper micro-orm (Extensions). Bigint'e başvurduğumda, kaydettiğim tablonun birincil anahtar alanı hakkında konuşuyorum. Ben uzun zamandır başvurduğumda .net değişkenini yazmaya çalışıyorum. – user1790300

cevap

6

Kayıtlı bir yordan gelen dönüş değeri her zaman dolaylı olarak tamsayıdır, yani int. Bu nedenle, 'u yalnızca bir tam sayı olarak olarak kabul edebilirsiniz. Bu kutuyu long olarak kaldırmayı denerseniz, başarısız olur.

Seçenekler:

  • değeri uyacak olmadığını, sadece .NET tarafında int olarak muamele
  • aksi tip bigint bir out parametresini kullanın ve .NET tarafında long olarak muamele Eğer açıklamak Can
  • veya kullanım select ve Query<long>(...).Single()
2

Doğru hatırlıyorsam SCOPE_IDENTITY() bir ondalık (http://msdn.microsoft.com/en-us/library/ms190315.aspx) döndürür, bu nedenle geçersiz döküm özel durumu.

İstediğiniz gibi çalışması için bigint'e (SQL'de) göndermeniz gerekir.

+0

Veya bu durumda bir "bigint", OP kullandığı için ' –

+0

bu RETURN CAST (SCOPE_IDENTITY() AS bigint) çalıştı ve hala başarısız oluyor. – user1790300

+0

@Vivek denedim mi? – Kiquenet

İlgili konular