5

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

尽管存储过程在 Visual Studio 2008 中似乎运行良好,但实际网页没有显示任何结果。

我猜我必须向DBNull存储的过程发送一个值,如果textBox.Text == string.Empty. 我试过了,SqlDataSource1.SelectParameters.Add但似乎我收到了从DBNull.Value字符串到字符串的转换错误。

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

4

2 回答 2

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>

如果您有多个可以提供空值的控件并且您希望仅允许其中一个为空,则问题将开始。在这种情况下,您必须将 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;
}

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

于 2011-02-21T16:49:42.423 回答
0

您可以在存储过程中将默认值设置为 null,因此如果文本框为空,您根本不必传递任何内容,只需在存储过程参数列表中的参数类型后写入 = NULL。

于 2011-02-21T15:54:04.673 回答