将空值发送到存储过程DateTime参数时出错

时间:2011-11-01 08:24:25

标签: c# sql-server sql-server-2005

我有一个存储过程参数:

@ScmDate DateTime = NULL

当我按照下面的参数传递C#时,它会出错:将nvarchar转换为datetime时出错。

if (txtWaitedDate.Text != "")
    cmdTwMainEntry.Parameters.AddWithValue("@scmDate", Convert.ToDateTime(txtWaitedDate.Text));

即使我已将此参数的默认值设为NULL,但是当未满足上述C#条件时,也会出错。

编辑:

只有当我将TextBox留空时才会出错。

6 个答案:

答案 0 :(得分:2)

只需确保在文本框为空时发送DbNull.Value。 那应该是诀窍,afaik。

答案 1 :(得分:1)

我怀疑你的日期格式不是sql server所期望的,尝试使用DateTime.TryParse和SQL Server实例的正确格式提供程序进行转换。

例如,当使用mm / dd / yyyy格式而另一个使用dd / mm / yyyy时,可能会发生此错误。

修改

手动更改参数类型无论如何都应该有效。 尝试使用此代码,应该可以工作:

    SqlParameter parameter = cmdTwMainEntry.Parameters.Add("@scmDate", System.Data.SqlDbType.DateTime);
        // Set the value.
        parameter.Value = (!string.IsNullOrEmpty(txtWaitedDate.Text)) ? Convert.ToDateTime(txtWaitedDate.Text) : System.DbNull.Value;

答案 2 :(得分:0)

我认为你填写了错误的日期(格式)。所以这个值无法转换。

答案 3 :(得分:0)

if( DateTime.TryParse( txtWaitedDate.Text, out WaitedDate )
    Entry.Parameters.AddWithValue("@scmDate", WaitedDate );
else
    Entry.Parameters.AddWithValue("@scmDate", DBNull.Value );

答案 4 :(得分:0)

在SQL执行C#之前放置一个断点并检查您的Parameters集合。听起来@ScmDate正在偷偷摸摸一个像String.Empty这样的值。

答案 5 :(得分:0)

如果为参数指定了默认值,则在调用存储过程时无需为该参数提供值。例如,如果你有:

@ScmDate DateTime = NULL

当没有可用于此参数的值时,简单的解决方案就是忽略此参数