Dapper가 "지정된 캐스트가 유효하지 않습니다." ReturnValue 매개 변수 값의 경우

c# dapper stored-procedures

문제

DynamicParameter의 ReturnValue 옵션을 사용하여 C #으로 긴 기본 키를 반환하려면 SCOPE_IDENTITY를 사용하려고합니다.

다음은 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");

내 proc에서는 "RETURN SCOPE_IDENTITY ()"를 사용하고 있습니다.

그러나 이렇게하면 "지정된 캐스트가 유효하지 않습니다."라는 결과가 발생합니다. 예외.

수락 된 답변

저장 프로 시저의 반환 값은 항상 암시 적으로 정수, 즉 int 입니다. 따라서, 당신은 단지 정수로 취급 할 수 있습니다. 당신이 long 그것을 unbox하려고하면, 그것은 실패 할 것이다.

옵션 :

  • 값이 맞으면 .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