Case in der Where Bedingung

19/10/2008 - 11:22 von Selami Sulejmani | Report spam
Hi Leute

Für unseren Prototyp (eine Webanwendung) haben wir einen Acces
Datenbank, da die viel schneller mit den Daten füllbar ist.

Nun habe ich festgestellt, dass Access den Case befehl garnicht kennt.

Folgendes will ich realisieren:

Auf der Masterseite habe ich 2 Dropdonwlisten, die ich als Suchfilter
verwenden will.

So sieht der Code aus:


string selectCat = "SELECT tblVerteiler.ver_name,tblProdukte.pr_marke,"+
.
.
.
"WHERE tblVerteiler.ver_name = CASE WHEN @VerName = 0 THEN
tblVerteiler.ver_name ELSE @VerName END " +
"AND tblProdukte.pr_marke = CASE WHEN @MarkeName = 0 THEN
tblProdukte.pr_marke ELSE @MarkeName END";

OleDbDataAdapter adp = new OleDbDataAdapter(selectCat, conn);

string verteiler = "0";
DropDownList myVerteiler = (DropDownList)Master.FindControl("ddKonkurrent");
if (myVerteiler != null)
{
if (myVerteiler.SelectedValue != "0")
{
verteiler = myVerteiler.SelectedItem.ToString();
}
}

string marke = "0";
DropDownList myMarke = (DropDownList)Master.FindControl("ddMarke");
if (myMarke != null)
{
if (myMarke.SelectedValue != "0")
{
marke = myMarke.SelectedItem.ToString();
}
}

adp.SelectCommand.Parameters.Add("@VerName", SqlDbType.Char);
adp.SelectCommand.Parameters["@VerName"].Value = verteiler;

adp.SelectCommand.Parameters.Add("@MarkeName", OleDbType.VarChar);
adp.SelectCommand.Parameters["@MarkeName"].Value = marke;

adp.Fill(myDS);

GridView1.DataSource = myDS;
GridView1.DataBind();


Wiess jemand wie ich das im Access lösen kann???

Vielen Dank für euere Unterstützung.

Gruss Selami
 

Lesen sie die antworten

#1 Elmar Boye
19/10/2008 - 19:06 | Warnen spam
Hallo Selami,

"Selami Sulejmani" schrieb ...
Für unseren Prototyp (eine Webanwendung) haben wir einen Acces Datenbank,
da die viel schneller mit den Daten füllbar ist.



Naja, eine SQL Server Datenbank kann man ebenso schnell mit Daten befüllen.
Falls Dir Access bei der Dateneingabe lieb und teuer ist, so könntest Du
z. B. mit eingebundenen Tabellen arbeiten.

Nun habe ich festgestellt, dass Access den Case befehl garnicht kennt.



Da wàre das mit IIF(...) nachzustellen, ggf. mehrfach geschachtelt.
Das größere Problem wàre aber, das der OleDb Provider bei
Access mit positionellen Parametern arbeitet.
Du also mit zwei verschiedenen Sàtzen von SQL Befehlen arbeiten müßtest.

Durch einen DAL kann man das zwar schon regeln, nur ob der Aufwand
für einen Prototyp gerechtfertigt ist, steht auf einem anderen Blatt.
IMO: Wenn die Anwendung schließlich auf einem SQL Server laufen soll,
arbeitet besser gleich damit.

"WHERE tblVerteiler.ver_name = CASE WHEN @VerName = 0 THEN
tblVerteiler.ver_name ELSE @VerName END " +



Hier vergleichst Du auf einen numerischen Wert, ...

adp.SelectCommand.Parameters.Add("@VerName", SqlDbType.Char);
adp.SelectCommand.Parameters["@VerName"].Value = verteiler;



... wàhrend Du hier mit Zeichendaten arbeitest. Das geht schon mal daneben.

Zum anderen sollten Zeichendaten immer mit der Lànge angegeben werden.
Zudem ist den meisten Fàllen (N)VARCHAR für eine variable Lànge angebracht,
denn (N)CHAR Daten werden mit Leerzeichen aufgefüllt, was spàtestens bei
LIKE @Parameter + '%' keinem Ergebnis führt.

Da .NET mit Unicode arbeitet sollte ihr besser gleich mit den
Unicode-Datentypen
sowohl im SQL Server alsauch im Client arbeiten.
(Die Jet 4.0 arbeitet ohnehin immer mit Unicode - falls ihr dabei bleiben
wollt)

Wiess jemand wie ich das im Access lösen kann???



Vorzuziehen wàre (Access wie SQL Server):

WHERE (? IS NOT NULL AND tblVerteiler.ver_name = ?)

oder mit IIF:

WHERE verteiler.ver_name = IIF(? <> '', ?, tblVerteiler.ver_name)

Beachte das Du bei Access den Parameter zweimal angeben mußt -
d. h. für jedes "?" einmal.

Gruß Elmar

Ähnliche fragen