Pregunta

Estoy usando un solo cuadro de texto para buscar un informe y filtrar registros. Uno de mis campos es un int32 y el resto son varchar. Entonces, cuando el filtro intenta comparar la cadena del cuadro de texto con el campo int32, aparece un error. Aquí está el SQLDataSouce y el cuadro de búsqueda:

<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, no golpees la declaración SQL, sé que es extremadamente ineficiente. ¿Alguien sabe cómo cambiar el FilterExpression para que no reciba un error cuando intenta comparar el valor del cuadro de texto con el campo UserID? Intenté hacer esto:

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

pero eso no funcionó. Pensé que hacer UserID LIKE CAST ('% {0}%' como varchar (4)) no funcionaría porque si en realidad es una cadena que ingresaron, obtendrías un error.

Editar: Este es el mensaje de error que recibí " No puedo realizar la operación 'Me gusta' en System.Int32 y System.String. " Eso fue antes de que lo hiciera el elenco. Luego, después de hacer el lanzamiento, obtuve " La expresión contiene una función no definida llamada Cast (). & Quot;

¿Alguien tiene alguna idea?

Gracias,
Matt

¿Fue útil?

Solución

El problema probablemente no sea UserID, su cambio debería haberlo solucionado. Es más probable que el problema provenga de uno de los otros campos de comparación, con JoinDate como el principal contendiente. (No puedo arreglarlo por ti porque no sé cuál es el formato de fecha de tu cadena).


OK, si el formato de fecha es mm / dd / aaa, entonces desea cambiar la comparación de filtro de JoinDate a:

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

Bien, según los mensajes de error, el error no proviene de SQL Server, sino que debe provenir de algo de su lado (cliente). Lo que tendrá que hacer es averiguar qué es eso, encontrarlo en su código y, a continuación, cualquiera de los dos

1) intenta establecer un " PassThrough " (o " Passthru ") modo, para que no intente validarlo primero,

o 2) busque la versión de SQL de esa instalación y cambie el CAST () a la función correspondiente. Por ejemplo, ODBC hará exactamente lo que está viendo aquí y dado que ODBC SQL no admite la función CAST, debe usar la función CONVERT () de ODBC SQL en su lugar.

Tenga en cuenta que ODBC también tiene una opción de modo de acceso directo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top