Подтвердить что ты не робот

Недопустимый приведение при возврате mysql LAST_INSERT_ID() с помощью dapper.net

Этот вопрос был рассмотрен здесь для MSSQL:

Как выполнить вставку и возврат вставленного идентификатора с помощью Dapper?

но это решение не работает с mysql.

Чтобы придать LAST_INSERT_ID() целому числу с mysql, вы должны сделать это:

SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);

Трассировка стека:

Dapper.<QueryInternal>d__13`1.MoveNext() in sqlMapper.cs:607
   System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +159
   System.Linq.Enumerable.ToList(IEnumerable`1 source) +36
   Dapper.SqlMapper.Query(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in sqlMapper.cs:535

Кто-нибудь разрешил эту проблему в MySQL?

EDIT:

Мне удалось сделать эту работу следующим образом:

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

Возможно, не идеальный, но он работает.

4b9b3361

Ответ 1

Я оставлю это здесь как ответ для всех, кто может найти эту проблему.

Мне удалось сделать эту работу следующим образом:

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

Возможно, не идеальный, но он работает.

Ответ 2

Я могу на самом деле пролить некоторый дополнительный свет на это, потому что я просто потратил последний час, задаваясь вопросом, почему мой запрос SELECT LAST_INSERT_ID() работал на одном сервере MySQL, но не в другом. На одном сервере работает MySQL 5.5.11 (production), а другой 5.5.31 (локальный dev).

До версий 5.1.67, 5.5.29 и 5.6.9 (в каждом соответствующем выпуске) LAST_INSERT_ID() используется для возврата целого числа со знаком.

Теперь LAST_INSERT_ID() возвращает unsigned BIGINT, что означает, что этот код, который работал на моем сервере 5.5.31, работал:

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

Перед этим значение имеет тип BIGINT UNSIGNED от MySQL 5.5.29, BIGINT (подписанный).

Моим первоначальным решением было отправить результат LAST_INSERT_ID() на unsigned BIGINT, чтобы сделать код переносимым на обеих этих версиях сервера, но (неожиданно, неожиданно) команда MySQL добавила дорожный блок.

Вы не можете использовать LAST_INSERT_ID() непосредственно для неподписанного (или даже подписанного) BIGINT с помощью функции CAST(), поскольку она не поддерживается. Единственными целыми типами, которые вы можете использовать, являются SIGNED INTEGER и UNSIGNED INTEGER. Это боль, потому что если по какой-либо причине вам действительно нужен автоматический инкрементирующий BIGINT id, который увеличивает прошлое 4294967295, то целое число без знака не будет достаточно большим типом, чтобы его отличить.

Ответ 3

Использование Convert.ToInt64(value) решило его для меня.