dapper.net을 사용하여 mysql LAST_INSERT_ID ()를 반환 할 때 잘못된 캐스트가 발생했습니다.

c# dapper mysql

문제

이 질문은 MSSQL에서 다룹니다.

Dapper를 사용하여 삽입을 수행하고 삽입 된 ID를 반환하려면 어떻게해야합니까?

그러나이 솔루션은 mysql에서 작동하지 않습니다.

mysql을 사용하여 LAST_INSERT_ID() 를 정수로 변환하려면 다음을 수행해야합니다.

SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);

스택 추적은 다음과 같습니다.

var id = connection.Query<ulong>("SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);").Single();

MySQL에서이 문제를 해결 한 사람이 있습니까?

편집하다:

나는이 작업을 다음과 같이 할 수 있었다.

var id = connection.Query<ulong>("SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);").Single();

아마도 이상적이지는 않지만 작동합니다.

수락 된 답변

이 문제를 검색 할 수있는 다른 모든 사람들의 답변으로 남겨 두겠습니다.

나는이 작업을 다음과 같이 할 수 있었다.

var id = connection.Query<ulong>("SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);").Single();

아마도 이상적이지는 않지만 작동합니다.


인기 답변

마지막으로 한 시간 동안 SELECT LAST_INSERT_ID() 쿼리가 MySQL 서버 하나에서 작동하지만 다른 서버에서는 작동하지 않는 이유에 대해 궁금해했습니다. 하나의 서버는 MySQL 5.5.11 (프로덕션)과 다른 5.5.31 (로컬 개발)을 실행 중입니다.

버전 5.1.67, 5.5.29 및 5.6.9 (각 해당 릴리스에서) 이전에는 LAST_INSERT_ID() 가 부호있는 정수를 반환하는 데 사용되었습니다.

이제 LAST_INSERT_ID() 는 5.5.31 서버에서 작동하는이 코드가 작동하는 서명되지 않은 BIGINT 를 반환합니다.

var id = cn.Query<ulong>("SELECT LAST_INSERT_ID();").First();

... 이전 5.5.11 서버에 대해 실행될 때 깨졌습니다.

여기에 문서화되어 있습니다 :

http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_last-insert-id

이 값은 MySQL 5.5.29부터 BIGINT (signed) 타입까지 BIGINT UNSIGNED 타입이 지정되어있다.

초기의 해결책은 LAST_INSERT_ID() 의 결과를 부호없는 BIGINT 로 캐스팅 LAST_INSERT_ID() 두 버전의 서버에서 코드를 이식 할 수있게하는 것이었지만 놀랍게도 MySQL 팀은로드 블록을 추가했습니다.

LAST_INSERT_ID() 는 지원되지 않기 때문에 CAST() 함수를 사용하여 부호없는 (서명 된) BIGINT 직접 캐스트 할 수 없습니다. 변환 할 수있는 유일한 정수 유형은 SIGNED INTEGERUNSIGNED INTEGER 입니다. 어떤 이유로 든 자동 증가 BIGINT ID가 42949672954294967295 하여 증가해야한다면 부호없는 정수는 형변환하기에 충분히 큰 유형이 아니기 때문에 이것은 고통입니다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.