我有一个非常奇怪的问题,我似乎无法找到解决方案。我有一个带有一组参数的SqlDataSource和一个存储过程形式的select命令。其中一个参数是一个名为@SearchPhrase的字符串,它从文本框中获取其值,该文本框在保留为空时假定返回所有帖子。该参数通过搜索按钮获取其值,该按钮首先将searchBox.Text.Trim()的值设置为@SearchPhrase,然后数据绑定显示搜索结果的网格视图。
只要在文本框中输入一个值,存储过程就可以正常工作并返回结果但是当它保持为空时,结果表明存储过程永远不会被执行。我知道这是因为我已经添加了一行,它存储了每次调用时插入的所有参数。
为什么我不能在不输入文本框中的内容的情况下运行它?我可以让它执行的唯一方法是输入一个空格并将“”传递给存储过程,然后在其上执行左右修剪。为什么不在传递长度为0的字符串?
这是数据源的代码和参数的分配。它只是导致问题的@SearchPhrase参数,其余工作正常。点击事件的前三行(注释)是一种有点丑陋的方式,如果我想分配一个“”,那就让它工作。
<asp:SqlDataSource ID="enterprisesDS" runat="server"
ConnectionString="<%$ ConnectionStrings:CRMdb %>"
SelectCommand="entGetEnterprises" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:Parameter Name="SearchPhrase" Type="String" />
<asp:Parameter Name="IsActive" Type="Boolean" DefaultValue="true" />
<asp:Parameter Name="Country" Type="Byte" />
<asp:Parameter Name="LocalReference" Type="String" />
<asp:Parameter Name="Class" Type="String" />
<asp:Parameter Name="LocationID" Type="Byte" />
</SelectParameters>
</asp:SqlDataSource>
protected void search_Click(object sender, EventArgs e)
{
//string searchPhrase = " ";
//if (searchBox.Text.Trim().Length > 0)
// searchPhrase = searchBox.Text.Trim();
enterprisesDS.SelectParameters["SearchPhrase"].DefaultValue = searchBox.Text;
enterprisesDS.SelectParameters["Country"].DefaultValue = countries.SelectedValue;
enterprisesDS.SelectParameters["LocalReference"].DefaultValue = localReferences.SelectedValue;
enterprisesDS.SelectParameters["Class"].DefaultValue = classes.SelectedValue;
string locID = "0";
if (locations.SelectedValue != null)
locID = locations.SelectedValue;
enterprisesDS.SelectParameters["LocationID"].DefaultValue = locID;
enterprises.DataBind();
}
答案 0 :(得分:1)
这可能吗?在SqlDataSource上取消选择OnNullParameter属性。