SqlDataSource FilterParameters和FilterExpression不适用于空字符串

时间:2014-01-03 15:39:51

标签: c# asp.net sql sqldatasource string

我有一个SqlDatasource,我以编程方式创建SelectCommand。一般来说,SqlDataSource工作正常,但当我给它FilterParametersFilterExpression时,事情就会出错。下面是两个例子,第一个返回0记录,第二个返回所有记录(15,000)。这两个例子都没有返回我正在寻找的记录子集(2,839)。对于我应该如何设置FilterParametersFilterExpression来获取我正在寻找的记录,我完全糊涂了。我现在已经研究了两天而没有运气。

<asp:SqlDataSource ID="dsIAMS" runat="server" ConnectionString="<%$ ConnectionStrings:ReportsConnectionString %>" />

dl = (DropDownList)tFilters.Controls[0];
// dl.ID = dlPASUBTYPENAME 
cp = new ControlParameter();
cp.Name = "cp" + dl.ID.Substring(2);
cp.ControlID = dl.ID;
cp.PropertyName = "SelectedValue";

//Attempt 1:  Returns 0 records
cp.ConvertEmptyStringToNull = false;
dsIAMS.FilterParameters.Add(cp);
if (dl.SelectedItem.Text == "") {
  dsIAMS.FilterExpression = dl.ID.Substring(2) + "='' ";
}
else {
  dsIAMS.FilterExpression = dl.ID.Substring(2) + "='{0}'";
}

//Attempt #2:  Returns all the records (15,000)
cp.ConvertEmptyStringToNull = true;
dsIAMS.FilterParameters.Add(cp);
if (dl.SelectedItem.Text == "") {
  dsIAMS.FilterExpression = "ISNULL("+dl.ID.Substring(2) + ", 'null')='null' ";
}
else {
  dsIAMS.FilterExpression = dl.ID.Substring(2) + "='{0}'";
}

这是我针对数据库本身运行的SQL查询:

SELECT * FROM IAMS
WHERE PASUBTYPENAME IS NULL

返回2,839行。

2 个答案:

答案 0 :(得分:0)

我放弃了。除了FilterExpression和FilterParameters之外,我还尝试了SelectParameters相同的结果。我决定每次只对整个SelectCommand进行硬编码。参数只是不起作用。我总是讨厌他们,因为他们只是不能很好地处理NULL。在我的诊断过程中,我甚至运行SQL Server Profiler来跟踪Visual Studio中的通信,并且当未使用该参数时(即使用了“ISNULL”部分),查询甚至从未提交给SQL服务器。我最终使用了以下代码:

<asp:SqlDataSource ID="dsIAMS" runat="server" ConnectionString="<%$ ConnectionStrings:ReportsConnectionString %>" />

dl = (DropDownList)tFilters.Controls[0];
// dl.ID = dlPASUBTYPENAME 
if (dl.SelectedItem.Text == "") {
  dsIAMS.SelectCommand+=dl.ID.Substring(2) + " IS NULL";
}
else {
  dsIAMS.SelectCommand+=dl.ID.Substring(2) + "='" + dl.SelectedItem.Text + "'";
}

答案 1 :(得分:0)

在这些数据集或DropDownList的任何FilterExpression设置之后,您似乎都没有执行databind()。您需要执行此操作才能调用重新查询。