2010-04-21 12 views
8

Tengo asp:GridView mostrando las solicitudes de los clientes usando asp:SqlDataSource. Quiero limitar la información mostrada por cliente:asp: QueryStringParameter y el parámetro de cadena de consulta vacía

View.aspx tiene que mostrar todo, View.aspx?client=1 tiene que mostrar solo las solicitudes de la ID de cliente n. ° 1.

Así que estoy usando <asp:QueryStringParameter Name="client" QueryStringField="client" /> para la consulta "EXEC getRequests @client".

Todo funciona correctamente cuando se especifica un cliente. Pero no, si no.

Probé mi SP usando SSMS - funciona correctamente en ambos casos - cuando se especifica el parámetro y cuando no (NULL pasó explícitamente).

¿Qué tengo que hacer?

+0

Parece que te estás abriendo a algunos vectores de ataque de inyección SQL bastante serios con este enfoque. – womp

+0

@womp: ¿Cómo estoy abriendo? QueryStringParameter se agrega en código subyacente solo para usuarios con los derechos adecuados y después de una serie de comprobaciones. – abatishchev

+0

AH, si lo desinfecta, está bien. Simplemente miró de tu pregunta como si la estuvieras usando directamente. – womp

Respuesta

15

SqlDataSource no se disparará si cualquiera de sus parámetros son nulos, a no ser que se especifique lo contrario:

<asp:SqlDataSource CancelSelectOnNullParameter="False" /> 

También podría ser necesario añadir un valor predeterminado nulo a su parámetro de cadena de consulta:

<asp:QueryStringParameter Name="client" QueryStringField="client" DefaultValue="" ConvertEmptyStringToNull="True" /> 
+1

¡Muchas gracias! La primera opción hace lo que necesito. – abatishchev

+0

Es un valor predeterminado muy incómodo (es decir, debería iniciarse con parámetros NULL de forma predeterminada). Estoy bastante seguro de que los parámetros NULL para indicar "todo" son muy comunes. – Ryan

2

es necesario definir un valor predeterminado para el parámetro para esas situaciones, por ejemplo:

<asp:QueryStringParameter Name="client" QueryStringField="client" DefaultValue="0"/> 

y luego en el SP que necesita verificar si el cliente es 0, devolver todos los clientes, de lo contrario la específica uno.

+0

¿Es posible establecer el valor predeterminado en 'NULL' (' DBNull.Value')? – abatishchev

+0

Hmm, no lo creo. ¿Pero hay una razón para usar NULL en lugar de 0, -1 o algo más? –

+0

Para 'NULL' es fácil usar la función incorporada de SQL' ISNULL (,) '. Los valores como 0 o -1 requieren una instrucción adicional 'CASE-WHEN-THEN' en la consulta – abatishchev

Cuestiones relacionadas