SQLite 및 Dapper의 TimeSpan 매핑

c# dapper orm sqlite system.data.sqlite

문제

Dapper를 사용하여 BIGINT 열의 틱으로 인코딩 된 기간이있는 테이블이있는 기존 데이터베이스 형식의 인터페이스에 연결하려고합니다. 데이터베이스에 삽입하고 데이터베이스에서 읽을 때 POCO의 TimeSpan 유형의 속성을 틱으로 매핑하도록 Dapper에 지시하려면 어떻게합니까?

DbType.Int64 위해 TimeSpan 에 대한 형식 맵을 설정하려면 DbType.Int64 :

SqlMapper.AddTypeMap(typeof(TimeSpan), DbType.Int64);

또한 ITypeHandler 도 만들었지 만 SetValue 메서드는 호출되지 않습니다.

public class TimeSpanToTicksHandler : SqlMapper.TypeHandler<TimeSpan>
{
    public override TimeSpan Parse(object value)
    {
        return new TimeSpan((long)value);
    }

    public override void SetValue(IDbDataParameter parameter, TimeSpan value)
    {
        parameter.Value = value.Ticks;
    }
}

내 POCO는 다음과 같습니다.

public class Task
{
    public TimeSpan Duration { get; set; }

    // etc.
}

다음과 같이 간단한 insert 문을 실행할 때 :

string sql = "INSERT INTO Tasks (Duration) values (@Duration);";

그리고 POCO를 삽입 할 객체로 전달합니다.

Task task = new Task { Duration = TimeSpan.FromSeconds(20) };
connection.Execute(sql, task);

나는이 예외를 얻는다 :

System.InvalidCastException : Unable to cast object of type 'System.TimeSpan' to type 'System.IConvertible'.
   at System.Convert.ToInt64(Object value, IFormatProvider provider)
   at System.Data.SQLite.SQLiteStatement.BindParameter(Int32 index, SQLiteParameter param)
   at System.Data.SQLite.SQLiteStatement.BindParameters()
   at System.Data.SQLite.SQLiteCommand.BuildNextCommand()
   at System.Data.SQLite.SQLiteCommand.GetStatement(Int32 index)
   at System.Data.SQLite.SQLiteDataReader.NextResult()
   at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
   at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(CommandBehavior behavior)
   at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()
   at Dapper.SqlMapper.ExecuteCommand(IDbConnection cnn, ref CommandDefinition command, Action`2 paramReader) in SqlMapper.cs: line 3310
   at Dapper.SqlMapper.ExecuteImpl(IDbConnection cnn, ref CommandDefinition command) in SqlMapper.cs: line 1310
   at Dapper.SqlMapper.Execute(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Nullable`1 commandTimeout, Nullable`1 commandType) in SqlMapper.cs: line 1185

있는 그대로 TimeSpan 형식 매핑을 그대로두면 (기본값은 DbType.Time ) TimeSpan 의 문자열 버전 인 '00 : 00 : 20.000'이 작성됩니다.이 형식은 다음과 같은 형식과 일치하지 않으므로 유용하지 않습니다. 다른 데이터는 열에 있습니다.

인기 답변

대신 다음을 수행 할 수 있습니까?

public class Task
{
    public TimeSpan Duration { get; set; }
    public long Ticks 
    { 
        get { return Duration.Ticks; }
        set { Duration = new TimeSpan(value); }
    }
    // etc.
}

string sql = "INSERT INTO Tasks (Duration) values (@Ticks);";


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow