Как я могу выполнить приведение в SqlDataSource FilterExpression?
-
05-07-2019 - |
Вопрос
Я использую одно текстовое поле для поиска в отчете и фильтрации записей.Одно из моих полей — int32, а остальные — varchar.Поэтому, когда фильтр пытается сравнить строку из текстового поля с полем int32, я получаю ошибку.Вот SQLDataSouce и поле поиска:
<asp:TextBox ID="SearchBox" AutoPostBack="true" OnTextChanged="SearchBox_TextChanged" runat="server"></asp:TextBox>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:oneworldunitedConnectionString %>"
SelectCommand="SELECT usrs.UserID, usrs.UserName, usrs.FirstName, usrs.LastName, jndt.PropertyValue AS JoinDate, rgn.PropertyValue AS Region, cty.PropertyValue AS City, spnsrnm.PropertyValue AS SponsorName FROM dbo.Users AS usrs INNER JOIN
dbo.UserProfile AS jndt ON jndt.PropertyDefinitionID = 412 AND usrs.UserID = jndt.UserID INNER JOIN
dbo.UserProfile AS cty ON cty.PropertyDefinitionID = 27 AND usrs.UserID = cty.UserID INNER JOIN
dbo.UserProfile AS rgn ON rgn.PropertyDefinitionID = 28 AND usrs.UserID = rgn.UserID INNER JOIN
dbo.UserProfile AS spnsrnm ON spnsrnm.PropertyDefinitionID = 421 AND usrs.UserID = spnsrnm.UserID"
FilterExpression="UserID LIKE '%{0}%' OR UserName LIKE '%{0}%' OR FirstName LIKE '%{0}%' OR LastName LIKE '%{0}%' OR JoinDate LIKE '%{0}%' OR Region LIKE '%{0}%' OR City LIKE '%{0}%' OR SponsorName LIKE '%{0}%'">
<FilterParameters>
<asp:ControlParameter Name="Search" ControlID="SearchBox" PropertyName="Text" />
</FilterParameters>
</asp:SqlDataSource>
Пожалуйста, не критикуйте оператор sql, я знаю, что он крайне неэффективен.Кто-нибудь знает, как изменить FilterExpression
чтобы я не получал ошибку при попытке сравнить значение текстового поля с полем UserID?Я попробовал сделать это:
FilterExpression="CAST(UserID as varchar(4)) LIKE '%{0}%' OR UserName LIKE '%{0}%' OR FirstName LIKE '%{0}%' OR LastName LIKE '%{0}%' OR JoinDate LIKE '%{0}%' OR Region LIKE '%{0}%' OR City LIKE '%{0}%' OR SponsorName LIKE '%{0}%'"
но это не сработало.Я решил сделать UserID LIKE CAST('%{0}%' as varchar(4))
не сработает, потому что, если они на самом деле ввели строку, вы получите ошибку.
Редактировать: Вот сообщение об ошибке, которое я получил «Невозможно выполнить операцию Like для System.Int32 и System.String». Это было до того, как я сделал актерский состав.Затем, после того, как я сделал актерский состав, я получил «Выражение содержит неопределенный вызов функции Cast()».
У кого-нибудь есть идеи?
Спасибо,
Мэтт
Решение
Проблема, вероятно, не в UserID, ваше изменение должно было это исправить.Скорее всего, проблема связана с одним из других полей сравнения, где ведущим соперником является JoinDate.(Я не могу это исправить, потому что не знаю, какой у вас формат строки).
Хорошо, если формат даты — мм/дд/гггг, вы хотите изменить сравнение фильтров JoinDate на:
OR CONVERT(Varchar(10), JoinDate, 101) LIKE '%{0}%'
Хорошо, судя по сообщениям об ошибках, ошибка исходит не от SQL Server, а, должно быть, исходит от чего-то на вашей (клиентской) стороне.Вам нужно будет выяснить, что это такое, найти это в своем коде, а затем либо
1) попробуйте установить режим «PassThrough» (или «Passthru»), чтобы он не пытался сначала его проверить,
или 2) найдите версию SQL этого средства и измените CAST() на соответствующую функцию.Например, ODBC будет делать именно то, что вы видите здесь, и поскольку ODBC SQL не поддерживает функцию CAST, вам придется вместо этого использовать функцию ODBC SQL CONVERT().
Обратите внимание, что ODBC также имеет опцию сквозного режима.