26

很简单,我正在将我们现有的系统从 EF 转换为 Dapper。由于各种公司原因,我们无法真正更改数据库,一些表的列的类型为 DateTime2。Dapper 将任何 .net DateTime 转换为 DbType.DateTime。

之前一定有人遇到过这个问题并找到了一个简单的解决方案?

4

4 回答 4

55

现在在类似的问题中有一个更简单的解决方案:

SqlMapper.AddTypeMap(typeof(DateTime), System.Data.DbType.DateTime2);

这必须在's之前应用。 INSERT谢谢,@Igand。

于 2015-12-01T21:50:51.677 回答
10

Dapper 从字面上看是您包含在代码库中的单个文件。只需编辑文件:

替换(大约第 300 行):

        typeMap[typeof(Guid)] = DbType.Guid;
        typeMap[typeof(DateTime)] = DbType.DateTime;
        typeMap[typeof(DateTimeOffset)] = DbType.DateTimeOffset;
        typeMap[typeof(byte[])] = DbType.Binary;

和:

        typeMap[typeof(Guid)] = DbType.Guid;
        typeMap[typeof(DateTime)] = DbType.DateTime2;
        typeMap[typeof(DateTimeOffset)] = DbType.DateTimeOffset;
        typeMap[typeof(byte[])] = DbType.Binary;

编辑:
还有一个可以为空的 DateTime 在该映射块的下方,在第 319 行附近:

        typeMap[typeof(DateTime?)] = DbType.DateTime;
        typeMap[typeof(DateTimeOffset?)] = DbType.DateTimeOffset;

到:

        typeMap[typeof(DateTime?)] = DbType.DateTime2;
        typeMap[typeof(DateTimeOffset?)] = DbType.DateTimeOffset;
于 2012-06-27T17:22:48.403 回答
1

对于具有时区感知的日期和时间数据。

SqlMapper.AddTypeMap(typeof(DateTime), System.Data.DbType.DateTimeOffset);

我不知道为什么当我尝试使用 Datetime2 时,我仍然不断丢失毫秒。此 DateTimeOffset 类型也是 Datetime2。

日期值范围是从公元 1 月 1 日到 9999 年 12 月 31 日。时间值范围是 00:00:00 到 23:59:59.9999999,精度为 100 纳秒。时区值范围是 -14:00 到 +14:00。

于 2019-06-11T23:59:12.020 回答
0

提供的解决方案将全局映射类型,因为映射列表是静态的。

要为单个命令创建参数列表,更好的方法是使用DynamicParameters类。

var parameters = new DynamicParameters(template);
parameters.Add("@DateTimeParam", dateTimeValue, DbType.DateTime2);
    
await connection.ExecuteAsync(sql, parameters);

Wheretemplate可以是任何对象(包括之前使用的参数)。这些template属性将与添加的参数合并。

于 2021-09-06T14:30:57.677 回答