![]() |
Datenbank: MS Access • Version: 12 • Zugriff über: ADODataSet
Access Datenbank mit ADODataSet
Hallo,
ich verwende eine Access Datenbank und greife mit ADODataSet darauf zu. Zum Filtern verwende ich SQL. Die Datenbank hat 2 Tabellen. Wenn ich nun
Code:
verwende, woher weiß ich und vor allem ADODataSet in welcher Tabelle der neue Datensatz gespeichert werden soll?
form1.ADODataSet1.Insert;
form1.ADODataSet1.Edit; [..] form1.ADODataSet1.post; Ich hatte schon mal probiert mit 'SELECT * FROM BILDER' bzw. 'SELECT * FROM ARTEN' nur die Einträge einer Tabelle zu bekommen, in der Hoffnung das dann auf diese Tabelle der letzten Abfrage gezeigt wird und dort auch dann der neue Eintrag erstellt wird. Aber das scheint nicht so ganz zu funktionieren. |
AW: Access Datenbank mit ADODataSet
Ich kenne mich mit Datenbanken nicht aus, habe aber vor ein paar Wochen auch einmal kurz schnell etwas für Access mit den ADO-Komponenten zusammengezimmert.
Ich kann nur sagen, dass ich drei Komponenten hatte, in dieser Reihenfolge aufeinander aufbauend: TDataSource->(ADOTable|AdoQuery|…?)->ADOConnection:<Jet, OLE DB, ODBC> TDataSet ist eine implementierende Unterklasse von TDataSource, oder? Somit müsste das Teil doch entweder an einem ADOTable- oder ADOQuery-Objekt dranhängen? |
AW: Access Datenbank mit ADODataSet
Also die Datenbankverbindung an sich klappt wunderbar. Auch die SQL-Abfragen funktionieren.
Das einzigste "Problem" was ich habe, ist das mir nicht klar ist, woher "das System" weiß, in welcher Tabelle ich den neuen Datensatz erstellt haben möchte. DataSource -> ADODataSet ->DBGrid etc. |
AW: Access Datenbank mit ADODataSet
Ich habe nie mit dem ADODataset gearbeitet, sondern nur mit ADOTable/ADOQuery, daher kenne ich die Komponente auch nicht. Aber ich zietiere mal aus der Delphi-Hilfe:
Die Datenmenge wird mit Hilfe der Eigenschaft CommandText des TADODataSet-Objekts abgerufen. Weisen Sie dieser Eigenschaft den betreffenden Tabellennamen oder eine SQL-Anweisung (nur SELECT) zu. Mit der Datenmengenkomponente können nur DML-SQL-Anweisungen (Data Manipulation Language) ausgeführt werden, die eine Ergebnismenge zurückliefern. Für SQL-Anweisungen wie DELETE, INSERT und UPDATE sind Komponenten wie TADOCommand oder TADOQuery besser geeignet. Demnach also für Insert nicht zu empfehlen Gruß Rainer |
AW: Access Datenbank mit ADODataSet
Liste der Anhänge anzeigen (Anzahl: 1)
ADOConnection
DataSource ADOTable Leg noch ein Datenmodul an und klatsche da alles drauf. Dann lege eine oder mehrere Forms an und schreibe in Uses Datamodul oder wie das Ding auch immer heissen soll. Dann klatsche eine Tabelle auf eine Form und schau dann im Objektinspektor was für eine Tabelle oder Table usw. zugewiesen werden soll. Siehe Abb.1 |
AW: Access Datenbank mit ADODataSet
Wenn was in Access trotz keiner Fehler nicht sichtbar ist liegt das am bescheuerten Caching-Verhalten von Access.
Im Entwickler-Forum gabs mal Beispielcode wie man die Jet-Engine zwingen kann ohne jedesmal die Verbindung zu beenden den Cache zu leeren.. Leider finde ich den Beitrag nicht mehr. War von Andreas Kosch. |
AW: Access Datenbank mit ADODataSet
Ähm? Nicht sichtbar?
Also wenn ich einen neuen Datensatz erzeuge ist der schon sichtbar, er ist nur nicht in der Tabelle wo ich ihn gerne hätte. Ich verbinde das ADODataset mit einer Datenbank. Im Connectionstring steht nix von einer Tabelle o.ä. Da lege ich nur fest welche Datenbank. Wenn ich nun ne Abfrage mache, ist es mittels SQL ja kein Problem diese Abfrage über mehrere Tabellen laufen zu lassen. Und nun gehe ich her und erstelle einen neuen Datensatz. ADODataSet1.Insert; <--Toll, "insert"..Und wo? Er weiß doch gar nicht in welcher Tabelle er das einfügen soll. Im Notfall kann man ja auch mittels SQL nen Datensatz erzeugen. Das werde ich dann wohl auch machen müssen, wenn es mit den Delphi Hausmitteln vom Zufall abhängig ist, wo meine Daten landen. Aber erstmal abwarten, vielleicht meldet sich ja noch jemand der das Problem schon mal hatte :-D |
AW: Access Datenbank mit ADODataSet
Hallo,
Zitat:
![]() ![]() Dann wirst Du über die Eigenschaften CommandText und CommandType stolpern. Mit:
Delphi-Quellcode:
sollte einen Datensatz in die Tabelle schreiben. (Nicht getestet)
ADODataSet1.CommandText := 'Tablename'; // z. B. 'BILDER'
ADODataSet1.CommandType := cmdTable; // bzw. cmdTableDirect ADODataSet1.Insert; ADODataSet1.FieldByName ('Fieldname').AsString := 'Fieldvalue'; [...] ADODataSet1.Post Aber wie hier und in der OH schon erwähnt ist für ein INSERT TADOCommand besser geeignet. Gruß |
AW: Access Datenbank mit ADODataSet
Poste doch mal ein abgespecktes Beispiel hier
|
AW: Access Datenbank mit ADODataSet
Zitat:
Erzeugst du ein Dataset zur Laufzeit, um z.B. neue Datensätze anzulegen, gehst du analog vor:
Delphi-Quellcode:
Oder wenn du mit einem Query und SQL arbeiten willst:
function TDatMod.Waren_NeuerDatensatz(Art_Nr, Anzahl, Lieferant: Integer; Farbe : String): Boolean;
Var AsetNeu : TAdoDataset; begin Result := False; AsetNeu := TAdoDataset.Create(DatMod); Try AsetNeu.Connection := ADOCon; AsetNeu.CommandText := 'select * from WarenTabelle'; AsetNeu.Active := True; AsetNeu.Append; // oder AsetNeu.Insert; AsetNeu.FieldByName('ArtikelNr').AsInteger := Art_Nr; AsetNeu.FieldByName('Anzahl').AsInteger := Anzahl; AsetNeu.FieldByName('Lieferant').AsInteger := Lieferant; AsetNeu.FieldByName('Farbe').AsString := Farbe; AsetNeu.Post; Result := True; Finally FreeAndNil(AsetNeu); End; end;
Delphi-Quellcode:
Du siehst hier am Aufbau der beiden Funktionen im Grunde alles, was dazu nötig ist, neue Datensätze einzufügen.
function TDatMod.Waren_NeuerDatensatz(Art_Nr, Anzahl, Lieferant: Integer; Farbe : String): Boolean;
Const K = ','; // Komma Ka = '('; // KlammerAuf Kz = ')'; // KlammerZu Var AQuery : TAdoQuery; begin Result := False; AQuery := TAdoDataset.Create(DatMod); Try AQuery.Connection := ADOCon; AQuery.SQL.Append('insert into WarenTabelle'); AQuery.SQL.Append(Ka + 'ArtikelNr, Anzahl, Lieferant, Farbe' + Kz); AQuery.SQL.Append('values'); AQuery.SQL.Append(Ka + IntTostr(Art_Nr) + K + IntToStr(Anzahl) + K + IntToStr(Lieferant) + K + QuotedStr(Farbe) + Kz); AQuery.ExecSQL; Result := True; Finally FreeAndNil(AsetNeu); End; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:38 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