![]() |
AW: Daten in einer Datenbank speichern
Gibt es die Datenbankdateien denn in den Pfad, den dir die Fehlermeldung anzeigt?
|
AW: Daten in einer Datenbank speichern
Zitat:
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? |
AW: Daten in einer Datenbank speichern
Zitat:
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; |
AW: Daten in einer Datenbank speichern
Delphi-Quellcode:
Ohne jetzt näher auf Deinen Code einzugehen, sei angemerkt, dass Du ja eigentlich ein SQL ausführen willst. -->
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;
Delphi-Quellcode:
Das verwendete
Query1.ExecSQL
Delphi-Quellcode:
ist dazu nicht verwendbar.
Query1.Open;
Das
Delphi-Quellcode:
ist eine Doppelung und somit obsolet.
Query1.Active := true;
|
AW: Daten in einer Datenbank speichern
Zitat:
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:
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.
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; Dazu gibst Du bitte in der Eigenschaft SQL ein gültiges SQL ein. Dies könnte z. B. so aussehen:
SQL-Code:
Anschließend setzt Du die Eigenschaft Active auf True. Solange es dabei eine Fehlermeldung gibt, stimmt irgendwas nicht.
select * from noten where 1 = 2
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:
Alternativ wäre auch sowas möglich:
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;
Delphi-Quellcode:
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.
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; Steht das SQL bereits in der Eigenschaft SQL der Query, so kannst Du obige Routine noch vereinfachen:
Delphi-Quellcode:
Folgendes ist nicht sinnvoll:
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;
Delphi-Quellcode:
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.
Query1.Open;
Query1.Active := true; 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. |
AW: Daten in einer Datenbank speichern
Zitat:
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 |
AW: Daten in einer Datenbank speichern
Zitat:
Bevor man mit irgendwelchen anderen Komponenten auf die Datenbank zugreifen kann, wird erst einmal eine Datenbankverbindung benötigt. ![]() Erst wenn die Datenbankverbindung funktioniert kann man anfangen auf Daten bzw. einzelne Tabellen zuzugreifen. ![]() Übriegens kannst du hier Dateien an deinen Beitrag anhängen (ähnlich wie bei E-Mails), man musst nicht den Quelltext gesamte Unit posten. |
AW: Daten in einer Datenbank speichern
Habe das Problem gefunden und gelöst danke sehr.
|
AW: Daten in einer Datenbank speichern
Ist es wirklich nötig ständig ALLES zu zitieren?
Code:
Wem fällt was auf?
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 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:
Erstell mal "gleichzeitig" zwei Instanzen dieser Form und heul dann nicht rum, wenn es nicht so funktioniert, wie gewollt.
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; |
AW: Daten in einer Datenbank speichern
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:20 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 by Thomas Breitkreuz