我有一个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行。
答案 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()。您需要执行此操作才能调用重新查询。