Дампер выбрасывает недопустимое исключение приведения при использовании строго типизированных параметров запроса с Sybase ASE - PullRequest
2 голосов
/ 08 марта 2012

Как гласит заголовок вопроса, я получаю Specified cast is not valid исключения, даже если мой сохраненный процесс возвращает int и DateTime, и мой класс определяет его одинаково.

public class Foo
{
    public int Id {get; set;}
    public DateTime CreatedDate {get; set;}
}

Когда я выполняю этот запрос:

var results = connection.Query ("spGetFoo", commandType: CommandType.StoredProcedure);

Я получаю следующие 2 исключения:

InvalidCastException: Specified cast is not valid.
DataException: Error parsing column 1 (Id=1 - Decimal)

InvalidCastException: Specified cast is not valid.
DataException: Error parsing column 2 (CreatedDate=Mar  7 2012  5:52:08:276PM - String)

Если я изменю свойства Foo с int на decimal и DateTime на string, он правильно заполнит значения. Но это вводит дополнительный шаг определения другого класса, который содержит правильные типы переменных, а затем сопоставления с Foo на новый класс.

Я также пытался просмотреть GetTypeDeserializer в источнике Dapper, чтобы увидеть, что происходит, но я не очень знаком с IL-излучением.

1 Ответ

1 голос
/ 16 марта 2012

возможно проблема в хранимой процедуре, но пока вы можете использовать

public class Foo
{
    private decimal _dbId;
    public decimal DbId 
    { 
        get { return _dbId; }
        set 
        { 
            _dbId = value;
            _id =(int)value;
        }
    }
    private String _dbCreadtedDate;
    public String DbCreadtedDate 
    { 
        get { return _dbCreadtedDate; }
        set 
        {
            _dbCreadtedDate = value;
            _createdDate = DateTime.Parse(_dbCreadtedDate);
        }
    }
    private int _id;
    public int Id 
    { 
        get { return _id; } 
        set { _id = value; _dbId = value; } 
    }
    private DateTime _createdDate;
    public DateTime CreatedDate 
    { 
        get { return _createdDate; } 
        set { _createdDate = value; _dbCreadtedDate = value.ToString(); } 
    }
}
...