Laden...

DB.Null.Value und MSSQL NULL

Erstellt von Maximus vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.979 Views
M
Maximus Themenstarter:in
97 Beiträge seit 2006
vor 17 Jahren
DB.Null.Value und MSSQL NULL

Hallo,

ich habe folgendes Problem:

Ich lese aus 3 DropDownList Werte aus die als Filter mittels Parameter für einen SQL-Command dienen. Bei einem Item der DropDownListen übergebe ich den Wert DBNull.Value.ToString().
Damit will ich erreichen, dass die Ergebnisse des SQL-Commands nicht gefiltert werden.
Die Parameter weden mittel des ASP-Tags ControlParamter an das SqlDataSource gebunden:

<asp:SqlDataSource ID="sdsSpiele" runat="server" ConnectionString="<%$ ConnectionStrings:BundesligaVerbindungsString %>" SelectCommandType="StoredProcedure" SelectCommand="ErmittelSpiele">
                    <SelectParameters>
                        <asp:ControlParameter ControlID="ddl_FilterSpieltage" Name="filter_spieltag"
                            PropertyName="SelectedValue" Type="Int32" />
                        <asp:ControlParameter ControlID="ddl_FilterHeimTeam" Name="filter_heimteam"
                            PropertyName="SelectedValue" Type="Int32" />
                        <asp:ControlParameter ControlID="ddl_FilterGastTeam" Name="filter_gastteam"
                            PropertyName="SelectedValue" Type="Int32" />
                    </SelectParameters>
                </asp:SqlDataSource>

Hier der SQL-Command:

ALTER PROCEDURE dbo.ErmittelSpiele
	
	(
		@filter_spieltag int,
		@filter_heimteam int,
		@filter_gastteam int
	)
	
AS
	        SELECT A.spiel_id, A.spieltag_id, B.mannschafts_name, C.mannschafts_name, D.spieltag_datum, D.spieltag_name, D.spieltag_id
	        FROM Spiele A, Mannschaften B, Mannschaften C, Spieltage D
	        WHERE A.mannschaft_a = B.mannschafts_id AND A.mannschaft_b = C.mannschafts_id AND A.spieltag_id = D.spieltag_id AND (@filter_spieltag IS NULL OR D.spieltag_id=@filter_spieltag) AND (@filter_heimteam IS NULL OR B.mannschafts_id=@filter_heimteam) AND (@filter_gastteam IS NULL OR C.mannschafts_id=@filter_gastteam);

Leider liefert der SQL-Command KEINE Zeilen zurück obwohl er eigentlich nun alle anzeigen müsste. Wo liegt mein Fehler?

Das gleiche Problem hat im Forum "Windows-Technologien" angefangen und dort auch einen Post - da es aber jetzt mehr Richtung SQL geht, habe ich das Problem hier nochmal gepostet.

Falls es eine einfache Lösung gibt, wäre es nett, wenn Ihr mir die mitteilen könntet und den entsprechenden Post im anderen Forum schließt.

Im Voraus besten Dank.
Gruß
Maximus!

Die Schnecke kann Dir mehr über den Weg erzählen als der Hase.

476 Beiträge seit 2004
vor 17 Jahren

hallo Maximus,

mit der "ALTER PROCEDURE"-Anweisung führst du die Prozedur nicht aus, du änderst sie nur immer wieder. Daher gibt dein SQLCommand auch kein Abfrageergebnis zurück.

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de

M
Maximus Themenstarter:in
97 Beiträge seit 2006
vor 17 Jahren

Hallo,

das ist nicht ganz richtig.
Die Proezedur besteht ja bereits und gibt auch wenn die 3 Parameter richtig gefüllt sind was zurück.
Das Problem liegt aber darin, dass es nichts zurückgibt, wenn die 3 Parameter = null sind.
Dabei sollten dann eigentlich ALLE Datensätze angezeigt werden.

Beispiel:
Die 3 DropDownLists geben die Werte "1","2","1" zurück: Hier filter der Command richtig und zeigt nur den entsprechendne Datensatz an.
Die 3 DropDownLists geben die Wert DBNull.Value, DBNull.Value, DBNull.Value zurück: Jetzt werden KEINE Datensätze angezeigt, obwohl eigentlich ALLE angezeigt werden sollten.

Gibt es vielleicht eine andere einfachere Möglichkeit, so etwas zu realisieren?
im Prinzip möchte ich ja nur, dass wenn keine Filter gesetzt werden (per Drop-Down-List) alle Datensätze angezeigt werden und wenn Filter gesetzt sind, diese auch berücksichtigt werden.

