Вопрос

Я использую одно текстовое поле для поиска в отчете и фильтрации записей.Одно из моих полей — 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 также имеет опцию сквозного режима.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top