![]() |
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:
Grüße
//Benutzer-DSN Name
ODBCConnection1.DatabaseName:='test1'; //wichtig für Queries SQLQuery1.UsePrimaryKeyAsKey:=false; SQLQuery1.Active:=true; //Connect ODBCConnection1.Connected:=true; |
Re: Datenmanipulation (ODBC/Access)
Zitat:
Delphi-Quellcode:
EDIT: funktioniert natürlich auch mit update, insert usw.
sqlQuery1.sql.clear;
sqlQuery1.sql.add('select blabla ' ); gruss KH [edit=mkinzler]Fehlende Tags ergänzt Mfg, mkinzler[/edit] |
Re: Datenmanipulation (ODBC/Access)
Normalerweise macht man das mit:
Zitat:
Dein Satz: Zitat:
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:
|
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 |
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? |
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 :) |
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. |
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. |
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 |
Re: Datenmanipulation (ODBC/Access)
siehe oberen Beitrag ~missclicked~
|
Re: Datenmanipulation (ODBC/Access)
Zitat:
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. |
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 |
Re: Datenmanipulation (ODBC/Access)
Zitat:
|
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 |
Re: Datenmanipulation (ODBC/Access)
Zitat:
|
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:
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 :)
{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; grüße |
Re: Datenmanipulation (ODBC/Access)
Hallo Lucster,
wie wäre es mit
SQL-Code:
dann wird in allen Sätzen die Bratzelzeichnung durch Bretzelzeichnung ersetzt.
'Update Entgeltdatei_SIA Set Bezeichnung='Bretzelzeichnung' where Bezeichnung='Bratzelzeichnung';
gruß K-H |
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:
Habe gerade was von ExecSQL gelesen. Vll werde ich dadurch fündig. Trotzdem danke :)
SQLQuery1.SQL.Add('Update Entgeltdatei_SIA Set Bezeichnung='+QuotedStr('TEST')+' Where Bezeichnung='+QuotedStr('Unfrei'));
|
Re: Datenmanipulation (ODBC/Access)
Delphi-Quellcode:
--> EListError ... mit
SQLQuery1.SQL.Add('Update Entgeltdatei_SIA Set Bezeichnung='+QuotedStr('TEST')+' Where Bezeichnung='+QuotedStr('Unfrei'));
SQLQuery1.Params[0].DataType:=ftString; SQLQuery1.ExecSQL;
Delphi-Quellcode:
hinten dran auch...
SQLQuery1.Active:=true;
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, |
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:
![]() 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:
|
Re: Datenmanipulation (ODBC/Access)
Zitat:
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 |
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 :( |
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:
|
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 :/
|
Re: Datenmanipulation (ODBC/Access)
Zitat:
wenn dein Konzept passt funktioniert das mit lazarus einwandfrei. Gruss KHH |
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 |
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:
Im onButtonClick habe ich rumprobiert, Daten zu manipulieren.
{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; Bspw. so:
Delphi-Quellcode:
oder so:
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;
Delphi-Quellcode:
Hat alles nichts genützt.
SQLQuery1.Close;
ODBCConnection1.ExecuteDirect'Update Entgeltdatei_SIA Set Bezeichnung='+QuotedStr('TEST')+' Where Bezeichnung='+QuotedStr('Unfrei')); SQLQuery1.ApplyUpdates; SQLTransaction1.Commit; |
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:
Zur Sicherheit unter dem
VAR
Test : STRING [100];
Delphi-Quellcode:
BEGIN
Test = ''; // Variable initialisieren
Delphi-Quellcode:
** Wenn hier wirklich das Prg beendet wird - funktioniert es - Nur ist dann noch irgendwo ein formeller Fehler drin:-)
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; Uff - Lazarus und Access - mal sehen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:01 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-2025 by Thomas Breitkreuz