2010-06-22 75 views
4

我有一个搜索页面,它具有日期文本字段。用户可能会或可能不会填充此字段。但是该字段是被调用来执行搜索查询的SQL存储过程的参数。将参数值传递给asp.net中可选字符串的SQL存储过程

当我走过的代码(日期字段为空),我得到一个错误,该值无法转换为DateTime

我如何转换为空值,日期时间,因为参数是查询期望?

cmdSearch.Parameters.Add(new SqlParameter("@StartDate", SqlDbType.DateTime)); 
cmdSearch.Parameters["@StartDate"].Value = Convert.ToDateTime(txtStartDate.Text.Trim()); 
+0

你认为这个问题与ASP.NET有什么关系? – 2010-06-22 14:33:11

回答

5

如果您将SQL proc中的参数设置为可选参数,通过提供默认值

CREATE PROCEDURE MyProc 
... 
@StartDate datetime = null, 
.... 

他们你可以省略发送该参数从C#代码

DateTime result; 
if (DateTime.TryParse(txtStartDate.Text, out result)) 
{ 
    cmdSearch.Parameters.Add(new SqlParameter("@StartDate", SqlDbType.DateTime)); 
    cmdSearch.Parameters["@StartDate"].Value = result; 
} 

如果文本字段的解析不成功,参数没有在参数列表中,并将该数据库使用默认值。

此外,使用DateTime.TryParse(..)可防止处理异常。

+0

我觉得你钉他哥们!到目前为止您的评论“如果解析文本字段失败,参数不会添加到参数列表中,并且数据库使用默认值。”我认为所有情况下都必须通过一个参数。今天学到了一些东西! – user279521 2010-06-22 14:43:58

+1

Thx。我想指出的一点是,从设计的角度来看,它将数据库过程和数据层代码结合在一起,所以它可能不易维护。另一方面,更改默认传递值只需要proc更新,而不是代码重新编译。 – SWeko 2010-06-22 15:11:37

2
cmdSearch.Parameters["@StartDate"].Value = 
    String.IsNullOrEmpty(txtStartDate.Text) ? SqlDateTime.MinValue : 
     Convert.ToDateTime(txtStartDate.Text.Trim()); 

,将检查,看看是否文本为空或试图解析前值一个空字符串。

一定要使用SqlDateTime结构,而不是DateTime,因为两者有很大的不同MinValue s。

请记住,这不会修复TextBox文本格式不正确的情况。 在这些情况下,您将继续获得例外!

+0

根据实施sproc的方式,您可能需要使用DateTime.MinValue(或MaxValue)而不是DBNull.Value。这一切都取决于sproc如何处理它。如果它提供了一个默认值(如果没有提供),那么将它保留下来也是一个选项。 – tvanfosson 2010-06-22 14:15:09

+0

我了解日期格式问题。我将为此创建验证。 但是,当我尝试使用代码时出现错误: 无法确定条件表达式的类型,因为'System.DBNull'和'System.DateTime'之间没有隐式转换 – user279521 2010-06-22 14:17:02

+0

@ user279521 - 更新了我的答案以传递MinValue而不是空。 – 2010-06-22 14:31:56

2

纸环绕整个事情和测试的if声明,看看是否String.IsNullOrEmpty(txtStartDate.Text)

编辑

这就是我的意思的,“整个事情” - 道歉不更清澈

if (!String.IsNullOrEmpty(txtStartDate.Text)) 
    cmdSearch.Parameters["@StartDate"].Value = Convert.ToDateTime(txtStartDate.Text.Trim()); 
else 
    cmdSearch.Parameters["@StartDate"].Value = DateTime.MinValue; 
+0

+1,假设整个事情你的意思是添加startdate参数的部分。如果它是空的,你可以选择。要么根本不传递参数,要么传入null或其他默认值。如果您选择不通过它,请确保s'proc在参数部分中分配了默认值。类似于“@StartDate datetime = null” – NotMe 2010-06-22 14:14:10

+1

在if语句中包装整个事件将导致查询中缺少参数。您仍然需要添加参数,但如果文本为空,请将该值设置为null。 – 2010-06-22 14:14:20

+0

正确的贾斯汀。我想到了if语句,但是这个参数会被忽略掉; – user279521 2010-06-22 14:18:14

相关问题