Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Datenmanipulation (ODBC/Access) (https://www.delphipraxis.net/129037-datenmanipulation-odbc-access.html)

LuCSteR 11. Feb 2009 14:31

Datenbank: MS Access • Version: 2003 • Zugriff über: ODBC

Datenmanipulation (ODBC/Access)
 
Hi,

ich soll eine Applikation schreiben, die Daten aus einer (noch) lokalliegenden Access Datenbank auslesen und manipulieren können sollte.
Im FormCreate verbinde ich mit der Datenbank, was auch klappt. Auch habe ich über ein SQLQuery und einem DataSource Tabellen/Tabellenspalten in eine DBGrid ausgeben lassen können. Mein Problem ist jetzt:

Wie kann ich Daten manipulieren (DELETE, INSERT INTO, UPDATE,..)? Bzw besser, welche Schritte sind zu tun, das diese Queries auch umgesetzt werden? In der Quelldatenbank, nicht nur im DBGrid.

Ich verstehe da den Zusammenhang noch nicht ganz. Was auch nicht geklappt hat, war eine Systemtabelle anzuzeigen :/

Struktur:

ODBCConnection1 --> SQLTransaction1
ODBCConnection1 --> SQLQuery1 --> DataSource1 --> DBGrid1

Quasi müssten die Informationen, die im DataSource (durch Query gespeist) sind, an die Datenbak gesendet werden. Sicherlich über die SQLTransaction. Aber wie?

Mein Code bisher:
Delphi-Quellcode:
//Benutzer-DSN Name
ODBCConnection1.DatabaseName:='test1';

//wichtig für Queries
SQLQuery1.UsePrimaryKeyAsKey:=false;
SQLQuery1.Active:=true;

//Connect
ODBCConnection1.Connected:=true;
Grüße

khh 11. Feb 2009 14:34

Re: Datenmanipulation (ODBC/Access)
 
Zitat:

Zitat von LuCSteR
Hi,

ich soll eine Applikation schreiben, die Daten aus einer (noch) lokalliegenden Access Datenbank auslesen und manipulieren können sollte.
Im FormCreate verbinde ich mit der Datenbank, was auch klappt. Auch habe ich über ein SQLQuery und einem DataSource Tabellen/Tabellenspalten in eine DBGrid ausgeben lassen können. Mein Problem ist jetzt:

Wie kann ich Daten manipulieren (DELETE, INSERT INTO, UPDATE,..)? Bzw besser, welche Schritte sind zu tun, das diese Queries auch umgesetzt werden? In der Quelldatenbank, nicht nur im DBGrid.

Ich verstehe da den Zusammenhang noch nicht ganz. Was auch nicht geklappt hat, war eine Systemtabelle anzuzeigen :/

Struktur:

ODBCConnection1 --> SQLTransaction1
ODBCConnection1 --> SQLQuery1 --> DataSource1 --> DBGrid1

Quasi müssten die Informationen, die im DataSource (durch Query gespeist) sind, an die Datenbak gesendet werden. Sicherlich über die SQLTransaction. Aber wie?

Mein Code bisher:
Delphi-Quellcode:
//Benutzer-DSN Name
ODBCConnection1.DatabaseName:='test1';

//wichtig für Queries
SQLQuery1.UsePrimaryKeyAsKey:=false;
SQLQuery1.Active:=true;

//Connect
ODBCConnection1.Connected:=true;
Grüße

indem du das sqlstatement übergibst:
Delphi-Quellcode:
sqlQuery1.sql.clear;
sqlQuery1.sql.add('select blabla ' );
EDIT: funktioniert natürlich auch mit update, insert usw.

gruss KH

[edit=mkinzler]Fehlende Tags ergänzt Mfg, mkinzler[/edit]

HaJo 11. Feb 2009 14:53

Re: Datenmanipulation (ODBC/Access)
 
Normalerweise macht man das mit:
Zitat:

Delphi-Quellcode:
         try
            SQLQuery1.post;
         except
            SQLQuery1.Cancel;
         end;

Aber Vorsicht, nicht jede SQL-Komponente ist zum ändern gedacht. Manche sind von Hause aus nur lesbar. Das Zauberwort ist hier "RequestLive". Ist diese Eigenschaft vorhanden und auf TRUE gesetzt, können auch im Grid Daten geändert werden.

Dein Satz:
Zitat:

Wie kann ich Daten manipulieren (DELETE, INSERT INTO, UPDATE,..)? Bzw besser, welche Schritte sind zu tun, das diese Queries auch umgesetzt werden? In der Quelldatenbank, nicht nur im DBGrid.
legt nahe, das Du nicht allzu viel Erfahrung mit Datenbanken hast. Kann das sein?

Das was Du da beschreibst sind keine Queries(Fragen) sondern ausführbare Statements(Befehle) die im Verbund mit entsprechenden Daten an jede Datenquelle gesandt werden können.

Die würden dann abgeschlossen mit:
Zitat:

Delphi-Quellcode:
        IF not SQLQuery1.Prepared then
            SQLQuery1.Prepare;
         TRY
            SQLQuery1.ExecSQL
         EXCEPT
         END;

[edit=mkinzler]Auch Profis sollten Delphi-Tags verwenden Mfg, mkinzler[/edit]

LuCSteR 11. Feb 2009 15:00

Re: Datenmanipulation (ODBC/Access)
 
@Hajo:

Ich arbeite das erste mal mit einer Datenbank. Die Theorie hatte ich in der Vorlesung, was aber nicht weiterhilft bei meinem Problem.

Ich bin davon ausgegangen, das eine SQLTransaction nicht nur Daten holen, sondern auch senden kann. Also Manipulationan der OriginalDB möglich ist.
Bin ja shconmal froh, das ich eine Verbindung aufbauen und Daten auslesen konnte.

Wie läuft denn das ab mit der Manipulation?
Ein Suchwort würde mich auch glücklich machen. Vll. werde ich ja fündig :)

Im Prinzip will ich mit meiner Applikation nur Daten selktieren und manipulieren in der MS Access DB.

Grüße

HaJo 11. Feb 2009 15:06

Re: Datenmanipulation (ODBC/Access)
 
na dann, nur Mut :-)

Trotztdem eine Frage noch - kannst Du denn schon absehen ob Du in mehr als einer Tabelle Daten Lesen und ändern können solltest?

LuCSteR 11. Feb 2009 15:13

Re: Datenmanipulation (ODBC/Access)
 
Wie meinst du das "nur Mut" ^^
Kann mir kaum vorstellen, das mein Vorhaben sehr kompliziert sein kann :)

Es ist abzusehen das:
- die Datenbank später im Netzwerk liegen wird
- meine Applikation auf jedem PC im Netzwerk laufen sollte (wobei ich da nicht weiss, ob auf jedem eine eigene Benutzer DSN erstellt werden muss, und welche Probleme es dann bei dem gelichzeitigen Zugriffen/Manipulationen geben wird :/)
- eine große Menge von Anfragen und Manipulationen auf/an 13 Tabellen (ca. 20K Datensätze) erolgen werden durch die Nutzer :)

Wonach kann ich denn jetzt suchen? Scheint ja so, das ich noch einen andere Komponente brauch, außer denen, die ich schon benutze.

danke :)

HaJo 11. Feb 2009 15:22

Re: Datenmanipulation (ODBC/Access)
 
Such doch mal hier im Forum nach Datenbank-Beispielen. Ob eines für Access dabei ist, weiß ich nicht.
Aber Beispiele gibt es hier sicherlich.

Kurz zu den Begriffen:
Transaction ist so etwas wie die unsichtbare ausführbare Macht bei Datenbanken. Bei den besseren Datenbanken wird eine solche Transaction für jeden Benutzer oder eine bestimmte Tätigkeit in der DB erzeugt.
Der Vorteil der Transaction ist der: Du oder der Benutzer kann nachher entscheiden Änderungen sind OK also speichern - oder aber Änderungen sind nicht OK also verwerfen.

Soll heissen, mit jeder eröffneten Transaction werden die zu bearbeitenden Daten lokal gespeichert.

Dann entscheidet der Benutzer Top oder flopp.
Bei Top werden die lokalen Änderungen in die DB zurückgeschrieben.
Bei Flopp wird der lokale Speicher gelöscht

Query ist eine visuelle Darstellung des Datenbank-Objektes das Du über Ereignisse und Eigenschaften steuern und dem Benutzer in entsprechender Darreichungsform (Grid, Formular usw.) zum bearbeiten anbieten kannst.

HaJo 11. Feb 2009 15:28

Re: Datenmanipulation (ODBC/Access)
 
Ach, nimm das "nur Mut" nicht so ernst :-)

Es ist für Dich nur etwas neues und durch Deine Angaben sicherlich in kurzer Zeit zu bewerkstelligen.

Deinen Angaben zu Folge, würde ich Dir raten, alle Datenbank-Objekte nicht auf dem Hauptformular, sondern in eine eigene DB-Form zu packen um die übersichtlichkeit für später zu sichern.

In der Regel ist das ein Datenbankmodul oder eine spezielle Form um nur Datenbank-komponenten aufzunehmen.
Diese haben in der Regel von Hause aus die Eigenschaft, vor dem Hauptformular geladen zu werden.

LuCSteR 11. Feb 2009 17:06

Re: Datenmanipulation (ODBC/Access)
 
Mhh, könnte mir jmd. Fachkundiger ein paar Tips/Hinweise geben?

Ich suche seit mehreren Stunden nach einer Lösung hier im Forum. Vll. habe ich sie sogar schon gesehen. Aber da ich sowas noch nie gemacht habe, weiss ich jetzt nimmer wo/-nach ich jetzt noch suchen soll :/

Gibt es niemanden, der schon einmal Daten manipuliert hat per ODBC? Welche DB da am anderen Ende hängt dürfte ja für den Prozess unerheblich sein oder?

Grüße

LuCSteR 11. Feb 2009 17:08

Re: Datenmanipulation (ODBC/Access)
 
siehe oberen Beitrag ~missclicked~

shmia 11. Feb 2009 17:27

Re: Datenmanipulation (ODBC/Access)
 
Zitat:

Zitat von LuCSteR
Es ist abzusehen das:
- die Datenbank später im Netzwerk liegen wird
- meine Applikation auf jedem PC im Netzwerk laufen sollte (wobei ich da nicht weiss, ob auf jedem eine eigene Benutzer DSN erstellt werden muss, und welche Probleme es dann bei dem gelichzeitigen Zugriffen/Manipulationen geben wird :/)

Da wirst du später mit einer Access Datenbank ein Problem bekommen!
Die Access Datenbank läuft lokal sehr gut aber im Netzwerk gibt es grosse Schwierigkeiten.
Du kannst aber auf die MSDE 2000 bzw. jetzt heisst es MS SQL Server Express ausweichen.
Das ist im Prinzip ein SQL Server mit ein paar Einschränkungen, die aber bei deiner kleinen Datenbank nicht stören.

Es ist auch nicht schwer, die Anwendung so zu schreiben, dass sie sowohl auf Access als auch auf dem SQL Server läuft.

LuCSteR 11. Feb 2009 17:45

Re: Datenmanipulation (ODBC/Access)
 
Eine Benutzer DSN kann ja für mehrere DB erstellt werde. gehe dann auch mal davon aus, das ich per ODBC auch mit diesen DBs kommunizieren kann. Trotzdem finde ich nirgends einen Ansatz, wie das Manipulieren von Daten funktionieren soll. Abfragen kalppen einwandrei. Manipulationen nicht. HILFE :)

Grüße

khh 11. Feb 2009 17:48

Re: Datenmanipulation (ODBC/Access)
 
Zitat:

