문제

단일 텍스트 상자를 사용하여 보고서를 검색하고 레코드를 필터링합니다. 내 필드 중 하나는 int32이고 나머지는 Varchar 's입니다. 따라서 필터가 텍스트 상자의 문자열을 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에서 'Like'Operation을 수행 할 수 없습니다." 그게 내가 캐스트를하기 전이었습니다. 그런 다음 캐스트를 한 후 나는 얻었다 "표현식에는 정의되지 않은 함수 호출 cast ()가 포함되어 있습니다."

누구든지 아이디어가 있습니까?

감사,
매트

도움이 되었습니까?

해결책

문제는 아마도 userID가 아니며, 당신의 변화는 그것을 해결해야했을 것입니다. 다른 비교 분야 중 하나에서 문제가 발생했을 가능성이 높으며 Joindate는 주요 경쟁자입니다. (문자열 날짜 형식이 무엇인지 모르기 때문에 당신을 위해 그것을 고칠 수 없습니다).


자, 날짜 형식이 mm/dd/yyy 인 경우 Joindate의 필터 비교를 다음과 같이 변경하려고합니다.

OR CONVERT(Varchar(10), JoinDate, 101) LIKE '%{0}%'

Ok, 오류 메시지를 기반으로 오류는 SQL Server에서 나오지 않지만 (클라이언트) 측면의 무언가에서 나와야합니다. 당신이해야 할 일은 그것이 무엇인지 알아 내고 코드에서 찾은 다음 어느 쪽이든

1) "Passthrough"(또는 "Passthru") 모드를 설정하여 먼저 검증하려고하지 않도록하십시오.

또는 2) 해당 시설의 SQL 버전을 조회하고 Cast ()를 해당 함수로 변경합니다. 예를 들어 ODBC는 여기에서보고있는 작업을 정확하게 수행하며 ODBC SQL은 캐스트 기능을 지원하지 않으므로 ODBC SQL Convert () 함수를 대신 사용해야합니다.

ODBC에는 패스 스루 모드 옵션도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top