Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Daten in einer Datenbank speichern (https://www.delphipraxis.net/190755-daten-einer-datenbank-speichern.html)

darkrose 3. Nov 2016 13:27

Datenbank: My SQL • Version: MYSQL 5.1.4 • Zugriff über: ODBC

Daten in einer Datenbank speichern
 
Hallo Liebe Gemeinde,
ich habe ein Problem und schon viel nach Lösungen gesucht aber irgendwie nicht das Richtige gefunden.
Ich möchte über ein Delphi Programm Daten in einer Datenbank Speichern.
Als Hauptformular habe ich die Anzeige der Daten aus der Datenbank und über ein Hinzufügen-Button öffnet sich ein Zweites Formular welches mir ermöglicht alle Relevanten Daten einzugeben welche dann in der Datenbank gespeichert werden sollen.
Jedoch weiß ich einfach nicht wie ich das Speichern realisieren soll. An sich soll es so laufen, dass ich über editfelder die daten ein gebe und diese dann gespeichert werden sollen.
Kann mir jemand helfen oder hat jemand noch andere Lösungsansätze?
Denn irgendwann soll auch das Bearbeiten der daten möglich sein.
Im übrigen arbeite ich mit xampp.

Vielen Dank schon mal für eure Hilfe

mkinzler 3. Nov 2016 13:36

AW: Daten in einer Datenbank speichern
 
https://www.delphi-treff.de/tutorials/datenbanken/

darkrose 3. Nov 2016 14:11

AW: Daten in einer Datenbank speichern
 
Hätte die Seite mir geholfen würde ich hier nicht fragen

frapo 3. Nov 2016 14:45

AW: Daten in einer Datenbank speichern
 
Zitat:

Zitat von darkrose (Beitrag 1352561)
Hätte die Seite mir geholfen würde ich hier nicht fragen

Genau auf der Seite gibt es aber eine Fülle an Informationen. Wenn dir diese Seite nicht weiterhilft, wäre es ein guter Ansatz hier mal konkret zu benennen, wo du momentan stecken bleibst.

Hilfreich wäre auch Code zu zeigen den du bisher hast. Irgendwo muss man ja ansetzen, wenn dir die angegebene Seite schon keine Hilfestellung sein kann.

Darlo 3. Nov 2016 14:53

AW: Daten in einer Datenbank speichern
 
Ich schließe einfach mal aus deinem Eröffnungspost, dass bei Dir noch einige ? sind....
Wenn Du xampp verwendest wirst Du wohl auch mysql verwenden. Das würde ich persönlich gegen eine postgreSQL austauschen.

Daten speichert man mit 'Insert'. Bearbeiten mit 'update'. Suchen mit 'Select'.
Du solltest dich erstmal in das Thema Datenbanken und SQL einlesen. Anschließend mit der Anbindung der Datenbank über Delphi. Ich verwende dafür FireDac oder UniDac.

Jim Carrey 3. Nov 2016 15:01

AW: Daten in einer Datenbank speichern
 
Wenn du Xampp verwendest, wird es ja wohl auch eine Webseite geben.
Hier meine stupide aber funktionierende Lösung, für die ihr mich alle hassen werdet!

Benutze die Indy-Komponenden (idHTTP) und schicke deine Daten per Get an ein PHP-Script deiner Webseite. Zum Beispiel:
Delphi-Quellcode:
//
IdHTTP1.Get('http://localhost/delphi.php?name=klaus&wohnort=nirgendwo');
Nun kannst du in deinem PHP-Script abfragen, ob "name" und "wohnort" da sind:
Code:
// delphi.php
<?php
 $name = $_GET['name'];
 $wohnort = $_GET['wohnort'];

 // nun stelle an mit den Daten was auch immer du möchtest (Speicherung in einer MySQL-DB etc) - Validierung vorher nicht vergessen!
?>
Wozu FireDac und all der Blödsinn, wenn man es doch auch so machen kann?
Wir sind nicht alle hoch-professionelle Programmierer die an einer 10.000€-Software arbeiten.
Hobbymäßig tut es meine Lösung voll und ganz.

Wenn das PHP-Script gut geschrieben und die Validierung in Ordnung ist, ist alles bestens.
Man braucht keine Logindaten in der Software anzugeben und all den Quark, denn alles wird zentral vom Script gesteuert.

Stellt euch mal vor die Software hat einen Bug den es in einer neueren Version nicht gibt.
Hier hätte man schlechte Karten. Wird jedoch alles vom Script gesteuert, ist es egal welche Version der Software der Anwender hat, denn man regel im Script immer alles für alle Anwender jeder Version.

frapo 3. Nov 2016 15:10

AW: Daten in einer Datenbank speichern
 
Aua.. nur weil er XAMMP installiert hat, heißt es doch nicht, dass es um eine Webseite geht. Vielleicht hat er einfach den ganzen Stack installiert und will erst mal nur ganz profan auf die DB Zugriff haben. Dazu fehlen halt Informationen vom Fragesteller, was er genau vorhat. Alles Fischen im Trüben bisher.
Nun gleich mit PHP zu kommen, vereinfacht das alles nicht unbedingt ;)

Ich verstehe es bisher so, dass er in erster Linie direkt mit Delphi auf eine lokale MySQL-Instanz zugreifen möchte. Da bleibt erst mal die Frage: klappt überhaupt der Connect? Warum überhaupt zwingend ODBC? Und dergleichen.

Jumpy 3. Nov 2016 15:36

AW: Daten in einer Datenbank speichern
 
