Неверное приведение при возврате mysql LAST_INSERT_ID () с использованием dapper.net - PullRequest
13 голосов
/ 12 декабря 2011

Этот вопрос был рассмотрен для 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();

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

Ответы [ 3 ]

16 голосов
/ 13 декабря 2011

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

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

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

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

8 голосов
/ 23 января 2014

Я действительно могу пролить некоторый дополнительный свет на это, потому что я провел последний час, размышляя, почему мой запрос 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() возвращает 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() к беззнаковому BIGINT, чтобы сделать код переносимым между обоимиэти версии сервера, но (сюрприз, сюрприз) команда MySQL добавила контрольно-пропускной пункт.

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

1 голос
/ 19 июня 2014

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

...