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?
... ...
... ...
... ... ...
注意:在我的网站上,我只需要上述日期的YEAR
、MONTH
和DAY
。不确定这是否对您有帮助,可能没有,但只是想说。
【问题讨论】:
最快的方法是使用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.ToShortDateString
或 DateTime.ToString(string)
。
【讨论】:
以上是关于Microsoft SQL Server 数据库/Visual Studio C#:日期处理的主要内容,如果未能解决你的问题,请参考以下文章