Zitat von LuCSteR
Eine Benutzer DSN kann ja für mehrere DB erstellt werde. gehe dann auch mal davon aus, das ich per ODBC auch mit diesen DBs kommunizieren kann. Trotzdem finde ich nirgends einen Ansatz, wie das Manipulieren von Daten funktionieren soll. Abfragen kalppen einwandrei. Manipulationen nicht. HILFE :)

Grüße

was hast denn unternommen, zur manipulation ?

HaJo 11. Feb 2009 23:17

Re: Datenmanipulation (ODBC/Access)
 
Liste der Anhänge anzeigen (Anzahl: 1)
@LuCSteR:

Also ich versuche noch mal in Kurzform die Vorgehensweise zu skizzieren:

Mit FreePascal eine Haupform erstellen.
Mit FreePascal eine Dataform erstellen.

Anschließend erstellst Du in der Dataform jene Komponenten, mit denen Du in der jetzigen Anwendung die Verbindung zur DB erstellst.

Nun schau Dir mal meine Abbildung an. Hier kannst Du sehen in welchem Zusammenhang die verschiedenen DB-Komponenten stehen.

Um Abfragen oder Tabellen bearbeiten zu können, ist noch eine Komponente nötig, eine so genannte Datasource. Jede visuell zu bearbeitende Tabelle oder Abfrage sollte erst einmal eine eigene Datasource haben.

Diese Komponenten sollten natürlich treffend benannt werden um Dir später das Arbeiten zu erleichtern.

Jede dieser Datasource-Komponenten kannst Du nun mit kannst Du nun mit beliebigen Komponenten zur Datensteuerung versehen, z.B dem DBNavigator oder einer Edit-Komponente.

Zu den von Dir benannten Transaktionen. Beim öffnen einer Datenverbindung wird bei den meisten DB-Anwendungen eine Transaktion eröffnet.
Beim schließen der Anwendung bzw. der Datenverbindung wird sie automatisch geschlossen

mkinzler 12. Feb 2009 05:37

Re: Datenmanipulation (ODBC/Access)
 
Zitat:

Beim öffnen einer Datenverbindung wird bei den meisten DB-Anwendungen eine Transaktion eröffnet.
Aber nur bei sehr kleinen.

LuCSteR 12. Feb 2009 10:17

Re: Datenmanipulation (ODBC/Access)
 
Ich schreibe ja gerade ersteinmal ein kleines Rum-Probeir-Programm, wo ich alles austeste. Folglich ist mir die Struktur mit 2 Forms ersteinmal egal.

Ich habe nach der Kompo Database gesucht, aber ich benutze Lazarus, und finde sie deshalb scheinbar nicht.
Vll. nochmal zum Stand der Dinge :)

- ODBCConnection1
- SQLTransaction1
- Datasource1
- SQLQuery1

Mit diesen 4 Komponenten habe ich es geschafft eine verbindung aufzubauen, mehrere Abfragen zu senden und mir deren Ergebnisse in einer DBGrid1 anzeigen zu lassen. Funktioniert so:
Delphi-Quellcode:
{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;
Prima. Zum Manipulieren habe ich bisher nichts unternommen, da ich nicht einmal einen Ansatz sehe, wie das funktionieren soll. Die Queries sind ja nur Abfragen. Aber womit muss ich denn operieren um manipulieren zu können? Bzw. direkt besser gefragt: Wie funktioniert es? Bsp.? Nur ein ganz kurzes vll :)

grüße

p80286 12. Feb 2009 10:40

Re: Datenmanipulation (ODBC/Access)
 
Hallo Lucster,

wie wäre es mit
SQL-Code:
'Update Entgeltdatei_SIA Set Bezeichnung='Bretzelzeichnung' where Bezeichnung='Bratzelzeichnung';
dann wird in allen Sätzen die Bratzelzeichnung durch Bretzelzeichnung ersetzt.


gruß K-H

LuCSteR 12. Feb 2009 10:49

Re: Datenmanipulation (ODBC/Access)
 
