如何将DBnull插入可为空的DateTime字段asp.net c#

时间:2014-10-28 11:56:05

标签: c# asp.net sql-server datetime nullable

我需要在类字段datetime中插入null吗? 这是班级:

public class TimeData{
        public int TD_ID { get; set; }
        public int UD_ID { get; set; }
        public DateTime? TD_start { get; set; }
        public DateTime? TD_end { get; set; }
        public DateTime? timestemp { get; set; }

    public void Insert(int TD_ID, int UD_ID, DateTime? TD_start, DateTime? TD_end, DateTime? timestemp)
    {
        this.TD_ID=TD_ID;
        this.UD_ID = UD_ID;
        this.TD_start = TD_start;
        this.TD_end = TD_end;
        this.timestemp = timestemp;

    }
}

我使用页面中的存储过程访问了sql server。 datetime字段的某些返回值为null,并返回为DBnull,它不能存储在DateTime?中。 我可以用很多if来检查返回值,但我更愿意找到更优雅的方式来使它工作。 sql server连接:

try
                {
                    String strConnString = ConfigurationManager.ConnectionStrings["Achi"].ConnectionString;
                    System.Data.SqlClient.SqlConnection SQLCon = new System.Data.SqlClient.SqlConnection();
                    SqlDataReader myReader = default(SqlDataReader);
                    SQLCon = new SqlConnection(strConnString);
                    SqlCommand sqlCmd = new SqlCommand("usp_TD_select_last_record_By_UD_ID", SQLCon);
                    sqlCmd.Parameters.AddWithValue("@UD_ID", user.UD_ID);
                    sqlCmd.CommandType = CommandType.StoredProcedure;
                    SQLCon.Open();
                if (SQLCon.State == ConnectionState.Open)
                {
                    myReader = sqlCmd.ExecuteReader();

                    if (myReader.HasRows)
                    {
                        while (myReader.Read())
                        {
                            timeData.Insert(Convert.ToInt32(myReader["TD_ID"].ToString()), Convert.ToInt32(myReader["UD_ID"].ToString()), Convert.ToDateTime(myReader["TD_start"]), Convert.ToDateTime(myReader["TD_end"]), Convert.ToDateTime(myReader["TD_timestemp"]));

                        }
                    }
                    else { newLine = true; }
                    myReader.Close();
                    SQLCon.Close();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

并且数据库中的表格看起来像这样:

[TD_ID] [int] IDENTITY(1,1) NOT NULL,
[UD_ID] [int] NULL,
[TD_start] [datetime] NULL,
[TD_end] [datetime] NULL,
[TD_timestemp] [datetime] NULL,

3 个答案:

答案 0 :(得分:1)

this.TD_start = (myReader["TD_start"] == DBNull.Value) ? 
                (DateTime?)null : Convert.ToDateTime(myReader["TD_start"]); 

答案 1 :(得分:0)

我想你在转换到日期时会遇到某种异常。考虑使用Convert.IsDBNull方法。你可以这样做:

Convert.IsDBNull(myReader["TD_start"]) ? (DateTime?)null : Convert.ToDateTime(myReader["TD_start"])

答案 2 :(得分:0)

您可以拥有这样的帮助函数:

public static T GetValue<T>(this IDataRecord record, string name)
{
   var index = record.GetOrdinal(name);
   return record.IsDBNull(index) ? default(T) : (T)record.GetValue(index);
}

然后叫它:

timeData.Insert(myReader.GetValue<int>("TD_ID"), 
                .... myReader.GetValue<DateTime?>("TD_timestemp"), ...);