¿Cómo puedo hacer un lanzamiento en un SqlDataSource FilterExpression?
-
05-07-2019 - |
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
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.