lustig :)
als hätte ich sowas nich schon selbst ausprobiert ;)

Immer die gleichen Fehler: EDataBaseError in Lib "db"...

btw lautet das richtige SQL Statement in Delphi umgesetzt:
Delphi-Quellcode:
SQLQuery1.SQL.Add('Update Entgeltdatei_SIA Set Bezeichnung='+QuotedStr('TEST')+' Where Bezeichnung='+QuotedStr('Unfrei'));
Habe gerade was von ExecSQL gelesen. Vll werde ich dadurch fündig. Trotzdem danke :)

LuCSteR 12. Feb 2009 11:11

Re: Datenmanipulation (ODBC/Access)
 
Delphi-Quellcode:
SQLQuery1.SQL.Add('Update Entgeltdatei_SIA Set Bezeichnung='+QuotedStr('TEST')+' Where Bezeichnung='+QuotedStr('Unfrei'));
SQLQuery1.Params[0].DataType:=ftString;
SQLQuery1.ExecSQL;
--> EListError ... mit
Delphi-Quellcode:
SQLQuery1.Active:=true;
hinten dran auch...

Kann es sein das die Verbidnungen zwischen den Komponenten nicht passen?

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,

HaJo 12. Feb 2009 11:17

Re: Datenmanipulation (ODBC/Access)
 
Hallo LuCSteR,

wie heißt die Fehlermeldung denn genau? Etwa: "cannot load libodbc.so"???

Bedenke bitte das Du Dich hier in einem DELPHI-Forum befindest und nicht in einem LAZARUS-Forum.

So wie es aussieht, wird Access und damit die MS-JET-Engine gar nicht unterstützt, sondern nur folgende Datenbanken:
Zitat:

Quelle: http://wiki.lazarus.freepascal.org/Databases/de

Unterstützte Plattformen:
Datenbank Package Name Benötigt Client lib? Benötigt Server? Unterstützte Versionen
Textdateien SDFLaz Nein Nein - Alle
Im Speicher MemDSLaz Nein Nein - Alle
DBase DBFLaz Nein Nein III+, IV, VII Alle
FoxPro DBFLaz Nein Nein - Alle
Paradox TParadoxDataSet Nein Nein bis zu Version 7 (und darüber ??) Alle
SQLite SQLite Ja Nein - -
MySQL SQLdb Ja Ja 3 - 4.0 i386: Linux, Win32
Firebird IBase Ja Ja 1 - 1.5 i386: Linux, Win32
PostgreSQL SQLdb Ja Ja 6.6 - 8 i386: Linux, Win32
ODBC SQLdb Ja Depends 3.x 1) i386: Linux, Win32
Interbase IBase Ja Ja 4 - 6 i386: Linux, Win32
Oracle SQLdb Ja Ja - -

Das soll Dir aber nicht den Mut nehmen es weiter zu versuchen, sondern vielleicht mal eher dort im Forum nachsehen unter: http://www.lazarusforum.de

Dort im Forum ist bei Access u.a. folgendes zu lesen: "...Geht perfekt wenn ich mit ZeosDB oder auch direkt mit SQLDb-Komponenten drauf zugreife, aber mit ODBC nix zu wollen."


Weiß nicht so richtig ob Du hier an der richtigen Stelle nachfragst - Kann mich aber auch täuschen.
Hast mich richtig verunsichert.

Nachtrag:
Zitat:

Connecting to MS Access

On Windows, you can use

Driver = 'Microsoft Access Driver (*.mdb)'
Params.Strings = (
'DBQ=C:\path\to\my\database.mdb'
)

Note: The MS Access ODBC driver seems not to support the SQLPrimaryKeys API function, hence UpdateIndexDefs will fail. Currently, you must set SQLQuery.UsePrimaryAsKey:=false; to avoid an exception until code has been added that tests for the availability of the function in the driver.

khh 12. Feb 2009 11:18

Re: Datenmanipulation (ODBC/Access)
 
Zitat:

Zitat von LuCSteR
lustig :)
als hätte ich sowas nich schon selbst ausprobiert ;)

Immer die gleichen Fehler: EDataBaseError in Lib "db"...

btw lautet das richtige SQL Statement in Delphi umgesetzt:
Delphi-Quellcode:
'Update Entgeltdatei_SIA Set Bezeichnung='+'TEST1'+' where Bezeichnung='+'Unfrei'+''
Habe gerade was von ExecSQL gelesen. Vll werde ich dadurch fündig. Trotzdem danke :)

richtig.

Statements die die Daten manipulieren mit exec.SQL ausführen, reine abfragen mit open.
EDIT: bevor du dich mit access rumschlägst und später eh umsteigen musst, stellt sich die Frage nicht gleich die DB zu wechseln .


gruss KH

LuCSteR 12. Feb 2009 11:31

Re: Datenmanipulation (ODBC/Access)
 
Mhh,

danke erstmal für die Mühe. Ich bin davon ausgegangen, das es unerheblich ist, ob in Delphi oder Lazarus programmiert wird, denn die Komponenten sind die selben. Damit auch die Abläufe und Kommandos? Mhh. ich versuch mein Glück dort.

Aber jetzt würde mich doch mal interssieren wie das unter Delphi realisiert wird. Ein eifnaches Update oder Insert Into...

@khh: siehe #19 kommen in allen möglichen Konstruktionen Fehler :(

HaJo 12. Feb 2009 11:39

Re: Datenmanipulation (ODBC/Access)
 
Du bist aber hartnäckig - lach:

Insert Into mit drei Feldern und drei Parametern:

KI ist eine Query-Komponente mit Änderungseigenschaften!!
Zitat:

Delphi-Quellcode:
        WITH DM DO
            BEGIN
               KI.close;
               KI.SQL.Clear;
               KI.SQL.Add('Insert into Kundeninfo (Nr, Info, Text)');
               KI.SQL.Add('VALUES (:Nr, :Info, :Text)');
               KI.ParamByName('Nr').AsInteger := dm.QryAufschaltungNR.AsInteger;
               KI.ParamByName('Info').AsString := DlgKDInfo.Edit1.Text;
               KI.ParamByName('Text').AsBlob  := DlgKDInfo.Memo1.Text;
               TRY
                  Ki.ExecSQL;
                  DM.tblKundeninfo.Close;
                  DM.tblKundeninfo.Open;
              EXCEPT
               END;
            END;

[edit=mkinzler]Ist den die Verwendung von Delphi-Tags so schwer Mfg, mkinzler[/edit]

LuCSteR 12. Feb 2009 12:08

Re: Datenmanipulation (ODBC/Access)
 
So wie ich das sehe, mache ich nichts anderes...Bei Lazarus braucht man 80% für die Einarbeitung 20% der zeit für das Lösen des eigentlichen Problems...Immerwieder schön :/

khh 12. Feb 2009 12:28

Re: Datenmanipulation (ODBC/Access)
 
Zitat:

Zitat von LuCSteR
So wie ich das sehe, mache ich nichts anderes...Bei Lazarus braucht man 80% für die Einarbeitung 20% der zeit für das Lösen des eigentlichen Problems...Immerwieder schön :/

sehe ich nicht so,
wenn dein Konzept passt funktioniert das mit lazarus einwandfrei.


Gruss KHH

HaJo 12. Feb 2009 12:31

Re: Datenmanipulation (ODBC/Access)
 
Das ist wohl bei jeder Programmiersprache gleich :-)
Sein Handwerkszeug sollte man schon kennen, zumindest zum Teil.

Aber der Riesenvorteil bei "Delphi-Pascal" gegenüber allen anderen Sprachen, ist die durch strukturieren (Einrückungen) und die verständlich/signifikante Syntax, entstehende Übersichtlichkeit.

Man braucht keine ellenlangen Kommentare um sich selber zu erklären was denn der Programmblock gerade macht, wie z.B bei C++, wenn man nach Jahren dort einmal etwas ändern muss.

