Domanda

Sto usando una singola casella di testo per cercare un rapporto e filtrare i record. Uno dei miei campi è un int32 e il resto sono varchar. Quindi, quando il filtro tenta di confrontare la stringa dalla casella di testo con il campo int32, viene visualizzato un errore. Ecco SQLDataSouce e la casella di ricerca:

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

Per favore, non bash l'istruzione sql, so che è estremamente inefficiente. Qualcuno sa come modificare il FilterExpression in modo che non riceva un errore quando prova a confrontare il valore della casella di testo con il campo UserID? Ho provato a farlo:

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

ma non ha funzionato. Ho pensato che fare UserID LIKE CAST ('% {0}%' come varchar (4)) non avrebbe funzionato perché se in realtà è una stringa inserita, si otterrebbe un errore.

Modifica: Ecco il messaggio di errore che ho ricevuto " Impossibile eseguire l'operazione "Mi piace" su System.Int32 e System.String. " precedente a il cast. Quindi dopo aver eseguito il cast ho ricevuto " L'espressione contiene una funzione indefinita chiamata Cast (). & Quot;

Qualcuno ha qualche idea?

Grazie,
Matt

È stato utile?

Soluzione

Il problema probabilmente non è UserID, la tua modifica avrebbe dovuto risolverlo. Più probabilmente il problema proviene da uno degli altri campi di confronto, con JoinDate come principale contendente. (Non posso risolverlo perché non so quale sia il formato della data della stringa).


OK, se il formato della data è mm / gg / aa, si desidera modificare il confronto dei filtri di JoinDate in:

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

OK, in base ai messaggi di errore, l'errore non proviene da SQL Server, ma deve provenire da qualcosa sul lato (client). Quello che dovrai fare è capire di cosa si tratta, trovarlo nel tuo codice e quindi

1) prova a impostare un " PassThrough " (o " Passthru "), in modo che non provi prima a convalidarlo,

o 2) cerca la versione di SQL di quella struttura e cambia CAST () nella funzione corrispondente. Ad esempio ODBC farà esattamente quello che stai vedendo qui e poiché ODBC SQL non supporta la funzione CAST devi invece usare la funzione ODBC SQL CONVERT ().

Nota che ODBC ha anche un'opzione di modalità pass-thru.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top