Laden...

SQL Statement mit variirenden Parametern

Erstellt von Baesler vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.852 Views
Baesler Themenstarter:in
113 Beiträge seit 2008
vor 15 Jahren
SQL Statement mit variirenden Parametern

verwendetes Datenbanksystem: <bitte immer angeben>

OLEDB ACCESS

Ich habe da ein Problem zu einem SQL Statement.

Ich möchte gerne aus einer DB Mieterdaten auslesen.
Das Problem ist, dass zu verschiedenen Vermietern unterschiedlich viele Mieter vorhanden sein können.
Die Mieternummern ziehe ich zuvor aus einer anderen Tabelle.
Die Mieternummern sind aber auch nicht in fortlaufender Reihenfolge.

z.B. (1020, 1032, 3004, 21065, 98123)

Mein Statement würde wie folgt aussehen:

SELECT *, *, *, FROM Mieter WHERE Mietnummer = {0} AND {1} AND {2} usw.

Das Sternchen ist nur ein Platzhalter für Spaltennamen

Ich denke aber dass das so nicht gehen wird oder??

Kann mir da eventuell jemand helfen?
Dankeschön!

328 Beiträge seit 2006
vor 15 Jahren

[...] Die Mieternummern ziehe ich zuvor aus einer anderen Tabelle. [...]

Mein Statement würde wie folgt aussehen:

SELECT *, *, *, FROM Mieter WHERE Mietnummer = {0} AND {1} AND {2} usw. [...]

Warum kombinierst Du dann nicht die Abfragen?

SELECT * FROM Mieter
WHERE Mietnummer IN (SELECT Mietnummer FROM AndererTabelle
                                    WHERE Vermieter = 34)

Robert Wachtel

http://blog.robertsoft.de

Baesler Themenstarter:in
113 Beiträge seit 2008
vor 15 Jahren

Coole Sache.

Manchmal denkt man nicht an die einfachste Lösung.

Dankeschön.

Baesler Themenstarter:in
113 Beiträge seit 2008
vor 15 Jahren

Habe da was vergessen zu erwähnen.

Die Mieternummern bekomme ich aus einer Tabelle in der "Daten.mdb".

Die eigentlichen Mieterdaten stehen aber in der DAT00??0?.mdb heißt.

Da klappt dass mit dem o.a Statement nicht wirklich.

Schade.

Einer eine andere Idee?

328 Beiträge seit 2006
vor 15 Jahren

Du meinst, die Tabellen befinden sich in unterschiedlichen Datenbanken? (Ich kenne mich mit Access nicht so gut aus - vorsichtig gesagt.)

Kannst Du mit Access nicht auf unterschiedliche Datenbanken zugreifen?

Ein kurzes Googeln nach access tabelle aus anderer datenbank bringt Hinweise wie

SELECT * FROM Mieter IN 'C:\Pfad\MieterTabelle.mdb'
WHERE Mietnummer IN (SELECT Mietnummer FROM AndererTabelle IN 'C:\Pfad\VermieterTabelle.mdb'
                                    WHERE Vermieter = 34)

Vielleicht funktioniert es ja.

Robert Wachtel

http://blog.robertsoft.de

Baesler Themenstarter:in
113 Beiträge seit 2008
vor 15 Jahren

Ich habe es mal wie folgt versucht:


SELECT M_Mieter.MI_Name1, M_Mieter.MI_Vorname1, M_Mieter.MI_Straße, M_Mieter.MI_PLZ, M_Mieter.MI_Ort, M_Mieter.MI_Mail
FROM M_Mieter
WHERE M_MI_Nummer IN (SELECT Daten.tblMieter.MI_Nummer  FROM tblMieter IN 'C:\Programme\DB\Daten.mdb' WHERE MI_MA_zlr =47 AND MI_OB_zlr =6);

Ich habe diese Abfrage mit dem Access Abfrageassitenten erstellt.
Mich irritiert allerdings, dass wenn ich die Datenblattansicht haben möchte (also das Statement ausführe) kommt die Aufforderung um zwei Parameter einzugeben.

Dieser Sache kann ich nicht ganz folgrn.
Hat da einer eine Idee?

328 Beiträge seit 2006
vor 15 Jahren

Wäre das nicht eher eine Frage für ein Access-Forum? 8)

Robert Wachtel

http://blog.robertsoft.de

Baesler Themenstarter:in
113 Beiträge seit 2008
vor 15 Jahren

Dachte halt nur, jemand hier wüsste das.

Weil ich dass ganze später in meinem Projekt auf C# umbastel muss.

Von daher ist eine funkionierende Grundlage nicht schlecht.

328 Beiträge seit 2006
vor 15 Jahren

Schon klar, aber nicht jeder C#-Entwickler muss sich zwangsläufig mit Access auskennen. 😉

Ich kann an Deinem Statement auf den ersten Blick nichts Auffälliges entdecken.

