Как я могу выполнить приведение в выражении SqlDataSource FilterExpression? - PullRequest
2 голосов
/ 29 июля 2009

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

Редактировать: Вот сообщение об ошибке, которое я получил «Невозможно выполнить операцию« Мне нравится »в System.Int32 и System.String.» Это было до того, как я произвел приведение. Затем после выполнения приведения я получил "Выражение содержит неопределенный вызов функции Cast ()."

У кого-нибудь есть идеи?

Спасибо,
Matt

1 Ответ

1 голос
/ 29 июля 2009

Возможно, проблема не в идентификаторе пользователя, ваше изменение должно было это исправить. Скорее всего, проблема связана с одним из других полей сравнения, причем 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 также есть опция сквозного режима.

...