2014-07-07 13 views
5

Tôi đang cố gắng sử dụng Dapper lần đầu tiên, nhưng tôi đã ngay lập tức gặp sự cố ở chỗ Dường như Dapper không thể xử lý các trường không thể thực hiện được. Điều này làm tôi ngạc nhiên vì chúng cực kỳ phổ biến.Có thể Dapper xử lý các trường boolean/bit vô hiệu không? [INVALID]

Nếu tôi có một lĩnh vực boolean nullable trong cơ sở dữ liệu SQL Server của tôi và cố gắng và sử dụng Dapper để cư thuộc tính boolean nullable trên lớp C# của tôi, một ngoại lệ được ném nếu trường boolean chứa một giá trị null:

System.FormatException: String was not recognized as a valid Boolean. 

Có bất kỳ sửa chữa hoặc giải pháp nào cho việc này không? Tôi cảm thấy khó tin rằng Dapper không thể xử lý được điều này vì có vẻ như nó đã tồn tại một thời gian và đây là một chức năng cực kỳ cơ bản.

EDIT: Đây là lỗi của tôi! Cột của tôi đã thực sự là một nvarchar đã xảy ra để chứa 0 hoặc 1, và như vậy, tôi đã không nhận thấy. Thay đổi nó thành BIT (hoặc thuộc tính C# thành "string?") Sửa lỗi.

+0

Bạn có thể đăng định nghĩa bảng và mã Dapper của bạn có ném ngoại lệ không? –

+3

Thực tế là nó đề cập đến 'chuỗi' cho tôi biết vấn đề có thể là dữ liệu/truy vấn của bạn ... cột ở đây là gì? –

+0

Cột này thực sự là kết quả của một LEFT JOIN và hiển thị dưới dạng một giá trị DB trong SSIS. Có lẽ điều này không được công nhận là bool bởi Dapper? – NickG

Trả lời

7

Yep, làm việc tốt:

public void SO24607639_NullableBools() 
{ 
    var obj = connection.Query<HazBools>(
     @"declare @vals table (A bit null, B bit null, C bit null); 
     insert @vals (A,B,C) values (1,0,null); 
     select * from @vals").Single(); 
    obj.IsNotNull(); 
    obj.A.Value.IsEqualTo(true); 
    obj.B.Value.IsEqualTo(false); 
    obj.C.IsNull(); 
} 
class HazBools 
{ 
    public bool? A { get; set; } 
    public bool? B { get; set; } 
    public bool? C { get; set; } 
} 
+1

Bạn nói đúng. Tôi là một thằng ngốc. Cột của tôi đã được ánh xạ tới một NVARCHAR và tôi bằng cách nào đó đã không nhận thấy như trước đây của tôi (non-dapper) mã xử lý này OK bằng cách nào đó ... Tôi có lẽ nên xóa câu hỏi này? – NickG

+0

@NickG hoàn toàn tùy thuộc vào bạn –

+0

Tôi sẽ để nó ở đây trong trường hợp bất cứ ai khác làm cho cùng một ngu ngốc sai lầm :) – NickG

0

Kể từ Dapper không làm quá nhiều ống nước, recordset đến từ các cơ sở dữ liệu chứa một chuỗi, một tuyên bố của các lỗi. Hãy thử kiểm tra loại cột và khi rõ ràng, bạn có thể thay đổi lớp DTO tương ứng hoặc truyền theo một cách nào đó trong truy vấn.

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