我试图让我的代码尽可能紧凑。
使用Microsoft SQL Server,.NET 2.0
我的数据库中有一个日期字段,它接受空值
LeaseExpiry(datetime, null)
我抓住文本框的值并将其转换为datetime。
DateTime leaseExpiry = Convert.ToDateTime(tbLeaseExpiry.Text);
INSERT_record(leaseExpiry);
我遇到的问题是表单是否已提交且文本框为空。我收到了这个错误:
字符串未被识别为有效的DateTime。
如何设置我的代码,以便在文本框为空时,使用NULL
在数据库中创建行?
我尝试将变量初始化为NULL但在Visual Studio中出错
DateTime leaseExpiry = null;
无法将null转换为'System.DateTime',因为它是一个不可为空的值类型。
如果有帮助,这是数据访问层
public string INSERT_record(DateTime leaseExpiry)
{
//Connect to the database and insert a new record
string cnn = ConfigurationManager.ConnectionStrings[connname].ConnectionString;
using (SqlConnection connection = new SqlConnection(cnn))
{
string SQL = string.Empty;
SQL = "INSERT INTO [" + dbname + "].[dbo].[" + tblAllProperties + "] ([LeaseExpiry]) VALUES (@leaseExpiry);
using (SqlCommand command = new SqlCommand(SQL, connection))
{
command.Parameters.Add("@leaseExpiry", SqlDbType.DateTime);
command.Parameters["@leaseExpiry"].Value = leaseExpiry;
}
try
{
connection.Open();
command.ExecuteNonQuery();
return "Success";
}
catch (Exception ex)
{
return ex.Message;
}
}
}
谢谢
答案 0 :(得分:15)
确实,DateTime
不能是null
。但是:DateTime?
可以。另请注意,对于参数,null
表示“不发送”;你需要:
public string INSERT_record(DateTime? leaseExpirey)
{
// ...
command.Parameters.Add("@leaseExpirey", SqlDbType.DateTime);
command.Parameters["@leaseExpirey"].Value =
((object)leaseExpirey) ?? DBNull.Value;
// ...
}
答案 1 :(得分:3)
尝试使用可空的DateTime和TryParse()
DateTime? leaseExpirey = null;
DateTime d;
if(DateTime.TryParse(tbLeaseExpiry.Text, out d))
{
leaseExpirey = d;
}
INSERT_record(leaseExpirey);
答案 2 :(得分:2)
你可以让leaseExpirey
成为可以为空的DateTime
- 即DateTime? leaseExpirey
然后你可以说:
DateTime? leaseExpirey;
if (!string.IsNullOrEmpty(tbLeaseExpiry.Text.Trim()))
leaseExpirey = Convert.ToDateTime(tbLeaseExpiry.Text);
INSERT_record(leaseExpirey);
您还需要更改INSERT_record
以接受DateTime?
参数,而不是DateTime
。
答案 3 :(得分:0)
您应该使用DateTime.MinValue
,因为DateTime永远不会是null
。