Question

J'utilise un seul champ de texte pour rechercher un rapport et filtrer les enregistrements. Un de mes champs est un int32 et le reste appartient à varchar. Ainsi, lorsque le filtre essaie de comparer la chaîne de la zone de texte au champ int32, une erreur se produit. Voici le SQLDataSouce et le champ de recherche:

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

S'il vous plaît, ne critiquez pas la déclaration SQL, je sais que c'est extrêmement inefficace. Est-ce que quelqu'un sait comment changer FilterExpression afin que je ne reçois pas d'erreur en essayant de comparer la valeur de la zone de texte avec le champ UserID? J'ai essayé de faire ceci:

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

mais cela n'a pas fonctionné. Je pensais que faire UserID LIKE CAST ('% {0}%' comme varchar (4)) ne fonctionnerait pas, car si c'est en fait une chaîne qu'ils ont entrée, vous obtiendrez une erreur.

Modifier: voici le message d'erreur que j'ai "Impossible d'effectuer l'opération" sur "sur System.Int32 et System.String." "C'était avant moi. le casting. Puis, après avoir fait le casting, j'ai obtenu "L'expression contient l'appel de fonction non défini Cast ()."

Quelqu'un a des idées?

Merci,
Matt

Était-ce utile?

La solution

Le problème n'est probablement pas l'ID utilisateur, votre modification aurait dû résoudre ce problème. Plus probablement, le problème provient d'un des autres champs de comparaison, JoinDate étant le principal concurrent. (Je ne peux pas résoudre ce problème pour vous car je ne sais pas quel est le format de votre date de chaîne).

OK, si le format de date est mm / jj / aaaa, vous voulez changer la comparaison de filtre de JoinDate en:

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

OK, selon les messages d'erreur, l'erreur ne provient pas de SQL Server, mais doit provenir de quelque chose de votre côté (client). Ce que vous devez faire, c'est comprendre ce que cela signifie, le trouver dans votre code, puis

1) essayez de définir un " PassThrough " (ou "Passthru"), afin qu’il n’essaye pas de le valider d’abord,

ou 2) recherchez la version de SQL de cette installation et remplacez CAST () par la fonction correspondante. Par exemple, ODBC fera exactement ce que vous voyez ici et comme ODBC SQL ne prend pas en charge la fonction CAST, vous devez utiliser la fonction ODBC SQL CONVERT () à la place.

Notez que ODBC dispose également d'une option de mode Pass-Thru.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top