Vielleicht ist auch phpMyAdmin ein Stichwort für den TE, wenn es ihm erstmal darum geht bei MySQL eine Datenbank zu erstellen und Tabellen einzurichten usw.

Aviator 3. Nov 2016 15:40

AW: Daten in einer Datenbank speichern
 
Für den Zugriff auf eine MySQL Datenbank wären die Zeos Komponenten vielleicht auch ganz interessant.

darkrose 3. Nov 2016 17:12

AW: Daten in einer Datenbank speichern
 
Liste der Anhänge anzeigen (Anzahl: 3)
Schon mal Vielen Dank für die vielen Antworten...

So um mal zu erklären was genau das Problem ist. (Entschuldigung vorher bin ich nicht richtig dazu gekommen)

Zunächst einmal ist es nur ein rein Privates Programm für mich ohne Webseitenanbindung. Warum ich xampp verwende? Weil ich das so mal vor 3-4 Jahren gelernt habe und einfach nur das Gelernte verwende. Somit bin ich auch etwas aus der Übung.

Ich habe vor in einer Datenbank meine Vorhanden Noten zu Speichern damit ich zu Hause genau weiß wo welche Noten liegen.
Zur Verbindung zwischen der Datenbank und dem Delphi arbeite ich mit ODBC (hoffe die erklärung stimmt).

Ich habe zwei Oberflächen auf der einen werden in Edit Feldern der Inhalt der DB ausgegeben und ich kann über den Navigator mir jeden einzelnen Eintrag anschauen.
Auf die zweite Oberfläche komme ich über einen Button und dort möchte ich Daten eintragen, welche dann in meine DB gespeichert werden. (Bilder sind dabei)

Das Anzeigen der Daten funktioniert einwandfrei und macht keine Probleme.
Beim Einfügen der Daten in die DB bekomme ich jedoch einen Fehler und weiß nicht wie ich ihn beheben kann. (Bild dabei)

So sieht mein Quellcode zum Hinzufügen des Datensatzes aus.


Delphi-Quellcode:

unit edit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, DBTables;

type
  Tform2 = class(TForm)
    btnhinz: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    edtitel1: TEdit;
    Query1: TQuery;
    Tnoten: TTable;
    DSnoten: TDataSource;
    DSQuery: TDataSource;
    edkomponist: TEdit;
    edonr: TEdit;
    Label5: TLabel;
    edtitel2: TEdit;
    UpdateSQL1: TUpdateSQL;
    procedure Button2Click(Sender: TObject);
    procedure btnhinzClick(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  form2: Tform2;

implementation

uses anzeige;
{$R *.dfm}

procedure Tform2.Button2Click(Sender: TObject);
begin
  form2.close;
end;



procedure Tform2.btnhinzClick(Sender: TObject);
var titel1,titel2, autor, onr: string;
var query: ANSIString;
begin
  Query1.Close;
  Query1.SQL.Clear;
  titel1:= edtitel1.Text;
  titel2:= edtitel2.Text;
  autor:= edkomponist.Text;
  onr := edonr.Text;
   query := 'INSERT INTO noten (titel1,titel2, autor, oid)' +
   'VALUES (' +#39+ titel1 +#39+ ', ' + #39+autor +#39+',' + #39+onr + #39+');';
   Query1.SQL.Add(query);
   Query1.Open;
   Query1.Active := true;

end;

end.
Ich hoffe ich konnte mein Problem gut darstellen.

Aviator 3. Nov 2016 17:18

AW: Daten in einer Datenbank speichern
 
Die Fehlermeldung sagt doch schon alles. Die Tabelle "noten" ist in der Datenbank nicht vorhanden. Du solltest die erst mal erstellen. Hierzu entweder den Code von Hand ausführen mit
SQL-Code:
CREATE TABLE ...
oder eines der vielen grafischen DB Verwaltungstools verwenden. PHPMyAdmin oder (mein Favorit) HeidiSQL.

Dann sollte zumindest mal der Fehler mit der Tabelle verschwinden. :-D

darkrose 3. Nov 2016 17:24

AW: Daten in einer Datenbank speichern
 
Zitat:

Zitat von Aviator (Beitrag 1352598)
Die Fehlermeldung sagt doch schon alles. Die Tabelle "noten" ist in der Datenbank nicht vorhanden. Du solltest die erst mal erstellen. Hierzu entweder den Code von Hand ausführen mit
SQL-Code:
CREATE TABLE ...
oder eines der vielen grafischen DB Verwaltungstools verwenden. PHPMyAdmin oder (mein Favorit) HeidiSQL.

Dann sollte zumindest mal der Fehler mit der Tabelle verschwinden. :-D

Aber in meiner Datenbank existiert die Datenbank noten und die Verbindung besteht auch.

mkinzler 3. Nov 2016 17:28

AW: Daten in einer Datenbank speichern
 
Und stimmt auch der Datenbanktyp und der Pfad?

darkrose 3. Nov 2016 17:29

AW: Daten in einer Datenbank speichern
 
Zitat:

Zitat von mkinzler (Beitrag 1352600)
Und stimmt auch der Datenbanktyp und der Pfad?

Wie Datenbanktyp und Pfad?

Jim Carrey 3. Nov 2016 17:38

AW: Daten in einer Datenbank speichern
 
Ich kann zwar nicht weiter helfen, da du laut Angabe doch nur DB und Programm verwendest (und keine Webseite) aber..
wieso noch Delphi 7? Delphi 10.1 Starter ist gratis.

darkrose 3. Nov 2016 17:42

AW: Daten in einer Datenbank speichern
 
Zitat:

Zitat von Jim Carrey (Beitrag 1352603)
Ich kann zwar nicht weiter helfen, da du laut Angabe doch nur DB und Programm verwendest (und keine Webseite) aber..
wieso noch Delphi 7? Delphi 10.1 Starter ist gratis.

weil ich delphi 7 mal bekommen habe, ich damit früher gearbeitet habe und sonst nie was gratis mäßiges gefunden hatte

Jim Carrey 3. Nov 2016 17:43

AW: Daten in einer Datenbank speichern
 
Delphi 10.1 Berlin Starter - kostenlos :thumb:

mkinzler 3. Nov 2016 17:45

AW: Daten in einer Datenbank speichern
 
https://www.embarcadero.com/products...ional-download

darkrose 3. Nov 2016 17:47

AW: Daten in einer Datenbank speichern
 
Vielen Dank aber ich wage zu bezweifeln, dass das mein Problem löst

Jim Carrey 3. Nov 2016 18:01

AW: Daten in einer Datenbank speichern
 
Das tut es definitiv nicht, das habe ich auch nie behauptet :stupid:

Luckie 3. Nov 2016 18:29

AW: Daten in einer Datenbank speichern
 
Gibt es die Datenbankdateien denn in den Pfad, den dir die Fehlermeldung anzeigt?

frapo 4. Nov 2016 00:09

AW: Daten in einer Datenbank speichern
 
Zitat:

Zitat von darkrose (Beitrag 1352599)
Aber in meiner Datenbank existiert die Datenbank noten und die Verbindung besteht auch.

Das die DB schon mal existiert, ist ja schon mal fein :).

