我有一个表格,我将Datetime
添加到某些列中。我使用存储过程将值插入表中。在存储过程中,我有变量接受null以插入表中。我的问题是当我尝试在我的表列中插入一个空值时,我在列中得到1900-01-01。我该怎么做而不是这个默认值在colulmn ??
这是我的SP:
CREATE PROCEDURE dbo.Insert
@InserID int,
@InsertDate Datetime = null,
AS
Insert into Tables(InsertID, InsertDate)
Values(@InsertID, @InsertDate)
我这样做是为了分配一个空值:
System.Data.SqlTypes.SqlDateTime getDate;
//set DateTime null
getDate = SqlDateTime.Null;
if (InsertDate.Text == "")
{
cmd1.Parameters["@InsertDate"].Value = getDate;
}
else
{
cmd1.Parameters["@InsertDate"].Value = InsertDate.Text;
}
添加到我的表列的值不是NULL,它是1900-01-01。
我该怎么办?
答案 0 :(得分:5)
我正在使用这种模式,我对空值或不兼容的文本格式没有任何问题。
cmd1.Parameters.Add["@InsertDate"].Value = textBox1.Text.AsDBDateTime();
// ...
public static class DBValueExtensions {
public static object AsDBDateTime(this string s) {
object dateTimeValue;
var str = s;
if ( null != str ) { str = str.Trim(); }
if ( string.IsNullOrEmpty(str) ) {
dateTimeValue = DBNull.Value;
}
else {
dateTimeValue = DateTime.Parse(str);
}
return dateTimeValue;
}
答案 1 :(得分:3)
您可以完全省略可选参数,而不是将其设置为SqlDateTime.Null
。
话虽如此,代码仍应有效。你怎么看数据库?某些观看者会为1900-01-01
显示null
。从SQL Server Management Studio运行select * from Tables
时,您看到了什么?
答案 2 :(得分:2)
我怀疑你的日期有一个从DBNull隐式转换为0,因为默认情况下DateTime不可为空。这将重现您所看到的行为。
大声笑,刚刚看到Addomar的答案,如果SSMS中的列实际上不是null但实际上是零并且您无法更改数据库模式(有时这是不可能的)那么下面的方法将起作用...您可以尝试使用datacolumn datagridview replace specific value之类的内容将零值替换为不同的文本或空字符串吗?
但理想情况下,将列更改为可以为空而没有默认值,并在该值为null时省略该参数。
答案 3 :(得分:1)
我在SSMS中试过这个
declare @InsertDate datetime
set @InsertDate = ' '
select @InsertDate
返回1900-01-01 00:00:00.000
所以另一种可能性是你的输入是空格。尝试使用
if (string.IsNullOrWhiteSpace(InsertDate.Text))
而不是
if (InsertDate.Text == "")