AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Grundlegende Frage zum Thema ADO und Access

Grundlegende Frage zum Thema ADO und Access

Ein Thema von Stefan Hueg · begonnen am 23. Feb 2007 · letzter Beitrag vom 23. Feb 2007
Antwort Antwort
Benutzerbild von Stefan Hueg
Stefan Hueg

Registriert seit: 13. Jun 2004
Ort: Gießen
187 Beiträge
 
Delphi 2006 Professional
 
#1

Grundlegende Frage zum Thema ADO und Access

  Alt 23. Feb 2007, 03:17
Datenbank: Access • Version: 2003 • Zugriff über: Jet 4.0
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:
  Query.SQL.Text := 'select * from Kunden';
  Query.Open;
Open deshalb weil es mir die Hilfe empfohlen hat. ExecSQL soll man angeblich nur nehmen bei Inserts, Updates etc.

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:
  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?
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?

Hoffe ihr könnt mir helfen

Viele Dank im Voraus,

Stefan
Stefan Hueg
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Grundlegende Frage zum Thema ADO und Access

  Alt 23. Feb 2007, 06:26
Soweit korrekt, bis auf die Anweisung
Query.Refresh; //Führt die Abfrage (select * from Kunden) neu aus? hier solltest du die Methode Requery verwenden:
Query.Requery; //Führt die Abfrage (select * from Kunden) neu aus! Wenn du das Ganze in reinem SQL formulieren willst, solltest du parametrisierte Statements verwenden:
Delphi-Quellcode:
...
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;
Danach mußt du die Query mit dem Select-Statement mit der Methode Requery aktualisieren!

Grüße
Mikhal

[edit]SQL-Beispiel hinzugefügt[/edit]
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#3

Re: Grundlegende Frage zum Thema ADO und Access

  Alt 23. Feb 2007, 06:49
Zitat von Stefan Hueg:
Kann man das so machen oder bin ich auf dem Holzweg?
Ein bisschen. Zuminfest ist es sehr holpriger Weg den man so nicht benutzen sollte.

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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Grundlegende Frage zum Thema ADO und Access

  Alt 23. Feb 2007, 07:19
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:
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;
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.

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
  Mit Zitat antworten Zitat
Benutzerbild von Stefan Hueg
Stefan Hueg

Registriert seit: 13. Jun 2004
Ort: Gießen
187 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Grundlegende Frage zum Thema ADO und Access

  Alt 23. Feb 2007, 11:33
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
Stefan Hueg
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Grundlegende Frage zum Thema ADO und Access

  Alt 23. Feb 2007, 12:28
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
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Grundlegende Frage zum Thema ADO und Access

  Alt 23. Feb 2007, 12:31
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
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:03 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