将空白字段值传递给存储过程ASP .NET C#

时间:2011-02-21 15:51:05

标签: .net asp.net sql sql-server dbnull

如果textBox字段为空,我想将SQL Server 2008数据库表中的所有行返回到SQL数据源。所以我用if @date IS NULL子句创建了一个存储过程。

虽然存储过程似乎在Visual Studio 2008中正常工作,但实际网页没有显示任何结果。

我猜我必须DBNulltextBox.Text == string.Empty值发送到存储的proc SqlDataSource1.SelectParameters.Add。我尝试了DBNull.Value,但似乎我从DBNull.Value到字符串的转换错误。

这是我的问题的根源还是我错过了其他的东西?如果文本字段为空,我如何将{{1}}传递给存储过程?

2 个答案:

答案 0 :(得分:10)

您需要确保在SqlDataSource上将CancelSelectOnNullParameter设置为false,并确保ConvertEmptyStringToNull对所需参数为true。它应该在标记中看起来像这样:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" CancelSelectOnNullParameter="false" SelectCommand="...">
  <SelectParameters>
    <asp:ControlParameter Name="..." ControlID="..." PropertyName="..." DbType="..." ConvertEmptyStringToNull="true"/>
    ...
  </SelectParameters>
</asp:SqlDataSource>

如果您有多个可以提供空值的Control并且您只想允许其中一个为null,则问题将开始。在这种情况下,您必须将CancelSelectOnNullParameter设置为true并使用Selecting事件来添加DBNull.Value:

protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
  if (String.IsNullOrEmpty(textBox.Text))
    ((IDbDataParameter)e.Command.Parameters["@name"]).Value = DBNull.Value;
}

这应该可以让你解决问题。

答案 1 :(得分:0)

你可以在你的存储过程中将默认值设置为null,这样如果文本框为空,你就不必传递任何东西,只需在存储过程参数列表中的参数类型之后执行write = NULL。 / p>