Entwickler-Ecke

Datenbanken - In Datenbank schreiben?


Anarkids - Do 06.04.06 08:32
Titel: In Datenbank schreiben?
guten morgen alle miteinander!

ich habe eine datenbank mit 5 tabellen:

- Servername
- Kunden
- Personal
- Überwachungsauftrag
- Dienste

jetzt möchte ich z.B. über 5 Eingabefelder Daten in die 5 Spalten der Tabelle Servername einfügen/schreiben und ggf. auch wieder löschen, allerdings finde ich die Kommandos dafür nicht :(

Ich verwende eine Access-Datenbank.

mfg, anarkids


BenBE - Do 06.04.06 08:36

Lese Dir bitte das unter http://www.delphi-forum.de/viewtopic.php?p=350651#350651 ... Da sollte Dir sicherlich TDataSet.Post auffallen ...


Anarkids - Do 06.04.06 10:25

sorry ich hätt echt die suche benutzen sollen. habe was gutes gefunden.

doch jetzt habe ich folgendes problem, hier mal der code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
const cINSERT = 'INSERT INTO SERVERDATEN (SERVERNAME,URL,IP-ADRESSE,SERVICE-LEVEL) values ("%s","%s","%s","%s")';

procedure TForm4.Button2Click(Sender: TObject);
var sSQL : string;
begin
  ADO_Q.Open //mein TADOQuery
  try
   sSQL := Format(cInsert,[S_Edit1,S_Edit2,S_Edit3,S_Edit5]);
   ADO_Q.ExecSQL;
  finally
   ADO_Q.Close;
  end;
end;


und dann noch die Fehlermeldung beim Klicken auf den Button2:
ADO_Q: Eigenschaft SQL fehlt.

Sorry, ich kenn mich halt echt noch nich so aus, wie's für solch ein Programm eigentlich von Nöten wär :(


FaTaLGuiLLoTiNe - Do 06.04.06 12:11

Ich habe mit den ADO Komponenten noch nicht gearbeitet, aber ich würde mal tippen, dass du den in deiner Variablen sSQL enthaltenen String noch an das ADOQuery übergeben musst:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
const cINSERT = 'INSERT INTO SERVERDATEN (SERVERNAME,URL,IP-ADRESSE,SERVICE-LEVEL) values ("%s","%s","%s","%s")';

procedure TForm4.Button2Click(Sender: TObject);
var sSQL : string;
begin
  ADO_Q.Open //mein TADOQuery
  try
   sSQL := Format(cInsert,[S_Edit1,S_Edit2,S_Edit3,S_Edit5]);
   ADO_Q.SQL := sSQL;
   ADO_Q.ExecSQL;
  finally
   ADO_Q.Close;
  end;
end;


Nur so 'ne Vermutung. ;)


Anarkids - Do 06.04.06 12:41

danke für deine hilfe, aber daran lag es leider nicht.

ich weiß langsam echt nichmehr weiter. hab schon 5 foren durchsucht und nix hat was gebracht :(


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm4.Button4Click(Sender: TObject);
var sSQL: string;
begin
 ADO_Q.Open;
 try
  ADO_Q.active:=false;
  ADO_Q.sql.clear;
  ADO_Q.sql.add('INSERT INTO SERVERDATEN (SERVERNAME,URL,IP-ADRESSE,SERVICE-LEVEL) values("'+s_edit1+'","'+s_edit1.text+'","'+s_edit2.text+'","'+s_edit3.text+'","'+s_edit5.text+'")');
  ADO_Q.Active:=true;
 finally
  ADO_Q.close;
 end;
end;


Lemmy - Do 06.04.06 13:39

Hi,

warum hast Du das

ADO_Q.ExecSQL;

rausgenommen und mit dem ADO_Q.Active=true; ersetzt? DML (Data Manipulation Language, also Insert, delete,...) MUSS per ExecSQL ausgeführt werden! .Active=true oder .Open geht nur bei Select-Statemnts!

Lemmy


Anarkids - Do 06.04.06 13:47

hey!

habe das .ExecSQL; jetzt wieder reingenommen und bekomme nun folgendes:
Unzulässige SQL-Anweisung; "DELETE","INSERT","SELECT" oder "UPDATE" erwartet.
zur info: ich habe in dieser tabelle eigentlich 6 spalten. ausser die 4, in die hiermit etwas eingefügt werden soll, habe ich noch 2 andere (ID und kunde), von denen ich denke, dass ich sie getrost aus dem sql-befehl weglassen kann?!

scheint so, als wär ich nen schritt weiter ;-) ... leider finde ich den rechtschreibfehler im befehl nicht...

danke übrigens für die hilfe


jasocul - Do 06.04.06 13:52

Feldnamen mit Bindestrichen? Meine DB (Oracle) interpretiert das als Rechenoperation. Evtl. helfen Anführungszeichen, bzw. die Funktion QuotedStr.
Lass dir außerdem mal das Statement vor der Ausführung anzeigen. Oft sieht man dann sofort, was da quer läuft.


Anarkids - Do 06.04.06 13:54

ID ist autoinc
kunde ist mit der id (auch autoinc) der tabelle kunde verbunden.

daher hab ich mir so gedacht, wenn sie eh beide autoinc sind lass ich sie lieber aus dem befehl raus.


jasocul - Do 06.04.06 14:03

user profile iconAnarkids hat folgendes geschrieben:
ID ist autoinc
kunde ist mit der id (auch autoinc) der tabelle kunde verbunden.

daher hab ich mir so gedacht, wenn sie eh beide autoinc sind lass ich sie lieber aus dem befehl raus.

Das ist auch korrekt. AutoInc-Felder dürfen durch ein Insert nicht gefüllt werden. Wäre auch nicht sonderlich logisch.


Anarkids - Do 06.04.06 14:06

gut, dann hab ich ja mal richtig gedacht. trotzdem find ich sehr merkwürdig, warum er mir dann diesen fehler präsentiert. naja, immerhin ist es jetzt schon ein anderer als vorhin :D


jasocul - Fr 07.04.06 11:05

Ich glaube ich habe den Fehler gefunden:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm4.Button4Click(Sender: TObject);
var sSQL: string;
begin
 ADO_Q.Open; // HIER wird der Fehler sein
 try
  ADO_Q.active:=false;
  ADO_Q.sql.clear;
  ADO_Q.sql.add('INSERT INTO SERVERDATEN (SERVERNAME,URL,IP-ADRESSE,SERVICE-LEVEL) values("'+s_edit1+'","'+s_edit1.text+'","'+s_edit2.text+'","'+s_edit3.text+'","'+s_edit5.text+'")');
  ADO_Q.Active:=true;
 finally
  ADO_Q.close;
 end;
end;

Du machst ein Open, bevor du überhaupt ein SQL-Statement hast.
Manchmal sieht man den Wald vor lauter Bäumen nicht. Ich habe mich zu sehr auf das Statement gestürzt. *kopfschüttel*


Anarkids - Fr 07.04.06 11:14

ja genau das müsste er sein. habe den quelltext nun mal geändert:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm4.Button2Click(Sender: TObject);
var server_t;
begin
 server_t := 'select * from Serverdaten where 1 = 0';
 ado_q.close;
 ado_q.sql.text := server_t;
 ado_q.insert;
 ado_q.fieldbyname('Servername').asstring := S_Edit1.text;
 ado_q.fieldbyname('URL').asstring := S_Edit2.text;
 ado_q.fieldbyname('IPAdresse').asstring := S_Edit3.text;
 ado_q.fieldbyname('ServiceLevel').asstring := S_Edit5.text;
 ado_q.post;


das nur mal als beispiel, wie es auch klappen kann ;-)

problem gelöst...danke jasocul.