Die einzige Anmerkung die ich hätte: C:\Programme\DB\Daten.mdb geht irgendwie so gar nicht - Daten gehören in das dafür vorgesehene Verzeichnis, nicht in das Programmverzeichnis.

Robert Wachtel

http://blog.robertsoft.de

Baesler Themenstarter:in
113 Beiträge seit 2008
vor 15 Jahren

Da hast Du natürlich vollkommen Recht.

Ist auch nur ein reines Testverzeichnis.

X
1.177 Beiträge seit 2006
vor 15 Jahren

huhu,

Die einzige Anmerkung die ich hätte: C:\Programme\DB\Daten.mdb geht irgendwie so gar nicht - Daten gehören in das dafür vorgesehene Verzeichnis, nicht in das Programmverzeichnis.

Dem möchte ich gerne widersprechen.
Natürlich sollten "Daten" sehr wohl nach "Dokumente und Einstellungen", wahlweise zu All Users oder zum Benutzer.
Allerdings kann man das doch nicht pauschalisieren. Ich denke, das kommt durchaus auch auf die Anwendung an. Wer sagt denn, dass man das Ding nicht ins Netzwerk installiert? Was passiert, wenn ich ein Programm habe, das vielleicht 1 GB an Daten braucht, aber mein Roaming Profile nur 500MB erlaubt? Was ist, wenn es Laufzeitdaten sind, die periodisch durchgerechnet und dann entsorgt werden?

Ergo muss es zwar Hinweise auf eine gute Vorgehensweise geben, aber es muss auch dem Programmierer einer App ein gewisser Freiraum gelassen werden.

Hat jemand nen Designguide von MS zur Hand?

😃

Xynratron

Herr, schmeiss Hirn vom Himmel - Autsch!

Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.

328 Beiträge seit 2006
vor 15 Jahren

Die einzige Anmerkung die ich hätte: C:\Programme\DB\Daten.mdb geht irgendwie so gar nicht - Daten gehören in das dafür vorgesehene Verzeichnis, nicht in das Programmverzeichnis.

Dem möchte ich gerne widersprechen.
Natürlich sollten "Daten" sehr wohl nach "Dokumente und Einstellungen", wahlweise zu All Users oder zum Benutzer.
Allerdings kann man das doch nicht pauschalisieren. Ich denke, das kommt durchaus auch auf die Anwendung an. Wer sagt denn, dass man das Ding nicht ins Netzwerk installiert? Was passiert, wenn ich ein Programm habe, das vielleicht 1 GB an Daten braucht, aber mein Roaming Profile nur 500MB erlaubt? Was ist, wenn es Laufzeitdaten sind, die periodisch durchgerechnet und dann entsorgt werden? [...]

Und dann würdest Du Daten ins Programmverzeichnis packen? Sicher?

Lies noch mal genau, was ich gesagt habe.

Robert Wachtel

http://blog.robertsoft.de

X
1.177 Beiträge seit 2006
vor 15 Jahren

ach verdammt 😃

C:\Programme\DB

ist natürlich Quatsch. Hab bei "Programmverzeichnis" immer an das Verzeichnis des Programms gedacht ala "C:\Programme\MeineApp\DB".

😃

Xynratron

Herr, schmeiss Hirn vom Himmel - Autsch!

Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.

D
115 Beiträge seit 2006
vor 15 Jahren

Kenn mich jetzt mit Access auch nicht so aus (ich darf nur Oracle), aber wenn du die Mieter anhand der Mietnummern identifizierst und mehrere Mieter laden willst, wieso hast du dann eine AND-Verknüpfung dazwischen. Eigentlich müsste es doch die eine ODER die andere Mietnummer sein...
Und gibt es bei Access kein WHERE Mietnummer IN (nr1, n2) ??

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo zusammen,

zum Thema Access und 2 verschiedene Datenbankdateien siehe auch:
MS Access OleDB Link
zwei Access Tabellen aus verschiedenen DB verknüpfen

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

Baesler Themenstarter:in
113 Beiträge seit 2008
vor 15 Jahren

Also, volgendes Statement funktioniert in der Access DB als Abfrage.



SELECT M_Mieter.MI_Name1, M_Mieter.MI_Vorname1, M_Mieter.MI_Straße, M_Mieter.MI_PLZ, M_Mieter.MI_Ort, M_Mieter.MI_Mail
FROM M_Mieter
WHERE M_Mieter.MI_Nummer  IN (Select tblMieter.MI_Nummer FROM tblMieter IN 'C:\Programme\DB\Daten.mdb' WHERE tblMieter.MI_MA_zlr = 67 AND tblMieter.MI_OB_zlr = 55)


Wenn ich diese Abfrage aus meiner App abschicke, bekomme ich auch die richtigen Werte.

Aber......

Sobald ich mit Parametern arbeite, kommt nichts zurück.
Beispiel unten:



