c# – 在SQLite和Dapper中映射TimeSpan

前端之家收集整理的这篇文章主要介绍了c# – 在SQLite和Dapper中映射TimeSpan前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用Dapper与现有数据库格式进行交互,该数据库格式的表格的持续时间编码为BIGINT列中的刻度.在插入和读取数据库时,如何告诉Dapper将我的POCO的TimeSpan类型属性映射到滴答?

我试图将TimeSpan的类型映射设置为DbType.Int64:

  1. sqlMapper.AddTypeMap(typeof(TimeSpan),DbType.Int64);

我还创建了一个ITypeHandler,但从未调用过SetValue方法

  1. public class TimeSpanToTicksHandler : sqlMapper.TypeHandler<TimeSpan>
  2. {
  3. public override TimeSpan Parse(object value)
  4. {
  5. return new TimeSpan((long)value);
  6. }
  7.  
  8. public override void SetValue(IDbDataParameter parameter,TimeSpan value)
  9. {
  10. parameter.Value = value.Ticks;
  11. }
  12. }

这是我的POCO:

  1. public class Task
  2. {
  3. public TimeSpan Duration { get; set; }
  4.  
  5. // etc.
  6. }

执行这样的简单插入语句时:

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

并将POCO作为要插入的对象传递:

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

我得到这个例外:

  1. System.InvalidCastException : Unable to cast object of type 'System.TimeSpan' to type 'System.IConvertible'.
  2. at System.Convert.ToInt64(Objectvalue,IFormatProviderprovider)
  3. at System.Data.sqlite.sqliteStatement.BindParameter(Int32index,sqliteParameterparam)
  4. at System.Data.sqlite.sqliteStatement.BindParameters()
  5. at System.Data.sqlite.sqliteCommand.BuildNextCommand()
  6. at System.Data.sqlite.sqliteCommand.GetStatement(Int32index)
  7. at System.Data.sqlite.sqliteDataReader.NextResult()
  8. at System.Data.sqlite.sqliteDataReader..ctor(sqliteCommandcmd,CommandBehaviorbehave)
  9. at System.Data.sqlite.sqliteCommand.ExecuteReader(CommandBehaviorbehavior)
  10. at System.Data.sqlite.sqliteCommand.ExecuteNonQuery(CommandBehaviorbehavior)
  11. at System.Data.sqlite.sqliteCommand.ExecuteNonQuery()
  12. at Dapper.sqlMapper.ExecuteCommand(IDbConnectioncnn,refCommandDefinitioncommand,Action`2paramReader) in sqlMapper.cs: line 3310
  13. at Dapper.sqlMapper.ExecuteImpl(IDbConnectioncnn,refCommandDefinitioncommand) in sqlMapper.cs: line 1310
  14. at Dapper.sqlMapper.Execute(IDbConnectioncnn,Stringsql,Objectparam,IDbTransactiontransaction,Nullable`1commandTimeout,Nullable`1commandType) in sqlMapper.cs: line 1185

如果我按原样保留TimeSpan类型映射(默认为DbType.Time),它会写入TimeSpan的字符串版本,即“00:00:20.000”,这没有用,因为它与格式不匹配列中的其他数据.

解决方法

你可以做以下事吗?
  1. public class Task
  2. {
  3. public TimeSpan Duration { get; set; }
  4. public long Ticks
  5. {
  6. get { return Duration.Ticks; }
  7. set { Duration = new TimeSpan(value); }
  8. }
  9. // etc.
  10. }
  11.  
  12. string sql = "INSERT INTO Tasks (Duration) values (@Ticks);";

猜你在找的C#相关文章