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

c# dapper mysql

Вопрос

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

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

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

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

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

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




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему