![]() |
Datenbank: Access • Version: 2003 • Zugriff über: Jet 4.0
Grundlegende Frage zum Thema ADO und Access
Ich arbeite mich gerade in das Thema Datenbanken ein und sehe dass es ziemlich eingerostet ist.
Nun habe ich mich dran gemacht meine Access Datenbank in Delphi einzubinden, und zwar mache ich das über das TADOConnection (für die Verbindung), TADOQuery (für Abfragen) und TDataSource (Verbindung zwischen Query und DBGrid beispielsweise). Ich hoffe diese Hierarchie ist richtig: Connection -> Query | -> DataSource -> DBGrid Eine ganz einfache Abfrage geschieht dann so:
Delphi-Quellcode:
Open deshalb weil es mir die Hilfe empfohlen hat. ExecSQL soll man angeblich nur nehmen bei Inserts, Updates etc.
Query.SQL.Text := 'select * from Kunden';
Query.Open; Nun zu meiner eigentlichen Frage: Möchte ich nun einen Datensatz hinzufügen, dachte ich mir, bastelst du dir einfach ein Insert zusammen, packst es in das Query und schickst es auf die Reise. War jedoch ziemlich umständlich (und hat nicht funktioniert ^^). Daher habe ich einen neuen Versuch gestartet über folgende Syntax:
Delphi-Quellcode:
Sind die Kommentare die ich gesetzt habe inhaltlich richtig? Und woher weiß das Insert in welche Tabelle ich den neuen Datensatz einfügen will? Kann man das so machen oder bin ich auf dem Holzweg?
Query.Insert; //Fügt einen neuen Datensatz hinzu?
Query.FieldByName('Vorname').AsString:=Edit1.Text; Query.FieldByName('Nachname').AsString:=Edit2.Text; Query.FieldByName('Strasse').AsString:=Edit3.Text; Query.FieldByName('Hausnummer').AsString:=Edit4.Text; Query.FieldByName('Wohnort').AsString:=Edit5.Text; Query.FieldByName('PLZ').AsString:=Edit6.Text; Query.Post; //Postet die Änderungen an die DB? Query.Refresh; //Führt die Abfrage (select * from Kunden) neu aus? Hoffe ihr könnt mir helfen :) Viele Dank im Voraus, Stefan |
Re: Grundlegende Frage zum Thema ADO und Access
Soweit korrekt, bis auf die Anweisung
Delphi-Quellcode:
hier solltest du die Methode Requery verwenden:
Query.Refresh; //Führt die Abfrage (select * from Kunden) neu aus?
Delphi-Quellcode:
Wenn du das Ganze in reinem SQL formulieren willst, solltest du parametrisierte Statements verwenden:
Query.Requery; //Führt die Abfrage (select * from Kunden) neu aus!
Delphi-Quellcode:
Danach mußt du die Query mit dem Select-Statement mit der Methode Requery aktualisieren!
...
var MySQL: String; begin MySQL := 'INSERT INTO Kunden(Vorname, Nachname, Strasse, Hausnummer, PLZ, Wohnort) ' + #13#10 + 'VALUES(:Vorname, :Nachname, :Strasse, :Hausnummer, :PLZ, :Wohnort)'; Query.SQL.Text := MySQL; // Statement zuweisen Query.Parameters.FindParam('Vorname').Value := Edit1.Text; // Feld Vorname füllen... ... Query.Prepared := True; Query.ExecSQL; // Daten in die Tabelle schreiben end; Grüße Mikhal [edit]SQL-Beispiel hinzugefügt[/edit] |
Re: Grundlegende Frage zum Thema ADO und Access
Zitat:
Die ADOQuery bastelt in deinem Fall eine SQL Insert Anweisung für die Tabelle, als der die Daten abgefragt wurden. Gefährlich ist dabei, dass Querys oft "statisch" READ ONLY sind (das passiert u.a. wenn du UNION, JOIN (1:n oder n:n) verwendest). Dann bekommst du bein POST eineen EDatabaseError. Dein Code passt (fast) zu einer ADOTable (vorrausgesetzt diese ist mit keiner Abfrage in der DB verbunden). Der Refresh funktioniert bei einer Tabelle allerdings nicht. Mikhal hat dir oben den sicheren Weg erläutert. Schöne Grüße, Jens :hi: |
Re: Grundlegende Frage zum Thema ADO und Access
Guten Morgen Stefan,
auch dein Ansatz über Insert() funktioniert, wenn du die Query zuvor geöffnet hast. Woher die Query dann weiß in welcher Tabelle sie deine Daten unterbringen soll, scheint mir offensichtlich zu sein:
Delphi-Quellcode:
Ein Requery musst du eigentlich nur dann ausführen, wenn du Änderungen sichtbar machen möchtest, welche inzwischen von anderen Komponenten verursacht wurden. Das können Komponenten in deinem eigenen gerade laufenden Programm sein, oder eine weitere Instanz deines Programmes auf dem gleichen oder einem anderen Rechner, oder auch ganz fremde Programme.
begin
// ... with Query do begin SQL.Text := 'SELECT * FROM Kunden ORDER BY Nachname, Vorname, Wohnort'; Open; end; end; { ... } begin with Query do begin Append; // Stellt einen leeren Datenpuffer bereit // alternative Wertzuweisung FieldValues['Vorname'] := VornameEdit.Text; // ... Post; // Fügt die Daten aus dem Puffer in die Tabelle ein end; end; Dein SELECT Statement liefert die vollständige Tabelle als Ergebnis. Wenn du deine Ergebnismenge über eine Projektion (Feldliste) oder eine Selektion (WHERE-Klausel)reduzieren kannst, dann kommt das der Performanz sehr zu Gute. Du hast JET als deine Zugriffstechnik angegeben, aber du arbeitest mit ADO und einem OLE DB Provider. Dass letzterer sich auf die Zugriffsroutinen aus der JET Library stützt, gehört in die Abteilung Hintergrundwissen und wird nur in bestimmten Fällen wichtig. Das meiste haben dir die Kollegen schon geschrieben, während ich die Tasten auf meinem Keyboard gesucht habe, aber ich schicke meinen Beitrag doch ab. For what it's worth. Freundliche Grüße |
Re: Grundlegende Frage zum Thema ADO und Access
Vielen Dank schon mal für die hilfreichen Antworten.
Mir war die Methode, wie ich sie gepostet hab, etwas suspekt deshalb dachte ich sowieso es wäre der bessere (und auch sicherere Weg) das ganze über ein Insert zu basteln. Eine Frage dazu: Habe ich der Hilfe richtig entnommen dass ADO erst durch das Setzen von Prepared=True die Parameter des SQL-Befehls durch die entsprechenden Werte der Editboxen austauscht? Sprich wenn man den Wert nicht setzt, nur humbug heraus kommt? Zweite Frage: Wird das Insert ausgeführt so wie du es gepostet hast @mikhal, werden die Parameter wieder gelöscht oder könnte ich den gleichen Insert nochmal genauso ausführen ohne die Parameter setzen zu müssen? Um es klar zu machen: Bleiben die Parameter dann statisch und kann es in anderen Abfragen wie UPDATE etc. verwenden, oder muss ich jedes mal die Parameter neu setzen? Auf jeden Fall bin ich ein ganzes Stück schlauer geworden :) |
Re: Grundlegende Frage zum Thema ADO und Access
Verwechselst du vielleicht ParamCheck und Prepared?
Prepared steuert - vereinfacht ausgedrückt - die Vor-Übersetzung des Statements in eine interne Darstellung. Damit wird die mehrfache Ausführung des gleichen Statements beschleunigt. Vorteilhaft ist dabei die Verwendung von Parametern, da so die Chance steigt, dass das SQL-Statement selbst nicht geändert werden muss und wiederverwendet werden kann. ParamCheck steuert die automatische Suche nach Parametern bei Zuweisung eines neuen SQL-Statements. Bei jeder Änderung an der Eigenschaft SQL wird die Parameters-Liste neu aufgebaut. Freundliche Grüße |
Re: Grundlegende Frage zum Thema ADO und Access
Probier's einfach mal aus. Aber nach meinen Erfahrungen bleiben die Parameterwerte solange erhalten, bis sie mit einem neuen Wert überschrieben werden.
Grüße Mikhal |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz