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!
[...] 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
Coole Sache.
Manchmal denkt man nicht an die einfachste Lösung.
Dankeschön.
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?
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
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?
Wäre das nicht eher eine Frage für ein Access-Forum? 8)
Robert Wachtel
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.
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
Da hast Du natürlich vollkommen Recht.
Ist auch nur ein reines Testverzeichnis.
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.
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
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.
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) ??
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!”
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.
Und wo benutzt Du Parameter?
In dem gezeigten string jedenfalls nicht.
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
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
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)
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.
Nein, dein Code ist so, wie man es nicht machen sollte
Nur aus reiner Neugier.
Was genau ist denn daran falsch, wenn es doch Funktioniert?
Ist es langsamer?
Ist es unsicherer?
Ist es nur Deiner Meinung nach Falsch, weil Du es anders machst?
Klar habe ich mir den Link angeschaut.
Geht logischerweise auch so, klaro.
- 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..
- Ist es unsicherer?
Ja!
- 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.
@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.
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) 👍