2011-12-12 7 views
12

Questa domanda è stata coperta per MSSQL qui:fusione non valido al ritorno mysql LAST_INSERT_ID() utilizzando dapper.net

How do I perform an insert and return inserted identity with Dapper?

ma questa soluzione non funziona con mysql.

per lanciare l'LAST_INSERT_ID() per intero con mysql che devi fare questo:

SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);

L'analisi 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?

EDIT:

sono riuscito a fare questo lavoro con il seguente:

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

Forse non è l'ideale, ma funziona.

risposta

14

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

sono riuscito a fare questo lavoro con il seguente:

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

Forse non è l'ideale, ma funziona.

+0

Aveva lo stesso problema. Per qualche motivo non trasmetterà a un int usando Dapper. Devi usare molto, piuttosto che eseguirne il downgrade a un interno in .net :(Non so se si tratta di un bug con Connector, MySQL o Dapper. – Sam

+0

Ho appena ricevuto lo stesso problema e ho scoperto che è tornato molto a lungo:) –

+1

È possibile eseguire il cast così a lungo anziché ulong e poi int. Un'altra stranezza che ho trovato è che le colonne bit (1) vengono passate come UInt64 (ulong). Il mio sospetto è l'autista. –

7

Posso davvero fare un po 'di luce su questo perché ho appena passato l'ultima ora a chiedermi perché la mia query SELECT LAST_INSERT_ID() ha 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 ogni rispettiva versione) LAST_INSERT_ID() utilizzato per restituire un numero intero con segno.

Ora LAST_INSERT_ID() restituisce un unsigned BIGINT che significava questo codice che ha lavorato sul mio server 5.5.31 lavorato:

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

... ma è rotto quando eseguito sul server più vecchio 5.5.11.

E '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 a partire da MySQL 5.5.29, BIGINT (firmato) prima.

La mia soluzione iniziale era quello di lanciare il risultato di LAST_INSERT_ID() a un unsigned BIGINT per rendere il codice portabile su entrambe le versioni server, ma (sorpresa, sorpresa) il team di MySQL ha aggiunto un posto di blocco.

Non è possibile trasmettere LAST_INSERT_ID() direttamente a un BIGINT senza segno (o firmato) utilizzando CAST() function 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 motivo hai davvero bisogno di un ID auto incrementale BIGINT che passi oltre 4294967295 allora un intero senza segno non sarà un tipo abbastanza grande per il cast.

1

L'utilizzo di Convert.ToInt64(value) ha risolto per me.

Problemi correlati