如果textBox字段为空,我想将SQL Server 2008数据库表中的所有行返回到SQL数据源。所以我用if @date IS NULL
子句创建了一个存储过程。
虽然存储过程似乎在Visual Studio 2008中正常工作,但实际网页没有显示任何结果。
我猜我必须DBNull
将textBox.Text == string.Empty
值发送到存储的proc SqlDataSource1.SelectParameters.Add
。我尝试了DBNull.Value
,但似乎我从DBNull.Value
到字符串的转换错误。
这是我的问题的根源还是我错过了其他的东西?如果文本字段为空,我如何将{{1}}传递给存储过程?
答案 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>