Danke für Deine Hilfe.
Sorry, bin neu in der Datenbankprogrammierung.

Gruß
Maximus!

Die Schnecke kann Dir mehr über den Weg erzählen als der Hase.

M
Maximus Themenstarter:in
97 Beiträge seit 2006
vor 17 Jahren

Problem gelöst:

Falls es jemand interessiert:

Man muss bei dem SqlDataSource die Eigenschaft CancelSelectOnNullParameter auf FALSE setzen.

Und schon läuft alles wie geschmiert!

Trotzdem vielen Dank für Eure Hilfe.
Tolles Forum! Ihr werdet mich so schnell nicht wieder los! 😉

Gruss
Maximus

Die Schnecke kann Dir mehr über den Weg erzählen als der Hase.

476 Beiträge seit 2004
vor 17 Jahren

hallo Maximus,

gut, dass es am ALTER liegt habe ich nur vermutet, nicht getestet ;o). Aber, wenn die Prozedur schon existiert, weshalb verwendest du dann immer ALTER? Weshalb die Prozedur nicht direkt aufrufen, bzw. die Abfrage ohne Prozedur ausführen?

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de

M
Maximus Themenstarter:in
97 Beiträge seit 2006
vor 17 Jahren

Es handelt sich dabei im eine Stored Procedure.
Da muss doch immer ALTER oder CREATE vorne stehen, oder ist das falsche?
Wie sieht die Stored Procedure denn richtig aus?

Gruss
Maximus!

Die Schnecke kann Dir mehr über den Weg erzählen als der Hase.

476 Beiträge seit 2004
vor 17 Jahren

hallo Maximus,

wenn du die Stored Procedure bei jedem Aufruf mit einer Änderungsanweisung aufrufst, nimmst du dir die ganzen Vorteile wie beispielsweise bereits erstellter Ausführungsplan, wegfallender Syntax-Check usw.

Eine Stored Procedure ruft man normalerweise mit ihrem Namen auf, allerdings musst du den CommandType auf StoredProcedure stellen, Parameter anhängen und fertig.

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de

M
Maximus Themenstarter:in
97 Beiträge seit 2006
vor 17 Jahren

Hi,

ich glaube wir reden hier aneinander vorbei.
So rufe ich die Stored Procedur auf:


<asp:SqlDataSource ID="sdsSpiele" runat="server" ConnectionString="<%$ ConnectionStrings:BundesligaVerbindungsString %>" SelectCommandType="StoredProcedure" SelectCommand="ErmittelSpiele" CancelSelectOnNullParameter="False">
                    <SelectParameters>
                        <asp:ControlParameter ControlID="ddl_FilterSpieltage" Name="filter_spieltag"
                            PropertyName="SelectedValue" Type="Int32" />

...und dann folgen noch weitere Parameter.

Und das hier IST die Gespeicherte Prozedur:


ALTER PROCEDURE dbo.ErmittelSpiele
	
	(
		@filter_spieltag int,
		@filter_heimteam int,
		@filter_gastteam int
	)
	
AS
	        SELECT A.spiel_id, A.spieltag_id, B.mannschafts_name, C.mannschafts_name, D.spieltag_datum, D.spieltag_name, D.spieltag_id
	        FROM Spiele A, Mannschaften B, Mannschaften C, Spieltage D
	        WHERE A.mannschaft_a = B.mannschafts_id AND A.mannschaft_b = C.mannschafts_id AND A.spieltag_id = D.spieltag_id AND (@filter_spieltag IS NULL OR D.spieltag_id=@filter_spieltag) AND (@filter_heimteam IS NULL OR B.mannschafts_id=@filter_heimteam) AND (@filter_gastteam IS NULL OR C.mannschafts_id=@filter_gastteam);

	
	RETURN

Wie müsste die Gespeicherte Prozeudur denn ohle das "ALTER" aussehen?

Gruss
Maximus

Die Schnecke kann Dir mehr über den Weg erzählen als der Hase.

476 Beiträge seit 2004
vor 17 Jahren

hallo Maximus,

Dein eingehendes "Hier der SQLCommand" aus dem ersten Posting hat mich sowas von auf die Falsche Spur gebracht. Joi, das ist ja der Code der gespeicherten Prozedur. Sowas von peinlich... ist alles richtig. Sorry, dass ich für Verwirrung sorgte, bin etwas neben der Spur X(.

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de

M
Maximus Themenstarter:in
97 Beiträge seit 2006
vor 17 Jahren

Na dann ist ja alles wieder gut.

Threat geschlossen.

Die Schnecke kann Dir mehr über den Weg erzählen als der Hase.