Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi In Access gespeicherte SQL-Abfragen mit Parametern aufrufen? (https://www.delphipraxis.net/126746-access-gespeicherte-sql-abfragen-mit-parametern-aufrufen.html)

torud 1. Jan 2009 18:43

Datenbank: Access & MySql • Zugriff über: Jet & ODBC

In Access gespeicherte SQL-Abfragen mit Parametern aufrufen?
 
Hallo Wissende,

ein Kollege und ich sollen für ein Projekt ein Programm schreiben. Leider werden uns dabei die Daten und deren Struktur fest vorgegeben. In dem Projekt werden die Daten in einer mySql-Datenbank gehalten und über eine Access-Datenbank aufgerufen. Die Kollegen haben das wohl aus dem Grund so gemacht, weil sie in Access gleich ein Makro haben laufen lassen, welches die Daten wie in einem Programm ausgewertet darstellt.

Wir sollen nun darauf aufsetzen. Da wir schon ein ähnliches Projekt hatten, stellt sich uns nun die Frage, ob es nicht clever wäre alle SQL-Abfragen, die wir brauchen "fertig" in der Access-Datenbank anzulegen und diese Abfragen dann nur noch über eine ADOConnection mit AdoQuery oder AdoDataset "anzusprechen" und der Abfrage die benötigten Parameter zu übergeben. Vorteil wäre aus unserer Sicht, dass der Benutzer auch mal eine SQL-Abfrage nachträglich ändern kann (ohne dabei die Parameter zu ändern), ohne das das Delphi-Programm neu kompiliert werden muss.

1. Macht das Sinn?
2. Geht das überhaupt?
3. Wie geht das denn?

Also ich habe mir in Access mal die Abfragen angeschaut und teilweise bei einem Doppeltklick Abfrage zu diversen Parametern erhalten. Also sollte das so ja gehen. Wie müsste ich das aber im Programm selbst machen? Eine Query kann ja hier nicht zum Einsatz kommen, da die ja einen SQL-Befehl erwartet.

Ich würde mich wirklich über Antworten freuen. Bis dahin werde ich erstmal im Forum weitersuchen...

mkinzler 1. Jan 2009 19:52

Re: In Access gespeicherte SQL-Abfragen mit Parametern aufru
 
da Access nicht unbedingt wegen seiner Stabilität und Geschwindigkeit bekannt ist, würde ich die Abfragen eher als Views oder SPs direkt in MySQL ablegen.

torud 3. Jan 2009 21:01

Re: In Access gespeicherte SQL-Abfragen mit Parametern aufru
 
Vielen Dank für Deine Antwort. Leider müssen wir mit der Access-DB arbeiten, da in dieser auch noch Tabellen drin sind, die Grundlage für weiteres Vorgehen sind.

Ich habe nun auch schon gefunden, dass man mit AdoQuery und AdoDataset in einer mdb-Datein gespeicherte Abfrage ansprechen kann und denen Parameter übergeben kann. Leider erhalte ich immer die Fehlermeldung, dass der Parameter in meiner Abfrage nicht gefunden werden kann. Folgende Daten nutze ich:

gespeicherte Abfrage in Access (qer_tv_schedule) -> Parameter am Ende xMeetingId
SQL-Code:
SELECT runde.Startzeit, disziplin.Name AS DISZIPLIN, kategorie.Name AS KAT, rundentyp.Name AS RUNDE, runde.Status, runde.xRunde, runde.xWettkampf, runde.Gruppe, wettkampf.xDisziplin, wettkampf.xKategorie
FROM (((runde INNER JOIN rundentyp ON runde.xRundentyp=rundentyp.xRundentyp) INNER JOIN wettkampf ON runde.xWettkampf=wettkampf.xWettkampf) INNER JOIN disziplin ON wettkampf.xDisziplin=disziplin.xDisziplin) INNER JOIN kategorie ON wettkampf.xKategorie=kategorie.xKategorie
WHERE wettkampf.xMeeting = :xMeetingId;
Delphi-Quellcode:
  with dm.ADODataSet1 do
    begin
      Close;
      CommandType := cmdTable;
      CommandText := 'qer_tv_schedule';
      Parameters.ParamValues['xMeetingId'] := lbl_meeting_id.Caption;
      Open;
    end;
Fehlermeldung:
Im Projekt Projekt.exe ist eine Exception der Klasse EDatabaseError aufgetreten. Meldung: 'ADODataSet1: Parameter 'xMeetingId' nicht gefunden'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.

Seht mir Fehler bitte nach, da ich das zum ersten mal mache. Aber eigentlich könnt Ihr ja sehen, dass der Parameter namenstechnisch im Access-File vorhanden ist und auch so im Delphi angegeben wird. Ideen?

omata 3. Jan 2009 23:21

Re: In Access gespeicherte SQL-Abfragen mit Parametern aufru
 
Ändere deine gespeicherte Abfrage (lösche die Where-Klausel)...
SQL-Code:
SELECT runde.Startzeit, disziplin.Name AS DISZIPLIN, kategorie.Name AS KAT, rundentyp.Name AS RUNDE, runde.Status, runde.xRunde, runde.xWettkampf, runde.Gruppe, wettkampf.xDisziplin, wettkampf.xKategorie
FROM (((runde INNER JOIN rundentyp ON runde.xRundentyp=rundentyp.xRundentyp) INNER JOIN wettkampf ON runde.xWettkampf=wettkampf.xWettkampf) INNER JOIN disziplin ON wettkampf.xDisziplin=disziplin.xDisziplin) INNER JOIN kategorie ON wettkampf.xKategorie=kategorie.xKategorie;
Dann kannst du die Abfrage benutzen und einschränken...
Delphi-Quellcode:
ADODataSet.Close;
ADODataSet.CommandType := cmdText;
ADODataSet.CommandText :=
  'SELECT *'#13 +
  'FROM qer_tv_schedule'#13 +
  'WHERE xMeeting = :xMeetingId';
ADODataSet.Parameters.ParamByName('xMeetingId').Value := lbl_meeting_id.Caption;
ADODataSet.Open;

torud 3. Jan 2009 23:34

Re: In Access gespeicherte SQL-Abfragen mit Parametern aufru
 
Hallo,

danke für Deine Antwort. 3 Probleme/Fragen habe ich dazu.

1. Ich erhalte nun folgende Fehlermeldung:

Im Projekt Projekt.exe ist eine Exception der Klasse EOleException aufgetreten. Meldung: 'Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.

Beim Debuggen konnte ich aber zweifelsfrei feststellen, dass der Parameter den gewünschten Wert von 40 oder 41 hatte. Was ist also die Ursache für das Problem?

2. Ich hatte eigentlich die Hoffnung dass man die gespeichert Abfrage im Access schon fix und fertig mit den Parameterbezeichnungen versehen kann. Damit sind dann komplexere InnerKoin-Abfragen relative "einfach" zu händeln. Man erstellt die Abfrage im Access und übergibt nur noch die Parameterbezeichner samt deren Inhalten. Mit Deinem Beispiel scheint mir das nicht so einfach zu sein.

Die wenigen Beispiele, die ich hier im Forum finden konnte, waren auch so aufgebaut.

3. Wo kann man sich eigentlich ganz speziell zu diesem Thema in Verbindung mit Access und Delphi belesen?

omata 3. Jan 2009 23:48

Re: In Access gespeicherte SQL-Abfragen mit Parametern aufru
 
Sorry, du musst dafür sorgen, dass die Spalte xMeeting auch von der Abfrage in Access zurückgeliefert wird. Deine Denkweise bezüglich der Parameter innerhalb von Access ist so nicht richtig. Die Parameter existieren nur in der Delphiumgebung also deiner Anwendung. Es ist richtig, dass du dir Abfrage also komplexere SQL-Statements in Access zusammenklicken kannst. Diese Abfragen liefern dann Ergebnisse die du über den gezeigten Weg (also über Delphi heraus) einschränken kannst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz