当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值的智能方法是什么?
当我找到解决方案时,我会写一篇关于这个主题的文章。
答案 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