Pergunta

Eu estou usando uma única caixa de texto para pesquisar um relatório e filtrar registros. Uma das minhas áreas é um int32 eo resto são varchar de. Então, quando as tentativas de filtro para comparar a seqüência de caracteres de caixa de texto com o campo int32, eu recebo um erro. Aqui está o SQLDataSouce e caixa de pesquisa:

<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>

Por favor, não bater a instrução SQL, eu sei que é extremamente ineficiente. Alguém sabe como alterar o FilterExpression para que eu não obter um erro quando se tenta comparar o valor caixa de texto com o campo UserID? Eu tentei fazer isso:

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}%'"

mas isso não funcionou. Eu imaginei fazendo UserID LIKE CAST('%{0}%' as varchar(4)) não iria funcionar porque se ele é realmente uma cadeia que eles entraram então você obtém um erro.

Editar: Aqui está a mensagem de erro que eu tenho "Não é possível executar a operação 'Like' em System.Int32 e System.String." Isso foi antes de eu fiz o elenco . Em seguida, depois que eu fiz o elenco eu tenho "A expressão contém função indefinida chamada Elenco ()".

Alguém tem alguma idéia?

Obrigado,
Matt

Foi útil?

Solução

O problema provavelmente não é UserID, a alteração deveria ter corrigido isso. Mais provavelmente o problema está vindo de um dos outros campos de comparação, com JoinDate ser o mais cotado. (Eu não posso corrigir isso para você porque eu não sei o que o seu formato de data string é).


OK, se o formato de data é MM / DD / AAAA, em seguida, você quer mudar a comparação filtro de JoinDate a:

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

OK, com base nas mensagens de erro, o erro não é proveniente do SQL Server, mas deve ser proveniente de algo do seu lado (cliente). O que você precisa fazer é descobrir o que é isso, encontrá-lo em seu código, e então

1) tentar definir um modo de "PassThrough" (ou "Passthru"), para que ele não tenta validar primeiro,

ou 2) lookup versão que da instalação de SQL e mudar o CAST () para a função correspondente. Por exemplo ODBC vai fazer exatamente o que você está vendo aqui e como ODBC SQL não suporta a função de conversão que você tem que usar a função CONVERT ODBC SQL () em vez.

Note que ODBC também tem um passe-thru opção de modo bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top