SELECT M_Mieter.MI_Name1, M_Mieter.MI_Vorname1, M_Mieter.MI_Straße, M_Mieter.MI_PLZ, M_Mieter.MI_Ort, M_Mieter.MI_Mail
FROM M_Mieter
WHERE M_Mieter.MI_Nummer  IN (Select tblMieter.MI_Nummer FROM tblMieter IN 'C:\Programme\DB\Daten.mdb' WHERE tblMieter.MI_MA_zlr = {0} AND tblMieter.MI_OB_zlr = {1})


Parameter 0 und 1 sind Zahl bzw Integerwerte.
Im Prog so wie auch in der DB.

Parameter werden auch richtig übergeben.
Mieter müssten da sein.( habs überprüft )

Was könnte da faul sein.
Sobald ich die Werte in Klarschrift ins Statement schreibe, bekomme ich alles.
Bei Parameterwerten ( variablen ) nichts mehr.

Bin ratlos.

F
10.010 Beiträge seit 2004
vor 15 Jahren

Und wo benutzt Du Parameter?
In dem gezeigten string jedenfalls nicht.

J
3.331 Beiträge seit 2006
vor 15 Jahren

Sobald ich mit Parametern arbeite, kommt nichts zurück.

Als Ergänzung zu FZelles Hinweis siehe OpenBook Kap.26.3 Parametrisierte Abfragen - das ist gemeint! Jürgen

Baesler Themenstarter:in
113 Beiträge seit 2008
vor 15 Jahren

Der String steht in den Settings:

Parameterübergabe wie folgt.


string query = String.Format(Properties.Settings.Default.GET_MIETER_DATEN, intmandant, objektnummer);

intmandant und objektnummer sind die Parameter.

GET_MIETER_DATEN ist der SQL String

3.511 Beiträge seit 2005
vor 15 Jahren

Ja, und so ist es falsch.

Hast du den Link von Jürgen angeschaut?

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

Baesler Themenstarter:in
113 Beiträge seit 2008
vor 15 Jahren

Danke für Eure Hilfe, aber habe den Fehler gefunden.

Das Statement wie o.a. und die Parameterübergabe funktionieren!

Das Problem war, dass es in der DB einmal Madantenzaehler gibt und einmal Madantennummer.
Ich habe leider die Flasche genommen.

Die Datenbank ist allerdings auch dass beste Beispiel, wie man es nicht machen sollte.
[ Ich habe die nicht entwickelt! ]

Trotz allem, vielen Dank für Eure Mühe.

F
10.010 Beiträge seit 2004
vor 15 Jahren

Nein, dein Code ist so, wie man es nicht machen sollte

Baesler Themenstarter:in
113 Beiträge seit 2008
vor 15 Jahren

Nur aus reiner Neugier.

Was genau ist denn daran falsch, wenn es doch Funktioniert?

  1. Ist es langsamer?

  2. Ist es unsicherer?

  3. Ist es nur Deiner Meinung nach Falsch, weil Du es anders machst?

Klar habe ich mir den Link angeschaut.
Geht logischerweise auch so, klaro.

84 Beiträge seit 2007
vor 15 Jahren
  1. Ist es langsamer?

Wenn der Benutzer dener Software auf eine geschätzte Millisekunde seines Lebens verzichten kann, dann dürfte es nciht so entscheidend sein..

  1. Ist es unsicherer?

Ja!

  1. Ist es nur seiner Meinung nach Falsch, weil Du es anders machst?

Nein!

In Kürze:

Du baust einen SQLCommand, und fügst dessen **Parameters **-Auflistung Objekte des Typs SqlParameter hinzu. Deren Konstruktoren übergibst du jeweils den Parameter-Alias der entsprechenden Spalte in deinem QueryString und den gewünschten Filterwert, fertig.

Kann sein dass die SqlParameter auch noch den Datentyp wissen wollen, kommt auf deinen DB-Provider an.

F
10.010 Beiträge seit 2004
vor 15 Jahren

@Baesler:

zu 1) Wenn du komplexere Abfragen hast, kann der SQL-Server
die Ausführungspläne nur dann speichern und optimieren, wenn Du
Parametrisierte Queries benutzt.

zu 2) Ganz bestimmt. Such mal nach Sql-Injection.

zu 3) Zusätzlich fallen jegliche Probleme bei Konvertierungen, Datentypen,
und lokalisierungen weg.

Aber das wird hier ja nur 2 mal am tag erklärt.

Baesler Themenstarter:in
113 Beiträge seit 2008
vor 15 Jahren

Vielen Dank für die Hinweise.

Da ich sagen wir mal Anfänger bin, war meine Frage auch ernst gemeint.
Also bin ich jetzt dank eurer Antworten wieder etwas schlauer geworden.

Dankeschön.

(und das ist nicht sarkastisch gemeint) 👍