Как заставить Dapper игнорировать неверные данные? - PullRequest
3 голосов
/ 10 июля 2019

Я использую Dapper для загрузки значения int?.Значение int? хранится в столбце VARCHAR в базе данных SQL Server (я не могу изменить это).Иногда столбец содержит недопустимые данные, которые содержат буквенные символы.

Когда это происходит, я вижу эту ошибку:

Error parsing column 5 (Foo=ABC123 - String) ---> System.FormatException: Input string was not in a correct format.

Как заставить Dapper игнорировать недопустимые значения ииспользовать вместо этого ноль?

Ответы [ 3 ]

4 голосов
/ 10 июля 2019

Вы можете изменить свой SQL для анализа и возврата значения соответствующим образом на самом SQL Server.Таким образом, в вашем коде вызова не будет никаких изменений.

Я бы сделал что-то вроде:

select case when isnumeric(foo) = 1 then foo else null end foo from table;
2 голосов
/ 11 июля 2019

Принято ответ (от @DanB) - хорошо, но его можно улучшить.

Если вы используете современную версию SQL Server (2012 или более позднюю версию), рассмотрите возможность использования TRY_CAST вместо ISNUMERIC. ISNUMERIC ведет себя так, как вы не ожидаете. Пожалуйста, обратитесь к этому вопросу.

2 голосов
/ 10 июля 2019

Dapper - простой картограф;это не делает этот тип преобразования данных для вас.Вы должны сделать трюк.

Единственный (плохой) вариант, который я вижу, это включить свойство string в ваш класс и сопоставить его с этим свойством вместо вашего int? свойства.Затем сопоставьте int? свойство с string свойством с некоторым обработкой кода между ними.

public class MyTable
{
    public string MyColumn {get;set;}//Map dapper to this property
    public int? MyColumnInt //<-- Do NOT map this to dapper. Do not implement setter
    {
        get
        {
            int temp;
            if(int.TryParse(MyColumn, out temp) == true)
                return temp;
            else
                return null;
        }
    }
}
...