2010-04-21 10 views
8

Ich habe asp:GridView Client-Anforderungen mit asp:SqlDataSource angezeigt. Ich möchte die angezeigten Informationen nach Client beschränken:asp: QueryStringParameter und leere Abfrage String-Parameter

View.aspx muss alles anzeigen, View.aspx?client=1 muss nur Anfragen von Client ID # 1 anzeigen.

So verwende ich <asp:QueryStringParameter Name="client" QueryStringField="client" /> für Abfrage "EXEC getRequests @client".

Alles funktioniert ordnungsgemäß, wenn ein Client angegeben ist. Aber nicht - wenn nicht.

Ich habe meine SP mit SSMS getestet - es funktioniert in beiden Fällen ordnungsgemäß - wenn Parameter angegeben ist und wenn nicht (NULL explizit übergeben).

Was habe ich getan?

+0

Sieht so aus, als ob Sie sich mit diesem Ansatz für einige ziemlich seriöse SQL-Injection-Angriffsvektoren öffnen. – womp

+0

@womp: Wie öffne ich? QueryStringParameter wird in Code-Behind nur für Benutzer mit entsprechenden Rechten und nach einer Reihe von Überprüfungen hinzugefügt. – abatishchev

+0

AH, wenn Sie es sanieren, dann ist das in Ordnung. Es sah einfach von deiner Frage aus, als ob du es direkt benutzt hättest. – womp

Antwort

15

SqlDataSource wird nicht ausgelöst, wenn irgendetwas davon die Parameter null ist, wenn Sie nichts anderes angeben:

<asp:SqlDataSource CancelSelectOnNullParameter="False" /> 

Es könnte auch notwendig sein, um einen Null-Standardwert für Ihren Abfragezeichenfolgeflag Parameter hinzuzufügen:

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

Vielen Dank! Die erste Option macht das, was ich brauche. – abatishchev

+0

Das ist ein wirklich peinlicher Standard (d. H. Es sollte standardmäßig mit NULL-Parametern ausgelöst werden). Ich bin mir ziemlich sicher, dass NULL-Parameter darauf hinweisen, dass "alles" sehr häufig ist. – Ryan

2

Sie benötigen einen Standardwert auf den Parameter für jene Situationen zu definieren, zum Beispiel:

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

und dann in der SP müssen Sie überprüfen, ob der Kunde 0 ist, kehren alle Kunden, da sonst die spezifischen ein.

+0

Ist es möglich, den Standardwert auf' NULL' ('DBNull.Value') zu setzen? – abatishchev

+0

Hmm, ich denke nicht. Aber gibt es einen Grund, NULL anstelle von 0, -1 oder etwas anderem zu verwenden? –

+0

Für 'NULL' ist es einfach, SQL eingebaute Funktion' ISNULL (,) 'zu verwenden. Werte wie 0 oder -1 erforderten zusätzliche 'CASE-WHEN-THEN'-Anweisung in Abfrage – abatishchev