Einsteiger: MS Access DB-Zugriff

Für Fragen von Einsteigern und Programmieranfängern...
monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Einsteiger: MS Access DB-Zugriff

Beitrag von monta »

?

Hast du ne TODBCConnection aus der Komponentenpalette aufs Formular gesetzt? (Reiter SQLdb - Package muss ggf. zum installieren ausgewählt werden)

Units werden doch dann automatisch eingefügt. Und unter SQLDB findest du alles was du brauchst.

Und vielleicht einfach ne TQuery aufs Form?
Johannes

KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Re: Einsteiger: MS Access DB-Zugriff

Beitrag von KOBOLD Messring GmbH »

So sieht meine Form aus, welche die vorhandenen Datensätze anzeigt (db_form.png)
hat eine TODBCConnection, TSQLTransaction, TSQLQuery, TDatasource und DBGrid.
und so die USES Anweisung:

Code: Alles auswählen

USES
  LCLType, Classes, Sysutils, Lresources, Forms, Controls, Graphics,  StdCtrls,
  db, DBGrids, ExtCtrls, Buttons, sqldb, odbcconn, Dialogs;

Hat alles Lazarus automatisch eingefügt beim Ziehen der Komponenten auf die Form.
Eigenschaft von ODBCConnection1.Transaction auf die SQLTransaction1 setzen,
Eigenschaft von SQLQuery1.Database auf ODBCConnection1 setzen,
Eigenschaft von SQLQuery1.SQL auf die gewünschte Abfrage (z.B. "SELECT * FROM meinetabelle") setzen,
Eigenschaft von Datasource1.Dataset auf SQLQuery1 setzen,
Eigenschaft von DBGrid1.Datasource auf Datasource1 setzen,
und wenn Du dann ODBCConnection.Connected und SQLQuery1.Active auf TRUE stellst erscheinen die Daten im DBGrid.
...und im Programmlauf kannst Du dann mit dem SQL "wüten"...
Dateianhänge
db_form.png
db_form.png (8.18 KiB) 2952 mal betrachtet

lucster
Beiträge: 30
Registriert: Mi 6. Aug 2008, 14:26
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Einsteiger: MS Access DB-Zugriff

Beitrag von lucster »

@ monta:
Ahh, die Query und Transaktions Symbole hab ich übersehen in den Registerkarten. Wie beschrieben, habe noch mit Datenbanken/-zugriffe gearbeitet :/

@Kobold:
Klasse, vielen Dank dafür. Jetzt kann ich damit mal ein bisl rumprobieren und testen, was alles realisierbar ist :)
Falls du mal nen Einstieg in eine FTP Kompo für Lazarus brauchst, sag bescheid ^^

lucster
Beiträge: 30
Registriert: Mi 6. Aug 2008, 14:26
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Einsteiger: MS Access DB-Zugriff

Beitrag von lucster »

So ich hab jetzt ein parr Tage rumprobiert und Abfragen gestartet und ausgeben lassen. Klappt prima.
Weiter habe ich versucht Daten zu manipulieren in der Original-DB bzw auch im DBGrid. Das will mir einfach nicht gelingen.

Code: Alles auswählen

SQLQuery1.Active:=false;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('Update Entgeltdatei_SIA Set Bezeichnung='+'TEST1'+' where Bezeichnung='+'Unfrei'+'');
SQLQuery1.Params[0].DataType:=ftString;
SQLQuery1.Active:=true;
SQLQuery1.ExecSQL;


Ich weiss das eine Query nur zum Abfragen gedacht ist, nur leider habe ich keine Ahnung wie eine Datenmanipulation prgrammiertechnisch abläuft :/
Kann mir da jemand auf die Sprünge helfen ?

Grüße

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Einsteiger: MS Access DB-Zugriff

Beitrag von af0815 »

lucster hat geschrieben:Ich weiss das eine Query nur zum Abfragen gedacht ist, nur leider habe ich keine Ahnung wie eine Datenmanipulation prgrammiertechnisch abläuft :/
Kann mir da jemand auf die Sprünge helfen ?


Schau mal in die LazInfos. Anschliessend kannst du mich gerne fragen, was noch unklar ist.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

lucster
Beiträge: 30
Registriert: Mi 6. Aug 2008, 14:26
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Einsteiger: MS Access DB-Zugriff

Beitrag von lucster »

Okay, habs gelesen und soweit verstanden. Aber Theorie!=Praxis...Da steht nicht wie man es anwendet, und vorallem an welchen Stellen :/

