Trasmissione non valida quando si restituisce mysql LAST_INSERT_ID () utilizzando dapper.net

c# dapper mysql

Domanda

Questa domanda è stata trattata per MSSQL qui:

Come si esegue un inserimento e si restituisce l'identità inserita con Dapper?

ma questa soluzione non funziona con mysql.

Per LAST_INSERT_ID() in intero con mysql devi fare questo:

SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);

La traccia dello stack è:

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

Qualcuno ha risolto questo problema in MySQL?

MODIFICARE:

Sono riuscito a farlo funzionare con il seguente:

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

Forse non è l'ideale, ma funziona.

Risposta accettata

Lascerò questo qui come risposta per chiunque altro possa cercare su questo problema.

Sono riuscito a farlo funzionare con il seguente:

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

Forse non è l'ideale, ma funziona.


Risposta popolare

Posso in realtà fare luce su questo perché ho passato l'ultima ora a chiedermi perché la mia query SELECT LAST_INSERT_ID() funzionato su un server MySQL ma non su un altro. Un server esegue MySQL 5.5.11 (produzione) e l'altro 5.5.31 (dev locale).

Prima delle versioni 5.1.67, 5.5.29 e 5.6.9 (in ciascuna rispettiva versione) LAST_INSERT_ID() utilizzato per restituire un intero con segno.

Ora LAST_INSERT_ID() restituisce un BIGINT non firmato, il che significa che il codice che ha funzionato sul mio server 5.5.31 ha funzionato:

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

... ma è rotto quando viene eseguito contro il precedente server 5.5.11.

È documentato qui:

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

Il valore ha un tipo di BIGINT UNSIGNED partire da MySQL 5.5.29, BIGINT (firmato) prima.

La mia soluzione iniziale era di trasmettere il risultato di LAST_INSERT_ID() a un BIGINT non firmato per rendere il codice portatile su entrambe le versioni di questi server ma (sorpresa, sorpresa) il team di MySQL ha aggiunto un roadblock.

Non puoi LAST_INSERT_ID() direttamente a un BIGINT senza segno (o addirittura firmato) utilizzando la funzione CAST() perché non è supportato. Gli unici tipi interi su cui è possibile eseguire il cast sono SIGNED INTEGER e UNSIGNED INTEGER . Questo è un problema perché se per qualsiasi ragione hai davvero bisogno di un ID BIGINT autoincremento che passi oltre 4294967295 allora un intero senza segno non sarà un tipo abbastanza grande per il cast.




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché