Einsteiger: MS Access DB-Zugriff
-
- 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
?
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?
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
-
- 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
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:
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"...
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;
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 (8.18 KiB) 3395 mal betrachtet
-
- 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
@ 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 ^^
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 ^^
-
- 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
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.
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
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;
Kann mir da jemand auf die Sprünge helfen ?
Grüße
- af0815
- Lazarusforum e. V.
- Beiträge: 6780
- 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
Schau mal in die LazInfos. Anschliessend kannst du mich gerne fragen, was noch unklar ist.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 ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- 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
Okay, habs gelesen und soweit verstanden. Aber Theorie!=Praxis...Da steht nicht wie man es anwendet, und vorallem an welchen Stellen :/
habe versucht:
//oder die letzten beiden vertauscht...
Es kommen immer Fehler in der ODBC oder DB Bibliothek.
//Edit: "ODBCConnection1.ExecuteDirect" ersetzt mit "SQLQuery1.SQL.Add" //
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;
Es kommen immer Fehler in der ODBC oder DB Bibliothek.
//Edit: "ODBCConnection1.ExecuteDirect" ersetzt mit "SQLQuery1.SQL.Add" //
-
- 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
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.lucster hat geschrieben: Ich weiss das eine Query nur zum Abfragen gedacht ist
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.
Re: Einsteiger: MS Access DB-Zugriff
Ich verstehe wirklich nix von Datenbanken, aber müssten bei deinem Beispiel nicht TEST1 und unfrei in Hochkommas?
-
- 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
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:
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 :/
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;
-
- 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
@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:
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'));
-
- 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
Ehem, liest du denn auch, was wir schreiben?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.
Dadurch wird das pfInKey nicht automatisch gesetzt, du must es selbst tun, etwa so:Code: Alles auswählen
{onFormCreate} SQLQuery1.UsePrimaryKeyAsKey:=false;
Code: Alles auswählen
SQLQuery1.fieldbyname('deinprimarykeyfield').providerflags:= [pfInUpdate,pfInWhere,pfInKey];
-
- 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
¡¡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:
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
http://www.lazarusforum.de/viewtopic.ph ... ngszeichen" onclick="window.open(this.href);return false;
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';
und das mag der ODBC-Access-Treiber
Code: Alles auswählen
SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('Update Entgeltdatei_SIA Set Bezeichnung='''+TEST1+''' where Bezeichnung='''+Unfrei+'''');
SQLQuery1.ExecSQL;
http://www.lazarusforum.de/viewtopic.ph ... ngszeichen" onclick="window.open(this.href);return false;
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'
- af0815
- Lazarusforum e. V.
- Beiträge: 6780
- 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
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.KOBOLD Messring GmbH hat geschrieben:... und das mag der ODBC-Access-Treiber
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- 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
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.
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) 163-mal heruntergeladen