Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
SQL Statement mit variirenden Parametern
Baesler
myCSharp.de - Member

Avatar #avatar-2611.gif


Dabei seit:
Beiträge: 115
Herkunft: Menden

Themenstarter:

SQL Statement mit variirenden Parametern

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
robert.wachtel
myCSharp.de - Member

Avatar #avatar-2287.gif


Dabei seit:
Beiträge: 334
Herkunft: Köln

beantworten | zitieren | melden

Zitat von Baesler
[...] 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
private Nachricht | Beiträge des Benutzers
Baesler
myCSharp.de - Member

Avatar #avatar-2611.gif


Dabei seit:
Beiträge: 115
Herkunft: Menden

Themenstarter:

beantworten | zitieren | melden

Coole Sache.

Manchmal denkt man nicht an die einfachste Lösung.


Dankeschön.
private Nachricht | Beiträge des Benutzers
Baesler
myCSharp.de - Member

Avatar #avatar-2611.gif


Dabei seit:
Beiträge: 115
Herkunft: Menden

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
robert.wachtel
myCSharp.de - Member

Avatar #avatar-2287.gif


Dabei seit:
Beiträge: 334
Herkunft: Köln

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Baesler
myCSharp.de - Member

Avatar #avatar-2611.gif


Dabei seit:
Beiträge: 115
Herkunft: Menden

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
robert.wachtel
myCSharp.de - Member

Avatar #avatar-2287.gif


Dabei seit:
Beiträge: 334
Herkunft: Köln

beantworten | zitieren | melden

Wäre das nicht eher eine Frage für ein Access-Forum? 8)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von robert.wachtel am .
Robert Wachtel

http://blog.robertsoft.de
private Nachricht | Beiträge des Benutzers
Baesler
myCSharp.de - Member

Avatar #avatar-2611.gif


Dabei seit:
Beiträge: 115
Herkunft: Menden

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
robert.wachtel
myCSharp.de - Member

Avatar #avatar-2287.gif


Dabei seit:
Beiträge: 334
Herkunft: Köln

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Baesler
myCSharp.de - Member

Avatar #avatar-2611.gif


Dabei seit:
Beiträge: 115
Herkunft: Menden

Themenstarter:

beantworten | zitieren | melden

Da hast Du natürlich vollkommen Recht.

Ist auch nur ein reines Testverzeichnis.
private Nachricht | Beiträge des Benutzers
Xynratron
myCSharp.de - Member



Dabei seit:
Beiträge: 1184

beantworten | zitieren | melden

huhu,
Zitat von robert.wachtel
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!
Zitat von herbivore
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.
private Nachricht | Beiträge des Benutzers
robert.wachtel
myCSharp.de - Member

Avatar #avatar-2287.gif


Dabei seit:
Beiträge: 334
Herkunft: Köln

beantworten | zitieren | melden

Zitat von Xynratron
Zitat von robert.wachtel
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
private Nachricht | Beiträge des Benutzers
Xynratron
myCSharp.de - Member



Dabei seit:
Beiträge: 1184

beantworten | zitieren | melden

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!
Zitat von herbivore
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.
private Nachricht | Beiträge des Benutzers
d.gierse
myCSharp.de - Member



Dabei seit:
Beiträge: 116

beantworten | zitieren | melden

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) ??
private Nachricht | Beiträge des Benutzers
norman_timo
myCSharp.de - Member

Avatar #avatar-1775.jpeg


Dabei seit:
Beiträge: 4591
Herkunft: Wald-Michelbach (Odw)

beantworten | zitieren | melden

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!”
private Nachricht | Beiträge des Benutzers
Baesler
myCSharp.de - Member

Avatar #avatar-2611.gif


Dabei seit:
Beiträge: 115
Herkunft: Menden

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10083

beantworten | zitieren | melden

Und wo benutzt Du Parameter?
In dem gezeigten string jedenfalls nicht.
private Nachricht | Beiträge des Benutzers
juetho
myCSharp.de - Member



Dabei seit:
Beiträge: 3358
Herkunft: Berlin

beantworten | zitieren | melden

Zitat von Baesler
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
private Nachricht | Beiträge des Benutzers
Baesler
myCSharp.de - Member

Avatar #avatar-2611.gif


Dabei seit:
Beiträge: 115
Herkunft: Menden

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3627
Herkunft: Hannover

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
Baesler
myCSharp.de - Member

Avatar #avatar-2611.gif


Dabei seit:
Beiträge: 115
Herkunft: Menden

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10083

beantworten | zitieren | melden

Nein, dein Code ist so, wie man es nicht machen sollte
private Nachricht | Beiträge des Benutzers
Baesler
myCSharp.de - Member

Avatar #avatar-2611.gif


Dabei seit:
Beiträge: 115
Herkunft: Menden

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Razer
myCSharp.de - Member

Avatar #avatar-2389.jpg


Dabei seit:
Beiträge: 84
Herkunft: BW/DE

beantworten | zitieren | melden

Zitat von Baesler
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..
Zitat von Baesler
2. Ist es unsicherer?
Ja!
Zitat von Baesler
3. 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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Razer am .
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10083

beantworten | zitieren | melden

@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.
private Nachricht | Beiträge des Benutzers
Baesler
myCSharp.de - Member

Avatar #avatar-2611.gif


Dabei seit:
Beiträge: 115
Herkunft: Menden

Themenstarter:

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers