2011-12-12 41 views
12

Câu hỏi này đã được bảo hiểm cho MSSQL ở đây:dàn diễn viên không hợp lệ khi trở về mysql LAST_INSERT_ID() sử dụng dapper.net

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

nhưng giải pháp này không làm việc với mysql.

Để cast LAST_INSERT_ID() để nguyên với mysql bạn phải làm điều này:

SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);

Các vết đống là:

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 

Có ai giải quyết vấn đề này trong MySQL?

EDIT:

tôi đã quản lý để thực hiện công việc này như sau:

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

Có lẽ không lý tưởng, nhưng nó hoạt động.

Trả lời

14

Tôi sẽ để đây ở đây làm câu trả lời cho bất kỳ ai khác có thể tìm kiếm về vấn đề này.

tôi đã quản lý để thực hiện công việc này như sau:

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

Có lẽ không lý tưởng, nhưng nó hoạt động.

+0

Đã xảy ra sự cố tương tự. Đối với một số lý do nó sẽ không cast vào một int bằng cách sử dụng Dapper. Bạn phải sử dụng dài hơn, hạ cấp nó xuống một int trong .net: (Không biết nếu nó là một lỗi với Connector, MySQL, hoặc Dapper. – Sam

+0

Chỉ cần có cùng một vấn đề và phát hiện ra rằng nó trả về ulong quá:) –

+1

Bạn có thể cast càng lâu thay vì ulong và sau đó int. Một điều kỳ lạ khác mà tôi thấy là bit (1) cột được chuyển thành UInt64 (ulong). Nghi ngờ của tôi là người lái xe. –

7

Tôi thực sự có thể làm sáng tỏ thêm điều này bởi vì tôi vừa dành giờ cuối cùng tự hỏi tại sao truy vấn SELECT LAST_INSERT_ID() của tôi hoạt động trên một máy chủ MySQL nhưng không hoạt động trên máy chủ khác. Một máy chủ đang chạy MySQL 5.5.11 (sản xuất) và 5.5.31 khác (dev địa phương).

Trước phiên bản 5.1.67, 5.5.29 và 5.6.9 (trong mỗi bản phát hành tương ứng) LAST_INSERT_ID() được sử dụng để trả lại số nguyên đã ký.

Bây giờ LAST_INSERT_ID() trả về một unsigned BIGINT điều này có nghĩa mã này mà làm việc trên máy chủ 5.5.31 tôi làm việc:

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

... nhưng bị hỏng khi thực hiện chống lại 5.5.11 máy chủ cũ.

Nó ghi nhận ở đây:

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

Giá trị có một loại BIGINT UNSIGNED như của MySQL 5.5.29, BIGINT (đã ký) trước đó.

giải pháp ban đầu của tôi là đúc kết quả của LAST_INSERT_ID() đến một unsigned BIGINT để làm cho di động mã trên cả hai phiên bản máy chủ nhưng (bất ngờ, ngạc nhiên) đội MySQL thêm một khoanh vùng.

Bạn không thể bỏ trực tiếp LAST_INSERT_ID() trực tiếp vào một dấu (hoặc thậm chí đã ký) BIGINT bằng cách sử dụng CAST() function vì nó không được hỗ trợ. Các loại số nguyên duy nhất bạn có thể truyền tới là SIGNED INTEGERUNSIGNED INTEGER. Đây là một nỗi đau vì nếu vì lý do gì bạn thực sự cần một số tự động tăng thêm BIGINT id tăng dần qua 4294967295 thì một số nguyên không dấu sẽ không phải là một loại đủ lớn để truyền tới.

1

Sử dụng số Convert.ToInt64(value) giải quyết nó cho tôi.

Các vấn đề liên quan