如何将null值作为日期时间传递给sql server(DAL Layer)

时间:2015-01-22 06:36:45

标签: c# sql-server datetime null nullable

我在sql server中有一个列(可以为空,但它是Datetime)..

如果没有选择用户我需要为此字段传递空值的任何日期我是这样做的,如下所示

    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        DateTime expiryDate;
        DateTime? expDate = null;
         if (chkExpDate.Checked == true)
        {
            expiryDate = Convert.ToDateTime(txtExpiryDate.Text);
        }
        else if (expDate.HasValue)
        {
            expiryDate = expDate.Value;
        }
        else
            expiryDate = Convert.ToDateTime(DBNull.Value);
         // here I am getting error like "object cannot be cast from DBNULL or value

如果我必须克服这个问题我需要做什么..如果没有选择任何日期的用户,我需要传递空值我该怎么做...

请任何人帮忙解决这个问题。非常感谢

这是

的DAL
public bool ReAssignLicense(string certificateID, string serialNumber, string newEmail, string ticketID, string backupBy, string customerName, DateTime expDate)
    {
        List<SqlParameter> ParaList = new List<SqlParameter>();
        ParaList.Add(new SqlParameter("@certificate", certificateID));
        ParaList.Add(new SqlParameter("@certSN", serialNumber));
        ParaList.Add(new SqlParameter("@newemail", newEmail));
        ParaList.Add(new SqlParameter("@ticket", ticketID));
        ParaList.Add(new SqlParameter("@bkpBy", backupBy));
        ParaList.Add(new SqlParameter("@customer_name", customerName));
        ParaList.Add(new SqlParameter("@exp_date", expDate));

        return SqlHelper.ExecuteNonQuery(new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString),CommandType.StoredProcedure,"sp_Update",ParaList.ToArray()) > 0;
    }

4 个答案:

答案 0 :(得分:0)

检查

protected void btnSubmit_Click(object sender, EventArgs e)
{
  DateTime? expDate = null;
  if (chkExpDate.Checked == true)
  {
    expDate = Convert.ToDateTime(txtExpiryDate.Text);
  }

我将DateTime变量设置为nullable。

public bool ReAssignLicense(string certificateID, string serialNumber, string newEmail, string ticketID, string backupBy, string customerName, DateTime? expDate)
{
  List<SqlParameter> ParaList = new List<SqlParameter>();
  ParaList.Add(new SqlParameter("@certificate", certificateID));
  ParaList.Add(new SqlParameter("@certSN", serialNumber));
  ParaList.Add(new SqlParameter("@newemail", newEmail));
  ParaList.Add(new SqlParameter("@ticket", ticketID));
  ParaList.Add(new SqlParameter("@bkpBy", backupBy));
  ParaList.Add(new SqlParameter("@customer_name", customerName));

  if (expDate != null)
    ParaList.Add(new SqlParameter("@exp_date", expDate));

  return SqlHelper.ExecuteNonQuery(new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString), CommandType.StoredProcedure, "sp_Update", ParaList.ToArray()) > 0;
}

答案 1 :(得分:0)

你可以这样做

SqlParameter moFrom1Param = new SqlParameter("@MoFrom1", expairydate == null 
           ? DBNull.Value : expairydate);
            moFrom1Param.IsNullable = true;
            moFrom1Param.Direction = ParameterDirection.Input;
            moFrom1Param.SqlDbType = SqlDbType.DateTime;
            cmd.Parameters.Add(moFrom1Param);

您可以将DatTime变量设置为可以为空的变量,它可以处理您的问题而无需执行任何操作。

因为你的expiryDate是可以为空的,你可以直接在sql命令中传递thsi字段,或者你正在调用dabase层。

您可以像这样更改此行

expiryDate = DateTime.MinValue;

查看此帖子:http://www.dotnetperls.com/datetime-minvalue

//
    // This won't compile!
    //
    // DateTime dateTime1 = null;
    //
    // This is the best way to null out the DateTime.
    //
    DateTime dateTime2 = DateTime.MinValue;

答案 2 :(得分:0)

SQL Server中,只需在日期时间列中插入NULL

INSERT INTO Table(name, datetimeColumn, ...)
VALUES('foo bar', NULL, ..);

或者,您可以使用DEFAULT constaints:

...
DateTimeColumn DateTime DEFAULT NULL,
...

然后你可以在INSERT statemnt中完全忽略它,它将插入NULL值:

INSERT INTO Table(name, ...)
VALUES('foo bar', ..);

答案 3 :(得分:0)

您好如果我理解您的问题,那么您可以在最后一个条件中将expiryDate设置为null。

对于同样的情况,您将需要更改变量声明  DateTime expiryDate与您为DateTime所做的可空类型相同? expDate = null;

因此,您在上面发布的修订语法如下

        DateTime? expiryDate;
        DateTime? expDate = null;
        if (chkExpDate.Checked == true)
        {
            expiryDate = Convert.ToDateTime(txtExpiryDate.Text);
        }
        else if (expDate.HasValue)
        {
            expiryDate = expDate.Value;
        }
        else

            expiryDate = null;

希望这对你有用。