Nur muss in dieser DB dann auch eine TABELLE mit dem Namen "Noten" existieren. Damit es da nicht zur Verwirrung kommt, wäre ein passender Name für die DB vielleicht "Notenarchiv". In dieser DB sollte dann eine Tabelle mit dem Namen "Noten" vorhanden sein. Letztlich werden deine Daten ja dann in der Tabelle abgelegt.

Wie hast du die DB angelegt? Über die Kommandozeile oder einem Tool wie phpMyAdmin?

bcvs 4. Nov 2016 06:57

AW: Daten in einer Datenbank speichern
 
Zitat:

Zitat von darkrose (Beitrag 1352596)
Das Anzeigen der Daten funktioniert einwandfrei und macht keine Probleme.

Das ist ja schon mal was.
Wie zeigst du die Daten denn an? Ich vermute mal über TDBxxx-Komponenten, die über eine Datasource an deiner Tabelle Tnoten hängen.

In den Eigenschaften dieser Tnoten steht ja dann eigentlich schon alles drin, was du brauchst. Schau einfach mal, wie es da gemacht ist. Ich vermute mal, dass in deiner Query1 die Eigenschaft DatabaseName nicht gesetzt ist.

Das Einfügen könntest du übrigens auch über die TTable machen:
Delphi-Quellcode:
TNoten.Append;
TNoten.FieldByName('titel1').AsString:=edtitel1.Text;
TNoten.Post;

TBx 4. Nov 2016 07:38

AW: Daten in einer Datenbank speichern
 
Delphi-Quellcode:
procedure Tform2.btnhinzClick(Sender: TObject);
var titel1,titel2, autor, onr: string;
var query: ANSIString;
begin
  Query1.Close;
  Query1.SQL.Clear;
  titel1:= edtitel1.Text;
  titel2:= edtitel2.Text;
  autor:= edkomponist.Text;
  onr := edonr.Text;
   query := 'INSERT INTO noten (titel1,titel2, autor, oid)' +
   'VALUES (' +#39+ titel1 +#39+ ', ' + #39+autor +#39+',' + #39+onr + #39+');';
   Query1.SQL.Add(query);
   Query1.Open; //--> Es soll eigentlich doch ein Statement ausgeführt werden und nicht eine Datenmenge geöffnet
   Query1.Active := true; // das ist eine Doppelung zur vorherigen Zeile

end;
Ohne jetzt näher auf Deinen Code einzugehen, sei angemerkt, dass Du ja eigentlich ein SQL ausführen willst. -->
Delphi-Quellcode:
Query1.ExecSQL
Das verwendete
Delphi-Quellcode:
Query1.Open;
ist dazu nicht verwendbar.
Das
Delphi-Quellcode:
Query1.Active := true;
ist eine Doppelung und somit obsolet.

nahpets 4. Nov 2016 07:40

AW: Daten in einer Datenbank speichern
 
Zitat:

Zitat von darkrose (Beitrag 1352596)
Schon mal Vielen Dank für die vielen Antworten...

So um mal zu erklären was genau das Problem ist. (Entschuldigung vorher bin ich nicht richtig dazu gekommen)

Zunächst einmal ist es nur ein rein Privates Programm für mich ohne Webseitenanbindung. Warum ich xampp verwende? Weil ich das so mal vor 3-4 Jahren gelernt habe und einfach nur das Gelernte verwende. Somit bin ich auch etwas aus der Übung.

Ich habe vor in einer Datenbank meine Vorhanden Noten zu Speichern damit ich zu Hause genau weiß wo welche Noten liegen.
Zur Verbindung zwischen der Datenbank und dem Delphi arbeite ich mit ODBC (hoffe die erklärung stimmt).

Ich habe zwei Oberflächen auf der einen werden in Edit Feldern der Inhalt der DB ausgegeben und ich kann über den Navigator mir jeden einzelnen Eintrag anschauen.
Auf die zweite Oberfläche komme ich über einen Button und dort möchte ich Daten eintragen, welche dann in meine DB gespeichert werden. (Bilder sind dabei)

