Einzelnen Beitrag anzeigen

darkrose

Registriert seit: 22. Sep 2016
17 Beiträge
 
#26

AW: Daten in einer Datenbank speichern

  Alt 16. Nov 2016, 15:35
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: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
  Mit Zitat antworten Zitat