【问题标题】:Microsoft SQL Server database / Visual Studio C# : date handlingMicrosoft SQL Server 数据库/Visual Studio C#:日期处理
【发布时间】: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

标签: c# sql sql-server database visual-studio


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    相关资源
    最近更新 更多