从数据库查询日期时间字段时,我可以控制日期时间类型吗?

Mr.*_*Boy 7 c# sql-server datetime dapper

当我从涉及字段的 C# 查询 SqlServer 数据库时DateTime,返回的System.DateTime结果Kind==Unspecified并不奇怪,因为 SqlServerDateTime类型不保留时区信息。

我想知道是否有一种方法可以自动将这些值读取为本地或通用值,而不是在读取查询结果后手动转换它们,这会在丢失字段时引入更多错误的可能性。

典型的代码如下所示:

    using (var conn = ...)
    using (var command = ...)
    {
        conn.Open();
        var reader = command.ExecuteReader();
        while (reader.Read())
        {
          DateTime dateField =  (DateTime)reader["date"];
          //dateField.Kind == Unspecified
        }
    }
Run Code Online (Sandbox Code Playgroud)

Igo*_*gor 4

DateTime dateField = DateTime.SpecifyKind((DateTime)reader["date"], DateTimeKind.Utc);
Run Code Online (Sandbox Code Playgroud)

由于它没有持久保存在数据库中,因此您必须在自己的代码中检索时指定它,尽管您可以创建扩展方法,但 DataReader 中没有快捷方法。

public static class Helper{
    public static DateTime GetDateTimeAsUtc(this IDataReader reader, string column){
        return DateTime.SpecifyKind((DateTime)reader[column], DateTimeKind.Utc);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后调用它

DateTime dateField = reader.GetDateTimeAsUtc("date");
Run Code Online (Sandbox Code Playgroud)