Frage

Ich bin mit einem einzigen Textbox einen Bericht zu suchen und Datensätze herauszufiltern. Einer meiner Felder ist ein int32 und der Rest sind varchar ist. Also, wenn die Filter die Zeichenfolge der Textbox mit dem int32 Feld zu vergleichen versucht, erhalte ich einen Fehler. Hier sind die SqlDatasouce und das Suchfeld:

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

Bitte verwenden Sie die SQL-Anweisung nicht bash, ich weiß, es ist extrem ineffizient. Wer weiß, wie die FilterExpression zu ändern, so dass ich nicht einen Fehler, wenn es versucht, den Textbox-Wert mit dem Benutzer-ID-Feld zu vergleichen? Ich habe versucht, dies zu tun:

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

, aber das hat nicht funktioniert. Ich stellte dar, tun UserID LIKE CAST('%{0}%' as varchar(4)) nicht, weil funktionieren würde, wenn es tatsächlich eine Zeichenfolge ist, dass sie eingegeben dann würden Sie eine Fehlermeldung erhalten.

Edit: ist die Fehlermeldung I got "Can not Betrieb 'Like' führt auf System.Int32 und System.String." Das war, bevor ich die Besetzung tat . Dann, nachdem ich die Besetzung habe ich bekam "Der Ausdruck enthält nicht definierte Funktionsaufruf Cast ()."

Wer irgendwelche Ideen?

Danke,
Matt

War es hilfreich?

Lösung

Das Problem wahrscheinlich nicht UserID ist, sollten Sie Ihre Änderung, die behoben haben. Wahrscheinlicher ist das Problem von einem der anderen Vergleichsfelder kommt, mit JoinDate der führende Anwärter zu sein. (Ich kann nicht reparieren für Sie, weil ich nicht weiß, was die Zeichenfolge Datumsformat).


OK, wenn Datumsformat tt / mm / yyy dann wollen Sie den Filter-Vergleich von JoinDate ändern:

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

OK, basierend auf den Fehlermeldungen wird der Fehler kommt nicht von SQL Server, sondern muss von etwas auf (Client) Seite kommen. Was Sie tun müssen, ist, herauszufinden, was das ist, finden Sie es in Ihrem Code, und dann entweder

1) versuchen, einen „Pass-Through“ zu setzen (oder „Passthru“) Modus, so dass sie es nicht versuchen, zuerst zu überprüfen,

oder 2) Nachschlag dieser Anlage-Version von SQL und ändern Sie die CAST () auf die entsprechende Funktion. Zum Beispiel wird ODBC tun genau das, was Sie hier und wie ODBC SQL sehen nicht die CAST-Funktion, die Sie unterstützt haben, die ODBC-SQL-Funktion CONVERT () stattdessen verwenden.

Beachten Sie, dass ODBC hat auch einen Pass-Thru-Modus Option.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top