Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Wie Daten einer SQLQuery-Abfrage zurück in DB schreiben? (https://www.delphipraxis.net/123329-wie-daten-einer-sqlquery-abfrage-zurueck-db-schreiben.html)

F.W. 30. Okt 2008 22:55

Datenbank: ACCESS • Version: 12 • Zugriff über: ADOConnection

Wie Daten einer SQLQuery-Abfrage zurück in DB schreiben?
 
Ich lese Datensätze aus einer Datenbank mittels SQLQuery aus und speichere die Daten in Objekten, die ich an eine ListBox anhänge.

Ich weiß nur nicht, wie ich sie von da aus wieder zurück in die DB schreiben soll, wenn ich Änderungen daran vorgenommen habe.
Sollte ich vielleicht am besten ein Feld "RecordNo" in meine ListBox-Daten-Klasse integrieren (insofern ich auf das RecordNo-Feld aus einer SQL-Abfrage zugreifen kann) und dann zu jeder RecordNo in der Datenbank springen oder gibt es da andere Wege?
(Jeder Eintrag hat eine eindeutige ID, vielleicht lässt sich ja auch diese Eigenschaft nutzen, aber ich weiß nicht, wie ich anhand des Inhalts eines Feldes an einen einzigen datensatz rankomme. Höchstens über eine Abfrage, aber kann man die Daten einer Abfrage (würde ich über ein SQLQuery tun) bearbeiten und speichern?)

Ich habe schon versucht zu suchen, wusste aber nicht genau, welche Keywords ich nehmen sollte. Also bitte nicht böse sein, sollte ich einen beitrag nicht gefunden haben, der etwas ähnliches beinhaltet :roll:

Danke!

s.h.a.r.k 30. Okt 2008 23:13

Re: Wie Daten einer SQLQuery-Abfrage zurück in DB schreiben?
 
verstehe ich das richtig, dass du die daten aus der "datenbank" access lädst, also per SELECT-query und dann in jeweils einem objekt pro datensatz speicherst. dann änderst du die daten irgendwie und willst die änderungen wieder speichern?

es liegt doch schon auf der hand, dass mit dem UPDATE-query über die eindeutige id die daten speichern kannst!? oder versteh ich da grad falsch? :gruebel:

F.W. 30. Okt 2008 23:52

Re: Wie Daten einer SQLQuery-Abfrage zurück in DB schreiben?
 
Also ich habe eine Access Datenbank und greife über eine ADOConnection darauf zu.
Zusätzlich habe ich noch eine SQLQuery Komponente über die ich eine SELECT Abfrage durchführe um eine kleine Teilmenge zu erhalten.(Ich denke mehr als 100 Datensätze werden nicht dabei rauskommen), die ich dann in der ListBox darstelle. Ich muss diese Daten in seperate Objekte laden, da ich die ListBox im OwnerDraw betreibe und die zu zeichnenden Daten eben die aus den Objekten sind.

Das Problem ist jetzt, dass ich nicht weiß, wie ich die Daten nachher in der DB aktualisiere, wenn sie geändert wurden. Sowas habe ich eben noch nie gemacht.

Ich weiß nicht, ob das mit UPDATE-Query gehen würde.

So wie ich das sehe, muss ich die Daten aus den Objekten entweder im Query aktualisieren und von da aus dann in die DB (so meintest du es oder?) oder ich schreibe die Daten direkt in die DB, nur wie?

s.h.a.r.k 31. Okt 2008 02:03

Re: Wie Daten einer SQLQuery-Abfrage zurück in DB schreiben?
 
mit access habe ich noch nie was gemacht und werde es auch nicht ;) daher habe ich keine ahnung, was du mit "direkt in die DB schreiben" meinst.

der folgende weg führt wohl bei so ziemlich jeder DB zum ziel.

1. daten per SELECT ... FROM laden
2. objekte erzeugen, die die daten aus den einzelnen spalten enthalten. also ein objekt für jeden datensatz. soweit habe ich das ja scheinbar richtig verstanden.
3. um daten zu speichern gehst du einfach deine objekt-liste durch und machst ein UPDATE auf die DB. hier findest du informationen darüber. ist auch nicht viel anders als ein SELECT. daher denke ich, dass du damit keine schwierigkeiten hast.

ps: du könntest diese updatefunktion allerdings auch in die klasse kapseln, in der die objekte gehalten werden. ich gehe mal davon aus, dass du einen container (TList oder dergleichen) hast, in denen du deine objekte speicherst. die klasse mit dem container gibst du einfach die methode getData und setData mit. über die erste methode lädst du eben deine daten (SELECT) und über die zweite speicherst du alle änderungen (UPDATE).

vergiss aber nicht, dass das mit dem update bei mehreren usern zu problemen führen kann. dazu wäre es gut, wenn die datenbank transaktionen unterstützt, was ich dir bei access nicht garantieren kann.

mit freundlichen grüßen
armin

mkinzler 31. Okt 2008 05:37

Re: Wie Daten einer SQLQuery-Abfrage zurück in DB schreiben?
 
Es würde sicherlich auch nicht schaden, sich mit den Grundlagen relationaler DBs und SQL zu beschäftigen.

F.W. 31. Okt 2008 12:22

Re: Wie Daten einer SQLQuery-Abfrage zurück in DB schreiben?
 
Zitat:

Es würde sicherlich auch nicht schaden, sich mit den Grundlagen relationaler DBs und SQL zu beschäftigen.
Ich habe mich bereits mit den grundlagen beschäftigt, würde ich sonst die SQL-Abfrage hinbekommen?

