2014-05-16 16 views
6

Tôi đang kiểm tra v1.25 của Dapper với Sqlite thông qua System.Data.Sqlite. Nếu tôi chạy truy vấn này:Chuyển đổi số nguyên Dapper và đi xuống

var rowCount = dbc.Query<int>("SELECT COUNT(*) AS RowCount FROM Data").Single(); 

tôi nhận được lỗi sau: System.InvalidCastException: Specified cast is not valid

Điều này là do Sqlite trả về giá trị trên như một Int64, mà tôi có thể xác minh với đoạn mã sau. Điều này sẽ ném "Int64":

var row = dbc.Query("SELECT COUNT(*) AS RowCount FROM Data").Single(); 
Type t = row.RowCount.GetType(); 
throw new System.Exception(t.FullName); 

Bây giờ, các mã sau đây thực sự sẽ xử lý việc chuyển đổi xuống từ Int64 để Int32:

public class QuerySummary 
{ 
    public int RecordCount { get; set; } 
} 
var qs = dbc.Query<QuerySummary>("SELECT COUNT(*) AS RecordCount FROM Data").Single(); 
rowCount = qs.RecordCount; 
throw new System.Exception(rowCount.ToString()); 

Khi tôi ném ngoại lệ này, nó mang lại cho tôi số lượng hàng thực tế , cho biết rằng Dapper đã xử lý chuyển đổi cho tôi.

Câu hỏi của tôi là, tại sao dbc.Query<int> không xử lý chuyển đổi xuống theo cách tương tự như dbc.Query<QuerySummary>? Hành vi này có dự định không?

Trả lời

4

Không, đó không phải là cố ý. Tôi đã cam kết và đẩy những thay đổi để github mà làm cho sau đây vượt qua (nó không thành công trên 1,25); nó sẽ xuất hiện trên NuGet tại một số điểm sớm:

// http://stackoverflow.com/q/23696254/23354 
    public void DownwardIntegerConversion() 
    { 
     const string sql = "select cast(42 as bigint) as Value"; 
     int i = connection.Query<HasInt32>(sql).Single().Value; 
     Assert.IsEqualTo(42, i); 

     i = connection.Query<int>(sql).Single(); 
     Assert.IsEqualTo(42, i); 
    } 
+0

Marc, cảm ơn rất nhiều vì đã giải quyết nhanh quá. Tôi đã kiểm tra NuGet nhưng có vẻ như nó chưa có sẵn. Tôi sẽ lấy nó ra khỏi Github sau ngày hôm nay nếu tôi có chút thời gian để kiểm tra nó. Ngoài ra, tôi vui mừng báo cáo rằng một vấn đề tôi đã chuyển đổi nullable Int64 để Int32 tồn tại trong 1,13 đã biến mất trong 1,25. Công cụ tuyệt vời. – John

+0

Chỉ cần một báo cáo nhanh chóng trở lại, tôi đã tải xuống bản dựng mới nhất từ ​​Github và thử nghiệm nó trong một vài tình huống mà tôi đã làm việc. Nó hoạt động hoàn hảo, không còn ngoại lệ nữa. Cảm ơn một lần nữa. – John

+0

@ John tốt để nghe, cảm ơn –

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