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:
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.