Entwickler-Ecke

Datenbanken - Daten in DB speichern


Tchiboo - Fr 21.04.06 13:43
Titel: Daten in DB speichern
Hallo Leute!

Ich hab ein Problem! Ich hab das schonmal gemacht da ging das auch, jedoch will das jetzt nicht mehr. Ich will Text aus edit-Feldern in meine Datenbank speichern bzw. hinzufügen. Der stürzt jedoch bei dem Prozess ab!

Mein Quelltext ist folgender:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TFormAdressen.BBCKontakthinzuClick(Sender: TObject);
  var adresse, name:string;
 begin
  if (edname.Text=''or (edadresse.text=''then
  showmessage('Bitte Namen und E-Mailadresse eingeben!')
  else
  begin
  name:=edname.Text;
  adresse:=edadresse.text;
  Query1.Active:=false;
  Query1.Sql.Clear;
  query1.Sql.Add('INSERT INTO adressen (name,e-mailadresse) VALUES('''+name+''' , '''+adresse+''')');
  Query1.execsql;
  memo1.Lines.Text := 'SELECT * FROM `adressen` ORDER BY (name) asc';
  query1.SQL.Text := memo1.Lines.Text;
  query1.Prepare;
  query1.Open;
end;


Die Fehlermeldung gibt folgendes aus: Fehler in INSERT INTO anweisung!
Des Weiteren springt er nicht zu dieser Zeile sondern in die Zeile memo1.Lines.Text := 'SELECT * FROM `adressen` ORDER BY (name) asc';

Kann mir jemand Helfen?

Danke schonmal im Vorraus!

Jörg

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt


mkinzler - Fr 21.04.06 13:59

-Benutze das nächste mal den Delphi-Tag
-Warum weist du die Inhalte der editfelder ersteinmal einer anderen Variable zu?
-Minuszeichen in Feldnamen sind sehr schlecht! Versuche die mal zu Quoten.
-Desweiteren würde ich parametrisierte Queries verwenden.
-Verwende besser Assign um Tstrings -Eigenschaft von einer Komponente auf die andere zu übertragen.


Tchiboo - Fr 21.04.06 14:54

Hallo Markus!

Es lag an dem Minus! Danke für den Tipp!

Jedoch hab ich schon wieder ein nächstes Problem: Und zwar will ich aus einem DBGrid eine Bestimmt Zelle auslesen. Ich bekomm das nicht hin. Ich hab glaub ich schon so ziemlich ausprobiert, aber es geht nicht! Das kann doch nicht so schwer sein! oder?

Nochmal danke für den Tipp


PS: wie benutze ich den Delphi-Tag

Jörg


mkinzler - Fr 21.04.06 15:00

Entwerder Quellcode markieren und unter Bereiche Delphi: + Anklicken oder manuell in eckige Klammern eingeschlossenes delphi bzw. /delphi.


Tchiboo - Fr 21.04.06 15:12

Dankeschön :) ist sehr Hilfreich und gut für die Übersichtlichkeit!

Aber wie man einen Text aus einer beliebigen Zelle eines DBGrids ausließt weist du nicht zufällig Markus?

Jörg


Müscha - Fr 21.04.06 15:15

Hey Jörgi

es gibt so richtige editfelder und labels die fürs DBGrid sind.

Unter dem reiter Datensteuerung kannste die auswählen und im objektinspektor kannste dann zum beispiel im editfld die spalte raussuchen welche angezeigt wird.

oder willst du durch markieren der einzelnen zeile irgendwo eingetragen bekommen?

Gruß Müscha


Tchiboo - Fr 21.04.06 15:20

Moinsen Müscha!

Ich will den Text einer Zelle im DBGrid durch Doppelklick in ein editFeld eintragen lassen! Ich bekomm das aber irgendwie nicht hin! Mit einem normalen StringGrid ist das so einfach! :)

Jörg

P.S.: Wie war Mathe-Vorabi?


mkinzler - Fr 21.04.06 15:21

Ich würde immer auf die DataSets, die hinter dem Grid stecken zugreifen.


Müscha - Fr 21.04.06 15:26

Mathe war guddi bis auf zweitens, mit doppelklick kann ich s nicht aber mit nem normalen klick ;)


also vom DB GRid objektinspektor auf ereignisse gehen und auf OnCellKlick in das feld einfach doppelklicken,


dann kannst du da befehle reinschreiben

zum beispiel


Quelltext
1:
listbox.items.add(table1.fields[0] .Asstring);                   // funktioniert                    


oder


Quelltext
1:
edit1.text:=table1.fields[0] .Asstring;                 // (nicht getestet)   ==>  geht auch, grade getestet!!!                    


weiß jetzt nur nicht genau wie das mit query hinhaut

gruß müscha


mkinzler - Fr 21.04.06 15:29

Zitat:
weiß jetzt nur nicht genau wie das mit query hinhaut
Geanuso, da beide dataSets sind.
Alternativ kannst du auch mit Table.FieldByName('<feldname').Value; oder Table.FieldByNumer(<nr>.value;arbeiten.


Tchiboo - Fr 21.04.06 15:55

Das geht irgendwie nicht!

@ Müscha: Mit deinem Quelltext kann man doch auch nur eine bestimmte Zelle anzeigen lassen! Ich will ja irgendeine Markieren und die dann in einem editfeld ausgeben!

@Markus: Bei mir gibt es keine Anweisung namens FieldByName bzw FieldByNumber! Liegt das daran das ich Delphi 7 nutze?

THX für die Tipps

Jörg


mkinzler - Fr 21.04.06 16:09

Also das 2. muß so: table.Fields.FieldByNumber(<nr>).Value; heißen. Diese Methode liefert dir ein Feld in der Reihenfolge der Felder in der DB (also nicht in der Abfragereihenfolge bei einem Query).
Aber table.FieldByName('<feldname>').Value ist aber auch bei D7 vorhanden und liefert dir ein Feld anhand des Feldnamens. Mit alle 3 Methoden kannst du auf den Inhalt dea aktivien DS zugreifen, welcher der markierten Zeile im Grid entspricht.


Tchiboo - Fr 21.04.06 16:17

Also der nimmt jetzt die richtige Spalte, jedoch nicht die markierte Zeile. Delphi nimmt immer den Text aus der ersten Zeile, egal ob ich die 3. oder 5. Zeile angeklickt bzw. markiert habe.

THX

Jörg


Müscha - Fr 21.04.06 16:29

Zeig mal dein Quelltext wie du das überhaupt gemacht hast? da kann ich das acuh mal probieren, ich bekomms nämlich grade nicht hin.


Tchiboo - Fr 21.04.06 16:35

Ich habe das so gemacht


Delphi-Quelltext
1:
showmessage(table1.Fields.FieldByNumber(2).Value);                    


der Zeigt mir jetzt halt den Text an, aber nur den ersten in der Spalte! Ich muss ja auch noch den in der 2.,3. usw Spalte anzeigen lassen können.

Das Problem was also besteht ist, das ich nicht weis wie ich eine bestimmte Zeile anspreche (eine Spalte kann ich ja mit der Variante von Markus wählen!)

Also wenn du weißt wie man eine bestimmte Zeile anwählen kann, dann bekommste ein Leckerlie. :)

Jörg


Müscha - Fr 21.04.06 16:36

Jörgi ich habs!!!!




Quelltext
1:
edit1.Text:=(DBGrid1.SelectedField).value;                    


Tchiboo - Fr 21.04.06 16:47

Naja nicht ganz :)

der nimmt ja jetzt den Text den ich anklicke!

Ich "Skizzier" dir das mal:

Also mein Grid sieht so ungefähr aus:

Name Mailadresse
Jörg J.Dubsky@gmx.net
Müscha ichweisdeinemailnichtmehr@keineahnung.de

Das Problem ist nun das wenn ich auf Müscha klicke in der 1. Spalte / 2.Zeile, das er da die Mailadresse aus der 2. Spalte/2. Zeile kopieren und in das editfeld einfügen soll!

Compris?!

Danke

Jörg


Müscha - Fr 21.04.06 17:00

hä da versteh ich dich nicht, da ist das doch richtig



Quelltext
1:
edit1.text:=table1.fields[1] .Asstring;                    


egal wo du klickst, es wird immer die emailadresse eingetragen in der zeile wo du klickst oder versteh ich dch immernoch nicht?


Tchiboo - Fr 21.04.06 17:16

Der zeigt mir dann trotzdem doch nur den ersten wert der Spalte an!

Du sagst ja in der programmierzeile:


Delphi-Quelltext
1:
edit1.text:=table1.fields[1] .Asstring;                    


das du in den Bereich 1 gehst und dort ließt er ja halt den 1. Wert aus!

Ich muss ja auch den 2.,3.,4., oder 1000. Wert auslesen können!

Hast du keine Idee wie man die makierte Zeile auslesen kann? Wenn ich beispielsweise in der 5. Zeile bin, das ich dann eine Showmessage bekomme mit dem Wert der Zeile (je nach dem in welcher man halt ist)!


Müscha - Fr 21.04.06 17:28

Hää das ist das doch,


bei mir ist das, dass ich mit diesem befehl


egal auf welcher zeile ich klicke, zeigt er mir dann den wert der 2. spalte ind der zeile die ich markiert habe an.

also wenn ich auf die 5. zeile klicke zeigt der mir den wert der 5.zeile in der 2. spalte an. und das selbe passiert mit allen anderen zeilen auch!!!!


probiers nochmal zu erklären wenn das das nicht ist bitte...ich versteh immernoch nicht was du anderes willst


Tchiboo - Fr 21.04.06 17:35

edit: Ich habs doch hinbekommen nach 2 Stunden :) und zwar sieht das bei mir so ähnlich aus, nur das ich das DBGrid nehme und nicht das Table!


Delphi-Quelltext
1:
showmessage(dbgrid1.Fields[1].AsString);                    


Nochmal thx für deinen Support MÜSCHA und MARKUS :)


Müscha - Fr 21.04.06 17:38

zeig mal deinen quelltext was du jetzt genau dahingeschrieben hast, vielleciht hast du ja irgendwo noch table1.first rum liegen was nicht hingehört.


und hast du das auch in OnCellKlick vom DBGRID reingeschrieben?


Müscha - Fr 21.04.06 17:49

:beer:

woran lags denn?


raiguen - Fr 21.04.06 19:34

Moin :-)
Soweit ich die 'Probelmatik' verstanden habe, würd ich das im DblClick-Ereignis machen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure DBGrid1DblClick(Sender: TObject);
begin
  Edit1.Text := DBGrid1.DataSource.DataSet.FieldByName{Feldname der Tabelle oder der Query}.AsString;
{ andere möglichkeiten: }
  Edit1.Text := DBGrid1.Table1.FieldByName{Feldname der Table}.AsString;
  Edit1.Text := DBGrid1.Query.FieldByName{Feldname der Query}.AsString;
{  oder sofern Spaltennr. n bekannt }
  Edit1.Text := DBGrid1.Table1.Fields[n].AsString;
  Edit1.Text := DBGrid1.Query.Fields[n].AsString;
end;

Hier ist es egal, welche Datenquelle das DBGRid versorgt, ob nun ne Table oder ne Query. Und die Reihenfolge der Spalten im DBGRid ist auch egal, weil ja direkt das Feld der Datenquelle angesprochen wird ;-) Wichtig ist hier ja nur, dass der Inhalt eines bestimmten Feldes in das Edit eingetragen werden soll, egal in welche Zelle (Spalte/Zeile) der Doppelklick erfolgt.