Como posso fazer um elenco em um SqlDataSource FilterExpression?
-
05-07-2019 - |
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
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.