如何检测SqlDataReader结果集是否是我期望的对象?

时间:2014-08-13 18:44:01

标签: c# sql sql-server

我有以下代码:

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.HasRowsresult.Read(),这两种方法都很糟糕,因为输出总是包含1行。它将是我想要的DateTime或我不想要的null非DateTime。我要问的是,是否有一种简单的方法可以确定result是否是由于查询填充的表而生成的,还是在查询空表时似乎生成的null。 / p>

enter image description here

4 个答案:

答案 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);
          }
     }

显然,在实际工作之前,你会有SqlConnectionSqlCommandQuery/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()