In der Schule haben wir nur mit Access gearbeitet und in den Tutorials, die ich gelesen habe (vom DelphiTreff) wird meist nur erklärt wie man mit Boundcontrols auf die Daten zugreift und dann auch nicht auf Abfragedatenmengen. Und schließlich hab ich ja ach Lösungsvarianten geschrieben, allerdings sind die auf meinem eigenen Mist gewachsen und vielleicht mach ich es mir damit ja viel zu schwer.

Ich denke statt einfach zu schreiben, dass ich mich mal damit beschäftigen sollte, hättest du einfach kurz erklären können wie man es macht, denn scheinbar ist es ja nicht so schwer und scheinbar weißt du wie man das realisieren kann? :dp:

s.h.a.r.k 31. Okt 2008 13:41

Re: Wie Daten einer SQLQuery-Abfrage zurück in DB schreiben?
 
kritik bringt hier keinen weiter ;) also back to topic!

was verstehst du insgesamt denn nicht? gibt es ein problem die UPDATE-query zu basteln oder gibt es noch ein logisches problem, wie du das machen sollst? habe dir in meinem obigen post wohl mehr als genug gesagt, wie du es realisieren kannst. code kann - und will ich aus lerngründen - keinen liefern, da du von sowas keinen effektiven mehreffekt hast. wenn du fragen zu einem codeabschnitt hast, dann poste ihn.

aber normalerweise müsstest du das nun schon hinbekommen! selbst access müsste das unterstützen ;)

sx2008 31. Okt 2008 19:42

Re: Wie Daten einer SQLQuery-Abfrage zurück in DB schreiben?
 
Warum verwendest du keine TAdoQuery?
Beispiel:
Delphi-Quellcode:
AdoQuery1.SQL.Text := 'SELECT * FROM Wetterdaten WHERE Land='+QuotedStr('DE');
AdoQuery1.Open;
AdoQuery1.Edit;
AdoQuery1['NachtTemp'] := -2.5; // Feld ändern
AdoQuery1.Post;
Die VCL werkelt dabei im Hintergrund und erzeugt automatisch eine UPDATE-SQL-Anweisung ohne dass du irgendetwas selbst tun musst.
Das funktioniert natürlich nur bei ganz bestimmten SELECT-Abfragen.
Enthält die Abfrage z.B. GROUP BY weiss die VCL nicht welchen Datensatz du meinst.

F.W. 1. Nov 2008 16:43

Re: Wie Daten einer SQLQuery-Abfrage zurück in DB schreiben?
 
Mein Problem ist nicht, dass ich Quellcode brauche.
Mit der QueryUpdate Methode habt ihr mir schonmal insofern geholfen, dass jetzt eine Frage wegfällt, die spätestens nach meinem großen Problem (mit dem ich diesen Thread gestartet habe) noch gekommen wäre.

Folgende Konstellation:
Code:
+-----------------------+
|                       |
| ListBox.Items.Objects |
|                       |
+-----------------------+

         v v v  < !! Problem !!

+-----------------------+      +--------+
|                       |      |        | 
|       ADOQuery       |  >> |  Table |
|                       |      |        |
+-----------------------+      +--------+
Ich verwende eine TsListBox von den AlphaLiteSkin Controls. Und da sind keine DB Controls dabei. Außerdem möchte ich die Items sowieso selbst zeichnen, um mehr Informationen unterbringen zu können. Dafür hängt jedem Item ein Object an, in dem die Daten sind. (es ist eine Produktdatenbank mit Infos wie Produktname, EInzelpreis, Anzahl etc.)

Mein Problem ist (wie oben eingezeichnet), wie ich eine Verbindung zwischen den Objekten und dem ADOQuery herstellen kann.

Also folgendes Szenario:
Ich habe die Objekte aus dem Query erstellt, diese werden nun zur Anzeige der Einträge benutzt. Jetzt ändere ich einen Wert an den Objekten.
Wie bekomme ich jetzt die Werte vom Objekt zurück ins Query?

Eine Methode könnte ich mir denken, aber ich glaube nicht, dass das die Idealmethode ist (nicht getestet):
Delphi-Quellcode:
TItemData = class
  ID: Integer;
  Produktname: String;
     { ... }
  RecordNo: Integer; // <-- neues Property hinzufügen
end;

//Übertragung von Objekten zu ADOQuery
ADOQuery.Edit;

for I := 0 to ListBox.Items.Count - 1 do begin
    Data := TItemdata(ListBox.Items.objects[I]);
    ADOQuery.RecordNo := Data.RecordNo;

    ADOQuery.FieldByName('Produktname').AsString := Data.Produktname;
end;

ADOQuery.Post;
Vielleicht ist es jetzt etwas offensichtlicher geworden, was mein Problem ist.
Ich bitte vielmals um Entschuldigung für meine ungenaue Ausdrucksweise!

DeddyH 1. Nov 2008 16:55

Re: Wie Daten einer SQLQuery-Abfrage zurück in DB schreiben?
 
Da ADO nach wie vor nicht meine Welt ist, ein eher theoretischer Ansatz:
- die Query mit einem parametrisierten Update-Befehl "laden"
SQL-Code:
UPDATE Tabelle SET Feld1 = :wert1, Feld2 = :wert2
WHERE ID = :id
- Transaktion starten
- in einer Schleife die Objekte durchgehen, Parameter mit den Properties belegen und SQL ausführen
- anschließend commiten
- im Fehlerfall Rollback


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:23 Uhr.
Seite 1 von 2  1 2      

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