SqlDataSource FilterParameters и FilterExpression не работают с пустыми строками.

У меня есть SqlDatasource, для которого я программно создаю SelectCommand. В общем, SqlDataSource работает нормально, но когда я даю ему FilterParameters и FilterExpression, все идет наперекосяк. Ниже приведены два примера: первый возвращает 0 записей, второй возвращает все записи (15 000). Ни один из примеров не возвращает искомое подмножество записей (2839). Я совершенно сбит с толку тем, как мне настроить 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

Возвращает 2839 строк.


person Slogmeister Extraordinaire    schedule 03.01.2014    source источник


Ответы (2)


Я сдался. В дополнение к 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 + "'";
}
person Slogmeister Extraordinaire    schedule 03.01.2014

Похоже, вы не выполняете привязку данных () после какой-либо настройки FilterExpression для этих наборов данных или DropDownLists. Вам нужно сделать это, чтобы вызвать запрос.

person CodeMantle    schedule 14.07.2018