我有一个
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 行。
我放弃了。除了
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 + "'";
}
您似乎没有在这些数据集或 DropDownList 的任何 FilterExpression 设置之后执行 databind() 。您需要执行此操作才能调用重新查询。
要为
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 语句来处理过滤器的多个参数。