我有一个非常奇怪的问题,我似乎无法找到解决方案。我有一个带有一组参数和一个存储过程形式的选择命令的 SqlDataSource。其中一个参数是一个名为@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();
}