Das Anzeigen der Daten funktioniert einwandfrei und macht keine Probleme.
Beim Einfügen der Daten in die DB bekomme ich jedoch einen Fehler und weiß nicht wie ich ihn beheben kann. (Bild dabei)

So sieht mein Quellcode zum Hinzufügen des Datensatzes aus.


Delphi-Quellcode:

unit edit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, DBTables;

type
  Tform2 = class(TForm)
    btnhinz: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    edtitel1: TEdit;
    Query1: TQuery;
    Tnoten: TTable;
    DSnoten: TDataSource;
    DSQuery: TDataSource;
    edkomponist: TEdit;
    edonr: TEdit;
    Label5: TLabel;
    edtitel2: TEdit;
    UpdateSQL1: TUpdateSQL;
    procedure Button2Click(Sender: TObject);
    procedure btnhinzClick(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  form2: Tform2;

implementation

uses anzeige;
{$R *.dfm}

procedure Tform2.Button2Click(Sender: TObject);
begin
  form2.close;
end;



procedure Tform2.btnhinzClick(Sender: TObject);
var titel1,titel2, autor, onr: string;
var query: ANSIString;
begin
  Query1.Close;
  Query1.SQL.Clear;
  titel1:= edtitel1.Text;
  titel2:= edtitel2.Text;
  autor:= edkomponist.Text;
  onr := edonr.Text;
   query := 'INSERT INTO noten (titel1,titel2, autor, oid)' +
   'VALUES (' +#39+ titel1 +#39+ ', ' + #39+autor +#39+',' + #39+onr + #39+');';
   Query1.SQL.Add(query);
   Query1.Open;
   Query1.Active := true;

end;

end.
Ich hoffe ich konnte mein Problem gut darstellen.

Da Du im ersten Formular die Daten angezeigt bekommst, müssen Datenbank und Tabelle existieren:!:

Also liegt das Problem woanders.

Mit dem obigen Quelltext kann das aber nicht funktionieren, da hier ein paar wichtige Informationen fehlen.

Was ist Query1, wie sind da die Eigenschaften im Objektinspektor?

Da die Datenbankverbindung im ersten Formular funktioniert, sollten die dortigen Einstellungen exakt übernommen werden, ggfls. auch die Komponente, die die Datenbankverbindung herstellt.

Die Fehlermeldung läßt darauf schließen, dass Du TQuery benutzt, das ist die Komponente, die über die BDE arbeitet, nur diese sucht zuerst nach Paradoxdateien (Endung .DB) und dann nach DBasedateien (Endung .DBF). Ebenso die Benutzung der Unit DBTables;

Eine alternative Möglichkeit zur Datenspeicherung wäre, im Formular 2 die Datenbankkomponente aus Formular 1 zu verwenden. Das könnte dann so aussehen:
Delphi-Quellcode:
procedure Tform2.btnhinzClick(Sender: TObject);
begin
  Form1.Table1.Append;
  Form1.Table1.FieldByName('titel1').AsString := edtitel1.Text;
  Form1.Table1.FieldByName('titel2').AsString := edtitel2.Text;
  Form1.Table1.FieldByName('autor').AsString := edkomponist.Text;
  Form1.Table1.FieldByName('oid').AsString   := edonr.Text;
  Form1.Table1.Post;
end;
Wenn Du lieber mit einer Query arbeiten möchtest, so sorge bitte zuerst im Objektinspektor dafür, dass Du in der Entwicklungsumgebung eine Datenbankverbindung hergestellt bekommst.

Dazu gibst Du bitte in der Eigenschaft SQL ein gültiges SQL ein. Dies könnte z. B. so aussehen:
SQL-Code:
select * from noten where 1 = 2
Anschließend setzt Du die Eigenschaft Active auf True. Solange es dabei eine Fehlermeldung gibt, stimmt irgendwas nicht.
Der Inhalt der Eigenschaft Database muss mit dem der Datenbankkomponente aus Formular 1 übereinstimmen.
Sofern Du (wie ich vermute) in Formular 1 eine TTable-Komponente nutzt, schau dort bitte, welcher Tabellenname in der Eigenschaft TableName steht. Dieser Tabellenname muss mit dem Tabellennamen im Select-Statement übereinstimmen. Hier also "noten" heißen, ist dort ein anderer Tabellenname angegeben, so musst Du diesen hier übernehmen.

Wenn Du nun die Datenbankverbindung im Objektinspektor erfolgreich hinbekommen hast, setzt Du die Eigenschaft Active auf False.

Danach kannst Du es dann mit folgendem Code probieren:
Delphi-Quellcode:
procedure Tform2.btnhinzClick(Sender: TObject);
var titel1,titel2, autor, onr: string;
var query: ANSIString;
begin
  Query1.Close;
  Query1.SQL.Clear;
  titel1 := QuotedStr(edtitel1.Text);
  titel2 := QuotedStr(edtitel2.Text);
  autor := QuotedStr(edkomponist.Text);
  onr   := QuotedStr(edonr.Text);
  query := Format('INSERT INTO noten (titel1, titel2, autor, oid) VALUES (%s, %s , %s, %s',[titel1, titel2,a utor, onr]);
  Query1.SQL.Add(query);
  Query1.ExecSQL;
end;
Alternativ wäre auch sowas möglich:
Delphi-Quellcode:
procedure Tform2.btnhinzClick(Sender: TObject);
begin
  Query1.Close;
  Query1.ParamCheck := True;
  Query1.SQL.Text := 'INSERT INTO noten (titel1, titel2, autor, oid) VALUES (:titel1, :titel2, :autor, :onr)';
  Query1.Params[0].AsString := edtitel1.Text;
  Query1.Params[1].AsString := edtitel2.Text;
  Query1.Params[2].AsString := edKomponist.Text;
  Query1.Params[3].AsString := edonr.Text;
  Query1.ExecSQL;
end;
Wenn Du diese Query ausschließlich zum Einfügen neuer Daten benutzen willst, so kannst Du das SQL-Statement bereits im Objektinspektor in die Eigenschaft SQL schreiben. Die Eigenschaft ParamCheck muss auf jeden Fall auf True stehen, was (bei Delphi 7) normalerweise auch die Vorgabe ist.
Steht das SQL bereits in der Eigenschaft SQL der Query, so kannst Du obige Routine noch vereinfachen:
Delphi-Quellcode:
procedure Tform2.btnhinzClick(Sender: TObject);
begin
  Query1.Params[0].AsString := edtitel1.Text;
  Query1.Params[1].AsString := edtitel2.Text;
  Query1.Params[2].AsString := edKomponist.Text;
  Query1.Params[3].AsString := edonr.Text;
  Query1.ExecSQL;
end;
Folgendes ist nicht sinnvoll:
Delphi-Quellcode:
   Query1.Open;
   Query1.Active := true;
Open öffnet die Abfrage, Active := true ebenfalls. Das ist doppeltgemoppelt. Beides ist nur für Select-Statemens zulässig, da eine Ergebnismenge zur weiteren Verarbeitung geliefert wird.
Für Insert, Update, Delete ... muss man ExecSQL nutzen. Hier wird keine Ergebnismenge geliefert. Nutzt man für Insert, Update, Delete ... Open bzw. Active := true, so erhält man unweigerlich eine Fehlermeldung, die sinngemäß besagt, dass man keine Ergebnismenge geliefert bekommt. Das ist unschön und lästig.
Möchte man bei ExecSQL wissen, ob und ggfls. wieviele Zeilen eingefügt, verändert oder gelöscht wurden, so kann man die Eigenschaft RowsAffected abfragen. Im Zusammenhang mit Deiner Aufgabenstellung müsste hier dann eigentlich immer RowsAffected = 1 sein.

Falls weiterhin Fehler auftreten sollten, hänge bitte den vollständigen Quellcode hier an (auch die Formulardateien (*.dfm)), damit eine etwas genauere Fehlersuche möglich wird.

darkrose 16. Nov 2016 15:35

AW: Daten in einer Datenbank speichern
 
Zitat:

Zitat von nahpets (Beitrag 1352626)
Da Du im ersten Formular die Daten angezeigt bekommst, müssen Datenbank und Tabelle existieren:!:

Also liegt das Problem woanders.

Mit dem obigen Quelltext kann das aber nicht funktionieren, da hier ein paar wichtige Informationen fehlen.

Was ist Query1, wie sind da die Eigenschaften im Objektinspektor?

Da die Datenbankverbindung im ersten Formular funktioniert, sollten die dortigen Einstellungen exakt übernommen werden, ggfls. auch die Komponente, die die Datenbankverbindung herstellt.

Die Fehlermeldung läßt darauf schließen, dass Du TQuery benutzt, das ist die Komponente, die über die BDE arbeitet, nur diese sucht zuerst nach Paradoxdateien (Endung .DB) und dann nach DBasedateien (Endung .DBF). Ebenso die Benutzung der Unit DBTables;

Eine alternative Möglichkeit zur Datenspeicherung wäre, im Formular 2 die Datenbankkomponente aus Formular 1 zu verwenden. Das könnte dann so aussehen:
Delphi-Quellcode:
procedure Tform2.btnhinzClick(Sender: TObject);
begin
  Form1.Table1.Append;
  Form1.Table1.FieldByName('titel1').AsString := edtitel1.Text;
  Form1.Table1.FieldByName('titel2').AsString := edtitel2.Text;
  Form1.Table1.FieldByName('autor').AsString := edkomponist.Text;
  Form1.Table1.FieldByName('oid').AsString   := edonr.Text;
  Form1.Table1.Post;
end;
Wenn Du lieber mit einer Query arbeiten möchtest, so sorge bitte zuerst im Objektinspektor dafür, dass Du in der Entwicklungsumgebung eine Datenbankverbindung hergestellt bekommst.

Dazu gibst Du bitte in der Eigenschaft SQL ein gültiges SQL ein. Dies könnte z. B. so aussehen:
SQL-Code:
select * from noten where 1 = 2
Anschließend setzt Du die Eigenschaft Active auf True. Solange es dabei eine Fehlermeldung gibt, stimmt irgendwas nicht.
Der Inhalt der Eigenschaft Database muss mit dem der Datenbankkomponente aus Formular 1 übereinstimmen.
Sofern Du (wie ich vermute) in Formular 1 eine TTable-Komponente nutzt, schau dort bitte, welcher Tabellenname in der Eigenschaft TableName steht. Dieser Tabellenname muss mit dem Tabellennamen im Select-Statement übereinstimmen. Hier also "noten" heißen, ist dort ein anderer Tabellenname angegeben, so musst Du diesen hier übernehmen.

Wenn Du nun die Datenbankverbindung im Objektinspektor erfolgreich hinbekommen hast, setzt Du die Eigenschaft Active auf False.

Danach kannst Du es dann mit folgendem Code probieren:
Delphi-Quellcode:
procedure Tform2.btnhinzClick(Sender: TObject);
var titel1,titel2, autor, onr: string;
var query: ANSIString;
begin
  Query1.Close;
  Query1.SQL.Clear;
  titel1 := QuotedStr(edtitel1.Text);
  titel2 := QuotedStr(edtitel2.Text);
  autor := QuotedStr(edkomponist.Text);
  onr   := QuotedStr(edonr.Text);
  query := Format('INSERT INTO noten (titel1, titel2, autor, oid) VALUES (%s, %s , %s, %s',[titel1, titel2,a utor, onr]);
  Query1.SQL.Add(query);
  Query1.ExecSQL;
end;
Alternativ wäre auch sowas möglich:
Delphi-Quellcode:
procedure Tform2.btnhinzClick(Sender: TObject);
begin
  Query1.Close;
  Query1.ParamCheck := True;
  Query1.SQL.Text := 'INSERT INTO noten (titel1, titel2, autor, oid) VALUES (:titel1, :titel2, :autor, :onr)';
  Query1.Params[0].AsString := edtitel1.Text;
  Query1.Params[1].AsString := edtitel2.Text;
  Query1.Params[2].AsString := edKomponist.Text;
  Query1.Params[3].AsString := edonr.Text;
  Query1.ExecSQL;
end;
Wenn Du diese Query ausschließlich zum Einfügen neuer Daten benutzen willst, so kannst Du das SQL-Statement bereits im Objektinspektor in die Eigenschaft SQL schreiben. Die Eigenschaft ParamCheck muss auf jeden Fall auf True stehen, was (bei Delphi 7) normalerweise auch die Vorgabe ist.
Steht das SQL bereits in der Eigenschaft SQL der Query, so kannst Du obige Routine noch vereinfachen:
Delphi-Quellcode:
procedure Tform2.btnhinzClick(Sender: TObject);
begin
  Query1.Params[0].AsString := edtitel1.Text;
  Query1.Params[1].AsString := edtitel2.Text;
  Query1.Params[2].AsString := edKomponist.Text;
  Query1.Params[3].AsString := edonr.Text;
  Query1.ExecSQL;
end;
Folgendes ist nicht sinnvoll:
Delphi-Quellcode:
   Query1.Open;
   Query1.Active := true;
Open öffnet die Abfrage, Active := true ebenfalls. Das ist doppeltgemoppelt. Beides ist nur für Select-Statemens zulässig, da eine Ergebnismenge zur weiteren Verarbeitung geliefert wird.
Für Insert, Update, Delete ... muss man ExecSQL nutzen. Hier wird keine Ergebnismenge geliefert. Nutzt man für Insert, Update, Delete ... Open bzw. Active := true, so erhält man unweigerlich eine Fehlermeldung, die sinngemäß besagt, dass man keine Ergebnismenge geliefert bekommt. Das ist unschön und lästig.
Möchte man bei ExecSQL wissen, ob und ggfls. wieviele Zeilen eingefügt, verändert oder gelöscht wurden, so kann man die Eigenschaft RowsAffected abfragen. Im Zusammenhang mit Deiner Aufgabenstellung müsste hier dann eigentlich immer RowsAffected = 1 sein.

Falls weiterhin Fehler auftreten sollten, hänge bitte den vollständigen Quellcode hier an (auch die Formulardateien (*.dfm)), damit eine etwas genauere Fehlersuche möglich wird.

Hallo,
vielen Dank schon mal für deine ausführliche hilfe nahpets.
Ich habe mal probiert über ein einfaches Select Statement eine Verbindung zur Datenbank und zur Tabelle herzustellen indem ich mir einfach etwas in einem DBEdit anzeigen lasse. Jedoch gab es die Fehlermeldung das die Tabelle nicht existert, als ich den Query auf Aktiv setzen wollte.
Im übrigen, ein Fehler von mir, die datenbank heißt noten, die Tabellen lieder und ordner.
Ich habe nochmal alles angefügt und ich hoffe Ihr bzw Du könnt/kannst mir nochmal helfen.


Quellcode zum Hinzufügen der Daten:
Delphi-Quellcode:
unit edit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, DBTables;

type
  Tform2 = class(TForm)
    btnhinz: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    edtitel1: TEdit;
    Query1: TQuery;
    Tlieder: TTable;
    DSnoten: TDataSource;
    DSQuery: TDataSource;
    edkomponist: TEdit;
    edonr: TEdit;
    Label5: TLabel;
    edtitel2: TEdit;
    DBEdit1: TDBEdit;
    procedure Button2Click(Sender: TObject);
    procedure btnhinzClick(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  form2: Tform2;

implementation

uses anzeige;
{$R *.dfm}

procedure Tform2.Button2Click(Sender: TObject);
begin
  form2.close;
end;



procedure Tform2.btnhinzClick(Sender: TObject);
var titel1,titel2, autor, onr: string;
var query: ANSIString;
begin
  Query1.Close;
  Query1.SQL.Clear;
  titel1 := QuotedStr(edtitel1.Text);
  titel2 := QuotedStr(edtitel2.Text);
  autor := QuotedStr(edkomponist.Text);
  onr := QuotedStr(edonr.Text);
  query := Format('INSERT INTO lieder (titel1, titel2, autor, oid) VALUES (%s, %s , %s, %s)',[titel1, titel2,autor, onr]);
  Query1.SQL.Add(query);
  Query1.ExecSQL;
end;

end.

Die dfm Datei zum obigen Quellcode
Delphi-Quellcode:
object form2: Tform2
  Left = 423
  Top = 256
  Width = 503
  Height = 332
  Caption = 'Hinzufügen'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -15
  Font.Name = 'MS Sans Serif'
  Font.Style = [fsBold]
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 16
  object Label1: TLabel
    Left = 152
    Top = 24
    Width = 170
    Height = 25
    Caption = 'Noten hinzufügen'
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -20
    Font.Name = 'MS Sans Serif'
    Font.Style = [fsBold]
    ParentFont = False
  end
  object Label2: TLabel
    Left = 80
    Top = 112
    Width = 36
    Height = 16
    Caption = 'Titel:'
  end
  object Label3: TLabel
    Left = 48
    Top = 184
    Width = 77
    Height = 16
    Caption = 'Komponist:'
  end
  object Label4: TLabel
    Left = 16
    Top = 216
    Width = 106
    Height = 16
    Caption = 'Ordnernummer:'
  end
  object Label5: TLabel
    Left = 80
    Top = 152
    Width = 44
    Height = 16
    Caption = 'Titel2:'
  end
  object btnhinz: TButton
    Left = 320
    Top = 96
    Width = 115
    Height = 41
    Caption = 'Übernehmen'
    TabOrder = 0
    OnClick = btnhinzClick
  end
  object Button2: TButton
    Left = 320
    Top = 152
    Width = 113
    Height = 49
    Caption = 'Schließen'
    TabOrder = 1
    OnClick = Button2Click
  end
  object edtitel1: TEdit
    Left = 144
    Top = 104
    Width = 121
    Height = 24
    TabOrder = 2
  end
  object edkomponist: TEdit
    Left = 144
    Top = 176
    Width = 121
    Height = 24
    TabOrder = 3
  end
  object edonr: TEdit
    Left = 144
    Top = 216
    Width = 121
    Height = 24
    TabOrder = 4
  end
  object edtitel2: TEdit
    Left = 144
    Top = 144
    Width = 121
    Height = 24
    TabOrder = 5
  end
  object DBEdit1: TDBEdit
    Left = 144
    Top = 248
    Width = 121
    Height = 24
    DataSource = DSQuery
    TabOrder = 6
  end
  object Query1: TQuery
    DataSource = DSnoten
    SQL.Strings = (
      'SELECT *'
      'FROM lieder')
    Left = 96
    Top = 72
  end
  object DSQuery: TDataSource
    DataSet = Query1
    Left = 96
    Top = 40
  end
  object Tlieder: TTable
    Active = True
    DatabaseName = 'noten'
    TableName = 'lieder'
    Left = 48
    Top = 8
  end
  object DSnoten: TDataSource
    DataSet = form1.Tlieder
    Left = 56
    Top = 40
  end
end

Blup 16. Nov 2016 16:55

AW: Daten in einer Datenbank speichern
 
Zitat:

Zitat von frapo (Beitrag 1352568)
Zitat:

Zitat von darkrose (Beitrag 1352561)
Hätte die Seite mir geholfen würde ich hier nicht fragen

Genau auf der Seite gibt es aber eine Fülle an Informationen. Wenn dir diese Seite nicht weiterhilft, wäre es ein guter Ansatz hier mal konkret zu benennen, wo du momentan stecken bleibst.

Hilfreich wäre auch Code zu zeigen den du bisher hast. Irgendwo muss man ja ansetzen, wenn dir die angegebene Seite schon keine Hilfestellung sein kann.

Wie wäre es wenn du die Tutorials tatsächlich durcharbeiten würdest und uns sagst an welcher Stelle du nicht weiter kommst?

Bevor man mit irgendwelchen anderen Komponenten auf die Datenbank zugreifen kann, wird erst einmal eine Datenbankverbindung benötigt.
http://docwiki.embarcadero.com/RADSt...nken_zugreifen

Erst wenn die Datenbankverbindung funktioniert kann man anfangen auf Daten bzw. einzelne Tabellen zuzugreifen.
http://docwiki.embarcadero.com/RADSt...28Anleitung%29

Übriegens kannst du hier Dateien an deinen Beitrag anhängen (ähnlich wie bei E-Mails), man musst nicht den Quelltext gesamte Unit posten.

darkrose 16. Nov 2016 17:38

AW: Daten in einer Datenbank speichern
 
Habe das Problem gefunden und gelöst danke sehr.

himitsu 16. Nov 2016 23:46

AW: Daten in einer Datenbank speichern
 
Ist es wirklich nötig ständig ALLES zu zitieren?

Code:
object form2: Tform2   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  Left = 423
  ...
  object Tlieder: TTable
    Active = True
    DatabaseName = 'noten'
    TableName = 'lieder'
    Left = 48
    Top = 8
  end
  object DSnoten: TDataSource
    DataSet = form1.Tlieder  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    Left = 56
    Top = 40
  end
Wem fällt was auf?

Wenn du wirklich alles gelesen hast, warum hast du dann nicht bemerkt, dass von QuotedStr ausdrücklich abgeraten wird?




Und als Addon:
Zitat:

Delphi-Quellcode:
procedure Tform2.Button2Click(Sender: TObject);
begin
  form2.close;
end;

Für dieser Verwendung der globalen Variablen gehört man sowieso einen Klapps auf den Poo.
Delphi-Quellcode:
procedure Tform2.Button2Click(Sender: TObject);
begin
  Self.Close; // wenn man unbedingt eine Variable verwenden will/muss
end;

// oder

procedure Tform2.Button2Click(Sender: TObject);
begin
  Close;
end;
Erstell mal "gleichzeitig" zwei Instanzen dieser Form und heul dann nicht rum, wenn es nicht so funktioniert, wie gewollt.

Luckie 17. Nov 2016 08:33

AW: Daten in einer Datenbank speichern
 
Zitat:

Zitat von darkrose (Beitrag 1353896)
Habe das Problem gefunden und gelöst danke sehr.

Und woran lag es nun? :roll:

darkrose 18. Nov 2016 12:06

AW: Daten in einer Datenbank speichern
 
@himitsu
sehr nett deine antwort also wenn man nur solche antworten bekommen würde wäre so ein forum sehr sinnlos aber danke für so einen freundlichen Kommentar.

@Luckie
mir hat am ende doch noch eine einstellung im objektinspektor von einer Querykomponente gefehlt

mm1256 18. Nov 2016 16:01

AW: Daten in einer Datenbank speichern
 
Zitat:

Zitat von darkrose (Beitrag 1354115)
@himitsu
sehr nett deine antwort also wenn man nur solche antworten bekommen würde wäre so ein forum sehr sinnlos aber danke für so einen freundlichen Kommentar.

himitsu hat dich vor zwei (Anfänger-)Fehlern gewarnt und du hast es offensichtlich bzw. bedauerlicherweise nicht begriffen. Er hat sich Zeit für dein Problem genommen, und du nimmst dir nicht mal die paar Sekunden Zeit, deinen Text wie es zwecks besseren Lesbarkeit üblich ist in Groß-Kleinschreibung zu setzen. Aber ein Forum wegen einer gut gemeinten Antwort als "sehr sinnlos" bezeichnen. Ja, das finde ich wirklich toll.

Ich frage mich manchmal, woher die Leute die hier permanent anderen Usern mit ihrem Wissen und Sachverstand helfen manchmal die Geduld nehmen, mit solchen Kommentaren so gelassen umzugehen.

@all Sorry, das musste ich jetzt mal los werden.

TRomano 20. Nov 2016 09:20

AW: Daten in einer Datenbank speichern
 
@mm1256: weil Himitsu vielleicht schon lange in dem Forum ist und unter anderem deshalb tiefenentspannt ?

Spaß beiseite. Ich wundere mich auch manchmal, wie User hier im Forum reagieren, wenn ihnen geholfen wird. Dafür habe ich auch gar kein Verständnis. In einem Thread der letzten Tage ging es so weit, dass Daniel "einschreiten" musste. Was ist denn mit den Leuten los ? Hier geben sich wirklich Viele Mühe ihnen zu helfen und werden dafür auch noch beschimpft und beleidigt, mindestens jedoch herablassend behandelt. Da haben Einige aber echt eine schlechte Kinderstube gehabt, oder die Regeln und den Sinn eines solchen Forums einfach nicht begriffen !

p80286 21. Nov 2016 10:35

AW: Daten in einer Datenbank speichern
 
Ich vermute, daß es daran liegt, daß viele ihren eingeschlagenen Weg für selbstverständlich halten. Da reichen 2 Schlagworte um sein Anliegen zu beschreiben, und auch die Antwort sollte sich in diesen Bahnen bewegen. Ist das nicht der Fall fühlt sich mancher gemaßregelt.

Das
Delphi-Quellcode:
Form2.Close
geistert übrigens durch viele Musterlösungen, so wie
Delphi-Quellcode:
if Bvar=true then
.
(
Delphi-Quellcode:
if Bvar=false then
ist genauso zu meiden)

Gruß
K-H

Billa 21. Nov 2016 11:18

AW: Daten in einer Datenbank speichern
 
Ist jetzt total off-topic, muss aber mal sein:

Als gelegentlicher User kann ich nur sagen: hier wird einem in der Regel wirklich "aufs Pferd" geholfen. Sollte man eine Antwort nicht gleich verstehen, gehört es trotzdem zum guten Umgang, darauf sachlich zu antworten. Vielleicht hat man seine Frage unpräzise oder unvollständig ausgedrückt? Ich ertappe mich jedenfalls selbst manchmal dabei, "betriebsblind" zu sein. Egal ob das Mißverständnis bei mir oder dem Anderen liegt: "Wie man in den Wald ruft, so schallt es heraus". Ein Helfer wird es sich beim nächsten Mal sicher gründlich überlegen, ob er sich für diesen User nochmal bemüht. Am Ende schadet sich der Fragesteller auf diese Art wahrscheinlich selbst.

himitsu 21. Nov 2016 11:31

AW: Daten in einer Datenbank speichern
 
Zitat:

Zitat von darkrose (Beitrag 1354115)
@himitsu
sehr nett deine antwort also wenn man nur solche antworten bekommen würde wäre so ein forum sehr sinnlos aber danke für so einen freundlichen Kommentar.

@Luckie
mir hat am ende doch noch eine einstellung im objektinspektor von einer Querykomponente gefehlt

Wieso sinnlos?
Und jetzt schau nochmal genau in meinen Post und vielleicht fällt dir dann etwas auf. :roll:

Alles Wichtige wurde vorher schon ausreichend erklärt, darum auch der Hinweis darauf, vorallem auch warum QuoteStr hier falsch ist und wie man es richtig macht, bzw. was man besser stattdessen verwenden sollte.


PS: Ganze einfach, man versucht es zu ignorieren (hab Besseres zu tun, als mich immer aufzuregen) und wenn es nicht besser wird, dann wird dem User einfach nicht mehr geholfen, da man dann sämtliche seiner Post garnicht erst ansieht.

darkrose 22. Nov 2016 07:45

AW: Daten in einer Datenbank speichern
 
Ich habe nich eine Satz gefunden wo mir davon abgeraten wird sondern es wurde als idee gegeben aber ok
und wie soll ich heul nicht rum als nett verstehen?!

aber ist auch egal es funktioniert und ist eh nur für einen Privaten Zweck gedacht... aber danke für die Vielen Hinweise


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