Zudem sucht bis heutzutage der geniale Compiler von Borland seinesgleichen!

Und das, obwohl der Erfinder von Delphi nun bei Microsoft seinen Job wahr nimmt.

Wie der Compiler bei Lazarus arbeitet - keine Ahnung - aber die Sprache ist die gleiche.

lieben Gruß zu Dir
Jochen

LuCSteR 12. Feb 2009 14:21

Re: Datenmanipulation (ODBC/Access)
 
Iwie führt das hier in die falsche Richtung. Aber trotzdem sag ich kurz noch dazu, das größte Problem von lazarus ist, das es keine eigene Hilfe besitzt.

@KHH:

Verstehe die Intention deiner Aussage nicht aber gut.

Zum Thema:
Folgend sind alle Schritte nochmal aufgeführt, die ich getätigt habe, um Abfragen erfolgreich durchführen zu können.

In den Systemsteuerungen --> Verwaltung --> Datenquellen (ODBC): dort eine "Benutzer DSN" hinzugefügt mit dem Microsoft Access Treiber (.mdb)

- ODBCConnection1
- SQLTransaction1
- Datasource1
- SQLQuery1
- DBGrid1
auf die Form gezogen.


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)


Code sieht dann wie folgt aus:
Delphi-Quellcode:
{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;
Im onButtonClick habe ich rumprobiert, Daten zu manipulieren.
Bspw. so:
Delphi-Quellcode:
SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('Update Entgeltdatei_SIA Set Bezeichnung='+QuotedStr('TEST')+' Where Bezeichnung='+QuotedStr('Unfrei'));
SQLQuery1.ExecSQL;
SQLQuery1.ApplyUpdates;
SQLTransaction1.Commit;
oder so:
Delphi-Quellcode:
SQLQuery1.Close;
ODBCConnection1.ExecuteDirect'Update Entgeltdatei_SIA Set Bezeichnung='+QuotedStr('TEST')+' Where Bezeichnung='+QuotedStr('Unfrei'));
SQLQuery1.ApplyUpdates;
SQLTransaction1.Commit;
Hat alles nichts genützt.

HaJo 12. Feb 2009 15:07

Re: Datenmanipulation (ODBC/Access)
 
Also,

wenn dabei keine Fehlermeldung kam...

mir persönlich sind da zu viele Variable für den ersten Lazarus-Test drinne.
Zudem ist die Verfahrensweise über CachedUpdates eine etwas andere

Auch muss die Funktion "QuotedStr" nicht unbedingt das richtige Ergebnis liefern. Wäre ggf. mit einer Variablen mal zu überprüfen ob wirklich beide Hochkommata verdoppelt werden.

Inm OnKlick-Ereignis des Button folgende Variablen-Deklaration über dem BEGIN mal eintragen:
Delphi-Quellcode:
VAR
   Test : STRING [100];
Zur Sicherheit unter dem
Delphi-Quellcode:
BEGIN
   Test = ''; // Variable initialisieren
Delphi-Quellcode:
SQLQuery1.Close;
SQLQuery1.CachedUpdates := FALSE; //Direkt in der DB ändern - sollte eigentlich Standard sein!
Test := QuotedStr('TEST');
SQLQuery1.SQL.Clear; // <-- hier einen Haltepunkt für den Debuger setzen
                     // und die Variable Test mal auf Inhalt prüfen
                     // sieht der Inhalt wirklich so "TEST" aus?

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

TRY // Kennt Lazarus Try-Exception-Blöcke??
   SQLQuery1.ExecSQL;
EXCEPT
   HALT(0); // Wenn es geht mit dem Debuger - hier auch einen Haltepunkt setzen**
END;
SQLTransaction1.Commit;
** Wenn hier wirklich das Prg beendet wird - funktioniert es - Nur ist dann noch irgendwo ein formeller Fehler drin:-)

Uff - Lazarus und Access - mal sehen


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:33 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