Microsoft SQL Server 数据库/Visual Studio C#:日期处理

Posted

技术标签:

【中文标题】Microsoft SQL Server 数据库/Visual Studio C#:日期处理【英文标题】:Microsoft SQL Server database / Visual Studio C# : date handling 【发布时间】:2021-02-06 20:26:42 【问题描述】:

我正在尝试找出从数据库中获取日期并将其正确解析/转换到我的 DAL (DataAccessLayer) 方法中的最快和最方便的方法。

我数据库中的列是数据类型date

特别是我有这个Order 类:

public int Id  get; set; 
public DateTime OrderDate  get; set;   
public DateTime ConfirmedDeliveryDate  get; set;   
public DateTime ShippingDate  get; set; 
public Supplier Supplier  get; set; 
public List<Product> ListOfProducts  get; set;  = new List<Product>();

当然,我还有一个 DAL 方法,比如说,从数据库中获取订单列表。

List<Order> GetAll()

  ... ... ...
  ... ... ...
  SqlDataReader rdr = cmd.ExecuteReader()

  while(rdr.Read())
  
    int orderId = (int)rdr["id"];
    DateTime orderDate = ???                 // HOW TO IMPLEMENT?
    DateTime? confirmedDeliveryDate = ???    // HOW TO IMPLEMENT?
    DateTime? shippingDate = ???             // HOW TO IMPLEMENT?
    ... ...
    ... ...

  
  ... ... ...

注意:在我的网站上,我只需要上述日期的YEARMONTHDAY。不确定这是否对您有帮助,可能没有,但只是想说。

【问题讨论】:

最快的方法是使用Dapper或类似的微ORM。 您的类没有任何可为空的 DateTime 类型,因此您的读取路由或类不正确。日期字段应映射到 DateTime 实例,其中时间部分中的所有内容都为零。 @insane_developer 我可以在类中添加这些问号,以便它们可以为空。或者只是从我的 DAL GetAll() 方法中删除它们。但除此之外,我不确定如何从数据库中获取 date 类型并将其解析为 VS C# DateTime 【参考方案1】:

sql 中的 date 列映射到 c# 中的 DateTime。不需要做任何特殊的解析。假设您使用SqlDataReader,只需使用SqlDataReader.GetDateTime,或者如果您不知道列序号,请使用indexer and pass it the column name,然后将结果转换为DateTime,就像您使用@987654332一样@专栏。

DateTime orderedDate = (DateTime)rdr["orderedDate"];
// or
DateTime orderdDate = rdr.GetDateTime(/*column ordinal*/)

如果数据库中的date 列可以为空,那么您需要通过使DateTime 对象可以为空(DateTime?)并在从@987654337 读取结果时检查是否为空来在您的代码中说明这一点@。

List<Order> GetAll()

    SqlDataReader rdr = cmd.ExecuteReader()
    while(rdr.Read())
    
        int orderId = (int)rdr["id"];
        DateTime? orderedDate = null;
        if (rdr["orderedDate"] != DBNull.Value)
        
            orderedDate = (DateTime)rdr["orderedDate"];
        
    

如果你愿意,你可以把它放到SqlDataReader 的扩展方法中......

public static class SqlDataReaderExtensions

    public static DateTime? GetNullableDateTime(this SqlDataReader rdr, string columnName)
    
        if (rdr[columnName] != DBNull.Value)
        
            return (DateTime)rdr[columnName];
        
        return null;
    


List<Order> GetAll()

    SqlDataReader rdr = cmd.ExecuteReader()
    while(rdr.Read())
    
        int orderId = (int)rdr["id"];
        DateTime? orderedDate = rdr.GetNullableDateTime("ordredDate");
    

如果您的视图只需要显示年、月和日,那么您可以通过多种方式来实现。例如,DateTime.ToShortDateStringDateTime.ToString(string)

【讨论】:

以上是关于Microsoft SQL Server 数据库/Visual Studio C#:日期处理的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft SQL Server,错误: 3702

Microsoft SQL Server,错误: 3702

Microsoft SQL Server,错误: 3702

Microsoft SQL Server 数据库

Microsoft SQL Server(sql server 关系型数据库管理系统)

Microsoft 替换 SQL Server CE