AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Wie Daten einer SQLQuery-Abfrage zurück in DB schreiben?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von F.W. · begonnen am 30. Okt 2008 · letzter Beitrag vom 1. Nov 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#1

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

  Alt 30. Okt 2008, 23:55
Datenbank: ACCESS • Version: 12 • Zugriff über: ADOConnection
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

Danke!
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

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

  Alt 31. Okt 2008, 00:13
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?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#3

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

  Alt 31. Okt 2008, 00:52
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?
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#4

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

  Alt 31. Okt 2008, 03:03
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
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 31. Okt 2008, 06:37
Es würde sicherlich auch nicht schaden, sich mit den Grundlagen relationaler DBs und SQL zu beschäftigen.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#6

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

  Alt 31. Okt 2008, 13:22
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?
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#7

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

  Alt 31. Okt 2008, 14:41
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
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

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

  Alt 31. Okt 2008, 20:42
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.
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#9

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

  Alt 1. Nov 2008, 17:43
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!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#10

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

  Alt 1. Nov 2008, 17:55
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:45 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