我有以下代码:
const string QUERY = "SELECT MAX(Date) FROM table";
command = new SqlCommand(QUERY, _connection);
SqlDataReader result = command.ExecuteReader();
此功能按预期工作。 result
将包含我关心的DateTime或null非DateTime对象。
我想要实现的目标如下:
DateTime mostRecentDate = new DateTime(2000, 1, 1);
if (/*result is a datetime*/) mostRecentDate = result.GetDateTime(0);
但是对于所有提出的解决方案,有一种情况是,当表为空时会中断,或者在填充表时会出现意外行为。
编辑:我尝试过的方法包括使用result.HasRows
,result.Read()
,这两种方法都很糟糕,因为输出总是包含1行。它将是我想要的DateTime或我不想要的null非DateTime。我要问的是,是否有一种简单的方法可以确定result
是否是由于查询填充的表而生成的,还是在查询空表时似乎生成的null。 / p>
答案 0 :(得分:1)
最简单的方法之一是ToString()
到列的实现,一旦它是string
,它将非常容易操作。只是因为您可以访问.Net中内置的所有DateTime
功能。
DateTime.ParseExact
DateTime.Parse
DateTime.TryParse
DateTime.TryParseExact
所以我会做的方法是:
using(SqlDataReader reader = command.ExecuteReader())
while(reader.Read())
{
if(reader[@"Date"] != DBNull.Value)
{
string dbDate = reader[@"Date"].ToString();
DateTime date = DateTime.Parse(dbDate);
}
}
显然,在实际工作之前,你会有SqlConnection
,SqlCommand
或Query/Stored Procedure
,但这种方法可以快速成功地抓住日期项目。数据库中。
您可以随时查看此question。他们还有另一种方法,可以处理来自Nullable DateTime
的{{1}}。
答案 1 :(得分:1)
即使基础数据集为空,全局聚合也始终返回一行。从数据读取器中拉出一行并检查NULL
(使用其中一种常用方法)。或者,使用本地聚合:
SELECT MAX([Date])
FROM (
SELECT GETUTCDATE() AS [Date]
WHERE 0=1
) x
--vs.
DECLARE @dummy INT
SELECT MAX([Date])
FROM (
SELECT GETUTCDATE() AS [Date], 0 AS Dummy
WHERE 0=1
) x
GROUP BY Dummy
第一行返回一行NULL
值。第二个返回零行。
答案 2 :(得分:-2)
如果有结果集,您可以检查该列是否等于DBNull.Value
if (reader.GetValue(0) != DBNull.Value)
{
var date = reader.GetDateTime(0);
}
else {
var date = new DateTime(2000, 1, 1);
}
答案 3 :(得分:-2)
您可能想要使用DateTime.TryParse()