Autor Beitrag
lemmond1976
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Mi 02.04.03 12:56 
Hallo,

ich bin echt verzeifelt, ich weiß nicht woran es liegt, daß ständig der Zugriff verletzt wird. Hier erstmal der Code:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
begin
a:= getnextid;

with ADOQuery1 do
begin

SQL.Clear;
SQL.Text :='INSERT INTO tbl_bild VALUES ('quotedstr(inttostr(getnextid))+','+quotedstr(Bildname)+','+quotedstr(DateToStr(Datum))+',1)';
execsql;

end;

Und hier die function getnextid:

with ADOQuery1 do begin

SQL.Clear;
SQL.Text:='Select max(Bild_ID) from tbl_bild;
open;
myid := strtoint(FieldValues['Bild_ID']);
Result := myid + 1;
close;
end;


Getrennt laufen beide Routinen einwandfrei, nur nicht zusammen.

Ich will eigentlich nur die höchste Bild_ID herausfiltern und diese dann um
1 erhöhen. Wie gesagt, wenn ich die function getnextid oben miteinbaue, geht's schief (Zugriffsverletzung). Es mag umständlich sein, aber mir fiel keine bessere Lösung ein.

Moderiert von user profile iconKlabautermann: Code-Tags hinzugefügt.
inselberg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 458



BeitragVerfasst: Mi 02.04.03 13:28 
das is afaik weil du ja 2x auf das gleiche objekt zugreift

ausblenden Quelltext
1:
'quotedstr(inttostr(getnextid))					


soll doch sicher

ausblenden Quelltext
1:
'quotedstr(inttostr(a))					


heissen ;)

_________________
hans bist du das ?
lemmond1976 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Mi 02.04.03 14:44 
jo, das weiß ich wohl, gibt es da noch ne andere Möglichkeit ?
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Mi 02.04.03 15:20 
Hi
lemmond1976 hat folgendes geschrieben:

jo, das weiß ich wohl, gibt es da noch ne andere Möglichkeit ?

Die Frage verstehe ich jetzt aber nicht. :nixweiss: Inselberg hatte die Antwort doch schon gepostet.
inselberg hat folgendes geschrieben:

ausblenden Quelltext
1:
'quotedstr(inttostr(a))					


Das Problem liegt ja darin, dass du in der Zeile in der du ADOQuery1.SQL.Text belegst eine Funktion aufrufst die ebenfalls ADOQuery1 verwendet und damit alles wieder zunichte macht. Deshalb rufst du ja getnextid schon vorher auf und speicherst den Wert in a. Also solltest du ihn auch verwenden.
Oder du verwendest in GetNextId eine zweite Query.

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
lemmond1976 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Mi 02.04.03 21:51 
hi Lothar,

war ein Tippfehler im Posting.
Ich habe a verwendet. Trotzdem eine Zugriffsverletung.
Meines Wissens kann man mit "Set IDENTITY_INSERT table on"
was machen. Allerdings weiß ich nicht, wie man mit INSERT INTO table VALUES(?, feld1, feld2, feld3) die ID automatisch erhöht.
Leerzeichen bringt nicht die Lösung.

Viele Grüße
lemmond
inselberg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 458



BeitragVerfasst: Do 03.04.03 00:31 
by mysql setze ich immer das als index benutzte feld auf autoincrement (natürlich auch als key) und füge anschl. ein VALUES (0,...) ein.

mysql ist da so klug und setzt den passenden wert. was ja auch der sinn des autoinc ist :)

jetzt weiss ich natürlich nicht ob das deine frage bzw dein problem war ... war nämlich etwas unklar (und ist ja auch schon spät)

_________________
hans bist du das ?
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Do 03.04.03 06:49 
Hi
lemmond1976 hat folgendes geschrieben:

...
Meines Wissens kann man mit "Set IDENTITY_INSERT table on"
was machen. Allerdings weiß ich nicht, wie man mit INSERT INTO table VALUES(?, feld1, feld2, feld3) die ID automatisch erhöht.
Leerzeichen bringt nicht die Lösung.

Ach ja, so heisst das bei M$-SQL. Wenn du also mit:
ausblenden Quelltext
1:
 Set IDENTITY_INSERT tbl_bild on Bild_ID					

festgelegt hast, dass es sich bei Bild_ID um ein AutoInc-Feld handelt, dann darfst du natürlich beim INSERT dieses Feld nicht mehr füllen. Das funktioniert dann so:
ausblenden Quelltext
1:
INSERT INTO tbl_bild (Feld2, Feld3) VALUES (Wert1, wert2)					

Du musst also beim Insert angeben, welche Felder der Tabelle du füllen willst (1. Klammer) und nur noch für diese Felder die Werte übergeben (2. Klammer).
Ob die Set-Anweisung so allerdings korrekt ist, musst du selbst noch mal nachlesen. Wenn du schon Datensätze in der Tabelle stehen hast, musst du ausserdem dafür sorgen, dass die Numerierung auf den entsprechenden Startwert gesetzt wird.

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...