habe versucht:

Code: Alles auswählen

ODBCConnection1.ExecuteDirect

Code: Alles auswählen

SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('Update Entgeltdatei_SIA Set Bezeichnung='+'TEST1'+' where Bezeichnung='+'Unfrei'+'');
SQLQuery1.ExecSQL;
SQLQuery1.ApplyUpdates;

//oder die letzten beiden vertauscht...

Es kommen immer Fehler in der ODBC oder DB Bibliothek.

//Edit: "ODBCConnection1.ExecuteDirect" ersetzt mit "SQLQuery1.SQL.Add" //

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Einsteiger: MS Access DB-Zugriff

Beitrag von mse »

lucster hat geschrieben:Ich weiss das eine Query nur zum Abfragen gedacht ist

Das ist nicht richtig, TSQLQuery wird auch zum Ändern der Datenbank verwendet. TSQLQuery.SQL wird beim Lesen der Daten ausgeführt. Änderungen wirken sich zuerst nur lokal aus, durch TSQLQuery.ApplyUpdates werden die Änderungen an die DB übertragen, dabei werden "UpdateSQL", "InsertSQL" und "DeleteSQL" ausgeführt ("SQLUpdate", "SQLInsert", "SQLDelete" in MSEgui). UpdateSQL, InsertSQL und DeleteSQL werden automatisch erstellt, falls sie leer sind. Dabei werden die ProviderFlags Eigenschaften der Felder ausgewertet. TSQLQuery.UpdateMode bestimmt, welche Felder im WHERE Teil der Änderuns-queries erscheinen. Falls ein primaryindex existiert und UsePrimarKeyAsKey aktiviert ist, wird das pfInKey flag des entsprechenden Feldes automatisch gesetzt. Ich bin nicht sicher, ob dies mit FPC TODBCConnection funktioniert.
Nach ApplyUpdates muss je nach DB noch TSQLTransaction.Commit ausgeführt werden um der DB die Gültigkeit der Daten zu bestätigen.
MSEgui bietet überdies die Möglichkeit, durch Setzen der flags tmsesqlquery.controller.options dso_autoapply, dso_autocommit/dso_autocommitret die Angelegenheit weiter zu automatisieren.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Einsteiger: MS Access DB-Zugriff

Beitrag von theo »

Ich verstehe wirklich nix von Datenbanken, aber müssten bei deinem Beispiel nicht TEST1 und unfrei in Hochkommas?

lucster
Beiträge: 30
Registriert: Mi 6. Aug 2008, 14:26
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Einsteiger: MS Access DB-Zugriff

Beitrag von lucster »

auch mit dem Commit funktioniert es nicht.
Vll. könnte sich jemand Fachkundiges 5min Zeit nehmen und mein Szenario nachstellen. Vll. fallen ihm dann Fehler auf, die ich nicht gesehen habe. Bin Datenbankanfänger.

Beschreibung:
- ODBCConnection1
- SQLTransaction1
- Datasource1
- SQLQuery1
- DBGrid1
auf die Form.

Dann folgendes ausgeführt:
- Eigenschaft von ODBCConnection1.Transaction auf die SQLTransaction1 setzen
- Eigenschaft von SQLQuery1.Database auf ODBCConnection1 setzen
- Eigenschaft von Datasource1.Dataset auf SQLQuery1 setzen
- Eigenschaft von DBGrid1.Datasource auf Datasource1 setzen
- Eigenschaft von SQLQuery1.SQL ein SQL-Kommando eintragen (Bsp. Select * From MEINE_TAB)

In den Systemsteuerungen --> Verwaltung --> Datenquellen (ODBC): dort eine "Benutzer DSN" hinzufügen mit dem Microsoft Access Treiber (.mdb)
Dafür ist natürlich eine Access DB von nöten. Reicht ja eine Tabelle mit einer Spalte wo irgendwas drin steht. Diese dann beim Hinzufügen angeben.

Code sieht dann wie folgt aus und kann einfach kopiert werden:

Code: Alles auswählen

{onFormCreate}
ODBCConnection1.DatabaseName:='test1'; //Benutzer DSN Name
ODBCConnection1.Connected:=true;
SQLQuery1.UsePrimaryKeyAsKey:=false;
SQLQuery1.Active:=true; //erster String wird direkt ausgeführt
 
{onButtonClick}
SQLQuery1.Active:=false;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('SELECT Bezeichnung FROM Entgeltdatei_SIA');
SQLQuery1.Active:=true;
 
