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

问题描述 投票:0回答:3

我有一个

SqlDatasource
,我以编程方式为其创建
SelectCommand
。一般来说,
SqlDataSource
工作得很好,但是当我给它
FilterParameters
FilterExpression
时,事情就会出错。下面是两个示例,第一个返回 0 条记录,第二个返回所有记录 (15,000)。这两个示例都没有返回我正在查找的记录子集 (2,839)。我完全困惑于如何设置
FilterParameters
FilterExpression
来获取我正在寻找的记录。我已经研究了两天了,但没有运气。

<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 行。

c# asp.net sql sqldatasource string
3个回答
0
投票

我放弃了。除了

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

<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 + "'";
}

0
投票

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


0
投票

要为

FilterParameters
实现 Null 值,您可以 在
FilterExpression
中声明完整的
SqlDataSource
命令,例如,

FilterExpression="Name = '{0}' AND Status = '{1}' AND Date = '{2}'"
.

将每个

DefaultValue=
FilterParameters
设置为任意值。这将触发
OnFiltering
事件,因为所有参数都有一个值。 在
OnFiltering
事件方法中设置
sqlDS.FilterExpression = "";
.

之后,如果您想根据下拉选择或文本更改更改过滤器表达式,只需指定

sqlDS.FilterExpression = "Date = '{2}'"
每个
OnSelectedIndexChanged
OnTextChanged
Control
事件内。

唯一的缺点是,这仅允许您按 1 个参数进行过滤,除非您有嵌套的 if 语句来处理过滤器的多个参数。

© www.soinside.com 2019 - 2024. All rights reserved.