Null DateTime值的最佳解决方案

时间:2010-08-26 07:00:00

标签: c# sql-server datetime nullable

当DateTime值为NULL时,我找不到最佳解决方案。

我使用这个技术时绑定;

_ACTIVATION_DATE = dt.Rows[0]["ACTIVATION_DATE"] == DBNull.Value ? new DateTime(1970, 12, 30) : (DateTime?)dt.Rows[0]["ACTIVATION_DATE"];

插入时;

public void Insert()
{
    string ad="";
    string dd="";

    if (ACTIVATION_DATE == null)
        ad = "null";
    else
        ad = "'" + ACTIVATION_DATE + "'";
    if (DEACTIVATION_DATE == null)
        dd = "null";
    else
        dd = "'" +DEACTIVATION_DATE +"'";

    string sSQL = "INSERT INTO LINE_INFO (ACTIVATION_DATE,DEACTIVATION_DATE,STATUS,PO,NOTES) VALUES (" + ad + "," + dd + "," + _STATUS.ToString() + "," + _PO.ToString() + ",'" + _NOTES.ToString() + "');SELECT @@IDENTITY AS LASTID";
    }

变量;

DateTime? ACTIVATION_DATE;
DateTime? DEACTIVATION_DATE;

处理Null DateTime值的智能方法是什么?

当我找到解决方案时,我会写一篇关于这个主题的文章。

4 个答案:

答案 0 :(得分:4)

为什么在使用可以为空的DateTime时使用new DateTime(1970, 12, 30)?可空值类型的全部意义在于,您不需要像这样的魔术值。

我可能会使用:

_ACTIVATION_DATE = dt.Rows[0]["ACTIVATION_DATE"] as DateTime?;

这将自动使用任何非DateTime值的空值。当然,这意味着如果你不小心有一个整数或类似的东西,你将得到一个空值而不是异常。可替换地:

object tmp = dt.Rows[0]["ACTIVATION_DATE"];
_ACTIVATION_DATE = tmp is DbNull ? null : (DateTime?) tmp;

然后对于insert语句,不直接在SQL 中包含值。使用参数化的insert语句,然后您可以使用null DateTime?值来插入空值。不需要乱用字符串格式。

答案 1 :(得分:1)

DateTime?暗示您使用Nullable<DateTime>来存储值 - 那么为什么不使用.HasValue和.Value?

答案 2 :(得分:0)

您不应直接插入值,因为您可以创建SQL注入的可能性。相反,您应该使用参数化查询:

using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = connection.CreateCommand())
{
    command.CommandText = "INSERT INTO table1 (column1, column2) VALUES (@param1, @param2)";

    command.Parameters.Add("@param1", SqlDbType.DateTime).Value = 
        DateTime.TryParse(txtDate.Text, out d) ?
            (object)d :
            DBNull.Value // inserting NULL
    ...

    connection.Open();
    command.ExecuteNonQuery();
}

绑定时:

object date = reader["date"]; // NULL or '2010-08-26'
txtDate.Text = Convert.IsDBNull(date) ? (DateTime)date : String.Empty;
// or
txtDate.Text = (reader["date"] as DateTime? ?? String.Empty).ToString();

答案 3 :(得分:-1)

在大多数情况下,空处理取决于业务需求,在您需要存储某些值的情况下,但是日期为空的信息有时是有用的。因为事情还没有发生。因此很难确定一些有效的null日期处理方法。

在你的情况下,我可以用一个名为default date的静态const字段替换new DateTime(1970, 12, 30)

public const DateTime DEFAULT_DATE = new DateTime(1970,12,30);


public void Insert()
{
  string activationDate = "null";
  string deactivationDate= "null";

  if (ACTIVATION_DATE != null) {
   ad = string.format("'{0}'",ACTIVATION_DATE); //Hire should be some date format used
  }

  if (DEACTIVATION_DATE != null) {
   ad = string.format("'{0}'",DEACTIVATION_DATE); //Hire should be some date format used
  }


   string sSQL = string.format("INSERT INTO LINE_INFO (ACTIVATION_DATE,DEACTIVATION_DATE,STATUS,PO,NOTES) VALUES ({0},{1},{2},{3},'{4}');SELECT @@IDENTITY AS LASTID",activationDate ,deactivationDate ,_STATUS,_PO,_NOTES);

聚苯乙烯。您不应该使用此类型的语句创建,而应使用SqlCommand和paramteres