使用SqlDataReader的C#我想从列中获取日期时间值

时间:2015-07-04 11:59:36

标签: c# sql-server-2008 datetime

我正在使用:

string date1 = reader. GetDateTime(reader. GetOrdinal("firstMove"). ToString() 

但它会抛出一个异常,特别是如果该值为null ....

4 个答案:

答案 0 :(得分:0)

请尝试以下代码。

nil

答案 1 :(得分:0)

如果你告诉我们你得到了什么样的例外,你获得例外的事实会更容易解决。可能的错误是:

  1. 列不是DateTime,因此GetDateTime根本不起作用
  2. firstMove根本不是有效的列名,因此您无法访问该列
  3. 假设列确实存在并且类型为DateTime 我倾向于使用以下内容:

    DateTime? d = reader["firstMove"] as DateTime?;
    

    这非常有效。你想要的是什么?

    DateTime? d = reader["firstMove"] as DateTime?;
    string dstring = d.HasValue ? d.Value.ToString() : "";
    

    或者:

    string date1 = !reader.IsDBNull(reader.GetOrdinal("firstMove")) ? reader.GetDateTime(reader.GetOrdinal("firstMove").ToString() : String.Empty;
    

答案 2 :(得分:0)

最好使用DateTime(或可以为空的DateTime - DateTime?)而不是字符串来处理日期。

如果您想使用此方法,可以使用扩展方法:

public static class IDataReaderExtensions
{
    public static DateTime GetDateTimeOrMinValue(this IDataReader dr, int position)
    {
        if (dr.IsDBNull(position))
        {
            return DateTime.MinValue;
        }

        return dr.GetDateTime(position);
    }

    public static DateTime? GetDateTimeOrNull(this IDataReader dr, int position)
    {
        if (dr.IsDBNull(position))
        {
            return null;
        }

        return dr.GetDateTime(position);
    }
}

用法:

DateTime dateA = reader.GetDateTimeOrMinValue(reader.GetOrdinal("firstMove"));

DateTime? dateB = reader.GetDateTimeOrNull(reader.GetOrdinal("firstMove"));

您甚至可以改进扩展方法,因此它可以接收列名并在内部找到序号位置。

希望这有帮助,

答案 3 :(得分:-2)

使用或函数检查null是否为null。

if(string1 || string2 ||string3)