{onFormClose}
ODBCConnection1.Connected:=false;


Diese Schritte habe ich alle ausgeführt. Im Part onButtonClick habe ich dann versucht Datenmanipulationsbefehle zu senden, was wie schon in vorherigen Beiträgen, nie zum Erfolg geführt hat :/

lucster
Beiträge: 30
Registriert: Mi 6. Aug 2008, 14:26
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Einsteiger: MS Access DB-Zugriff

Beitrag von lucster »

@Theo:
Okay habs verbessert. Aber ändern tut das auch nichts, denn ich hatte auch vorher ein Inser Into versucht wo nicht mit Hochkommata gearbeitet werden musste, mit dem gleichen erschütterndem Ergebnis.

Sieht jetzt so aus:

Code: Alles auswählen

SQLQuery1.SQL.Add('Update Entgeltdatei_SIA Set Bezeichnung='+QuotedStr('TEST')+' Where Bezeichnung='+QuotedStr('Unfrei'));

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Einsteiger: MS Access DB-Zugriff

Beitrag von mse »

lucster hat geschrieben:auch mit dem Commit funktioniert es nicht.
Vll. könnte sich jemand Fachkundiges 5min Zeit nehmen und mein Szenario nachstellen. Vll. fallen ihm dann Fehler auf, die ich nicht gesehen habe. Bin Datenbankanfänger.

Ehem, liest du denn auch, was wir schreiben?

Code: Alles auswählen

{onFormCreate}
SQLQuery1.UsePrimaryKeyAsKey:=false;

Dadurch wird das pfInKey nicht automatisch gesetzt, du must es selbst tun, etwa so:

Code: Alles auswählen

SQLQuery1.fieldbyname('deinprimarykeyfield').providerflags:= [pfInUpdate,pfInWhere,pfInKey];

Die insert, delete und update Operationen musst du nicht selbst ausführen, lies bitte nochmals weiter oben.

KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Re: Einsteiger: MS Access DB-Zugriff

Beitrag von KOBOLD Messring GmbH »

¡¡Hochkomma!! ODBC verträgt nicht die doppelten Anführungszeichen, ich weiss nicht was die Funktion QuotedStr macht, hab ich noch nie benutzt, ich mach das so:

Code: Alles auswählen

SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('Update Entgeltdatei_SIA Set Bezeichnung='''+TEST1+''' where Bezeichnung='''+Unfrei+'''');
SQLQuery1.ExecSQL;

Sieht zwar sehr unschön aus im Quellcode (zweimal '' = einmal ', dreimal ''' = zweimal '' und viermal '''' = ein string der aus einem Hochkomma besteht), aber funzt. Den gleichen Fehler hatte ich auch
viewtopic.php?f=17&t=2215&hilit=+anf%C3%BChrungszeichen
Martin hats rausgefunden.
wenn Du Dir dann mach anschaust, z.B. über
ShowMessage (SQLQuery1.SQL.Text),
dann kommt sowas raus (z.B. TEST1 := 'foo'; Unfrei := 'bar';

Code: Alles auswählen

Update Entgeltdatei_SIA Set Bezeichnung='foo' where Bezeichnung='bar'

und das mag der ODBC-Access-Treiber

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Einsteiger: MS Access DB-Zugriff

Beitrag von af0815 »

KOBOLD Messring GmbH hat geschrieben:... und das mag der ODBC-Access-Treiber

Das ist eher die Art und Weise wie, das Escapen von Zeichen im Lazarus/FPC funktioniert. Der ODBC mejkert ja nur, weil er es nicht in seiner gewohnten Form bekommt. Man kann ja auch Parameter verwenden um nicht mit dem Escapen Probleme zu bekommen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Re: Einsteiger: MS Access DB-Zugriff

Beitrag von KOBOLD Messring GmbH »

Hola lucster,
habe mir mal 5 min Zeit genommen, anbei ein funktionierendes Test-Projekt mit mdb,
SETZE ZUERST aber eine ODBC-Datenquelle auf diese db1.mdb wie im Screenshot gezeigt (Pfad musst Du natürlich anpassen).
Ich hoffe es hilft Dir.

@af0815: Mit den Parametern bei den SQLQuerys habe ich auch merkwürdigste Effekte erlebt. Mal geht es, mal nicht, deshalb mach ich das lieber mit den Strings.
Dateianhänge
test-obdb-access.zip
(1.01 MiB) 135-mal heruntergeladen
odbc-testdb.png

Antworten