2010-04-21 12 views
8

Mam asp:GridView wyświetlanie żądań klientów za pomocą asp:SqlDataSource. Chcę ograniczyć wyświetlane informacje przez klienta:asp: QueryStringParameter i pusty parametr ciągu zapytania

View.aspx musi wyświetlić wszystko, View.aspx?client=1 ma wyświetlić tylko żądania z ID klienta # 1.

Używam więc <asp:QueryStringParameter Name="client" QueryStringField="client" /> dla zapytania "EXEC getRequests @client".

Wszystko działa poprawnie, gdy określony jest określony klient. Ale nie - jeśli nie.

Przetestowałem mój SP przy użyciu SSMS - działa on poprawnie w obu przypadkach - gdy parametr jest określony, a gdy nie jest (NULL przekazany jawnie).

Co mam zrobić?

+0

Wygląda na to, że otwierasz się do całkiem poważnych wektorów ataku SQL z takim podejściem. – womp

+0

@womp: Jak się otwieram? QueryStringParameter jest dodawany z opóźnieniem kodu tylko dla użytkowników z odpowiednimi uprawnieniami i po wielu kontrolach. – abatishchev

+0

AH, jeśli to oczyszczasz, to w porządku. Wyglądało to tak, jakbyś używał go bezpośrednio. – womp

Odpowiedz

15

SqlDataSource nie zadziała, jeśli którykolwiek z jego parametry są nieważne, chyba że określono inaczej:

<asp:SqlDataSource CancelSelectOnNullParameter="False" /> 

może być również konieczne, aby dodać domyślną wartość zerową do parametru kwerendy:

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

Dziękuję bardzo! Pierwsza opcja robi to, czego potrzebuję. – abatishchev

+0

To naprawdę niezręczna wartość domyślna (tzn. Powinna być domyślnie uruchamiana z wartościami NULL). Jestem całkiem pewny, że NULL params, aby wskazać "wszystko" są bardzo powszechne. – Ryan

2

Trzeba zdefiniować domyślną wartość parametru dla tych sytuacjach, na przykład:

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

a następnie w SP trzeba sprawdzić, czy klient jest 0, powrót wszystkich klientów, w przeciwnym razie specyficzny jeden.

+0

Czy można ustawić wartość domyślną na" NULL "(" DBNull.Value ")? – abatishchev

+0

Hmm, nie sądzę. Ale czy istnieje powód, aby używać wartości NULL zamiast 0, -1 lub czegoś innego? –

+0

Dla 'NULL' jest łatwa w użyciu wbudowana funkcja SQL' ISNULL (,) '. Wartości takie jak 0 lub -1 wymagały dodatkowej instrukcji 'CASE-WHEN-THEN' na zapytanie – abatishchev

Powiązane problemy