Autor Beitrag
Sebastian01
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

Windows XP
D7
BeitragVerfasst: Mo 01.03.04 19:59 
Hallo,

ich habe ein kleines Problem und kann keinen Lösungsansatz finden.
Ich verwende D7, BDE, Paradox und möchte gerne in eine DB einen Datensatz mit einer einzigartigen ID einfügen, jedoch NICHT auto_increment verwenden (selbst, wenn es damit geht, möchte ich wissen, wie ich das Problem lösen kann 8) )

Also: folgendes Query an die DB um die nächste freie ID zu finden:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
SaveData[Nr].Close;
SaveData[Nr].SQL.Clear;
SaveData[Nr].SQL.Add('select max(id) from test');
SaveData[Nr].Prepare;
SaveData[Nr].Open;
SaveData[Nr].First;
if SaveData[Nr].eof then id:=1
else if SaveData[Nr].Fields[0].Value=NULL then id:=1
else id:=SaveData[Nr].Fields[0].Value+1;
SaveData[Nr].Close;


So, nun steht in ID der nächste freie Wert.
Als nächstes wird das Insert gemacht

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
SaveData[Nr].SQL.Clear;
SaveData[Nr].SQL.Add('Insert into test ');
SaveData[Nr].SQL.Add('(id, info) values ('+IntToStr(befund_id)+', 3)');
SaveData[Nr].ExecSQL;
SaveData[Nr].Close;



So weit - so gut - funktioniert alles.

Jetzt würde ich allerdings um diese beiden Anweisungen herum ein Lock auf die Tabellen legen (in MySql einfach mit einem "lock table write"), damit sichergestellt ist, daß eine ID nicht zweimal verwendet wird, weil eine andere Stelle im Prg genauso vorgeht.

Ich habe schon nach "Lock" und "Transactions" hier im Forum gesucht, aber nichts sinnvolles gefunden; auch die localsql.hlp hat mich nicht weitergebracht :( :(

Kann jemand helfen ?

lg
Sebastian
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Mo 01.03.04 20:15 
Hallo,

ich weiß nicht ob exclusive locking auf eine Paradox Tabelle geht. Verwendest du die BDE?

Gruß
Ken

_________________
Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Mo 01.03.04 20:35 
Paradox ist eine Single-User Tabelle (und schon etwas alt). Locks geht da imho nicht.
Was spricht denn gegen einen Auto-Increment?

Den einzigen Lock den man realisieren könnte, wäre den Satz nach der Bildung der ID sofort einzutragen.
Hat allerdings einen erhöhten aufwand, da wenn der Nutzer/das Programm die Dateneingabe aus welchen Gründen auch immer abbricht, muss dieser Satz wieder gelöscht werden. Leider enstehen aber damit Lücken in der ID-Reihenfolge (wie bei AutoIncrement auch).

grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
Sebastian01 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

Windows XP
D7
BeitragVerfasst: Mo 01.03.04 20:54 
Hallo,

na dann kann ich lange suchen :-)
@CenBells: Ja, die BDE verwende ich.

Zum Glück handelt es sich nicht um eine Dateneingabe, sondern lediglich um das Speichern des Datensatzes; diese beiden Kommandos kommen direkt hintereinander; alledings werden die Daten seriell empfangen (ständig), deswegen besteht eine gute Chance, daß es schon mal zu einer Konfliktsituation kommt.

@MSCH: Autoincrement
Ich habe gelesen, daß AutoInc Felder sehr empfindlich sein sollen, wenn die Indizies mal kaputt gehen sollten ? Ich habe von Fällen gelesen, in denen ein Update auch einen neuen Wert auf das AutoInc Feld zugewiesen hat ? Wie sind da deine Erfahrungen ?

lg
Sebastian
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Mo 01.03.04 21:02 
Ein Update auf Auto-Increment (benutze MS-SQLServer) funzt nicht.
Zumindest ist mir das noch nicht gelungen :-). Beim Update einfach das Feld ausnehmen. Wird ja eh korrekt gesetzt.

Und bisher ist mir noch kein Fehler vorgekommen, der auf Auto-IDs beruht. Im gegenteil, hast du diese Felder nicht, spinnen manche SQL-Querries, weil sie die Indentität (bei Updates) nicht finden.

Ich machs immer so, dass die IDs auch immer (einer der ) Primärschlüssel sind.
funzt prima.

grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
Sebastian01 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

Windows XP
D7
BeitragVerfasst: Di 02.03.04 10:28 
Hi !

Ok - ich bin allerdings noch auf ein zweites Problem gestoßen - ich bräuchte "quasi" zwei Autoincrement Zähler, weil einen globalen Zähler habe und einen pro Vorgang, die bei einem Insert jeweils erhöht werden. Den zweiten könnte ich nicht wirklich mit Autoincrement realisieren, aber das Kernproblem ist das gleiche wie oben beschrieben....
Ist Paradox denn wirklich nur Single-User ohne Locks/Transactions ? Was passiert dann im Netzwerk ? Da gibt es doch eine Paradox.net, etc. !?

lg
Sebastian
MAlsleben
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 303

W2k,WinXP
D3 - DXE3 Enterprise
BeitragVerfasst: Di 02.03.04 10:39 
Hi,

um auf eine Paradox - Tabelle ein Lock zu erhalten, kann man diese Tabelle exclusiv öffnen. Dann hat kein anderer User mehr darauf zugreifen. Näheres dazu gibt es in der Delphi Hilfe zu der Eigenschaft Exclusive von Table oder Database. Transaktionen gibt es nicht. Für Query gibt es auch keine entsprechende Eigenschaft. Also müßtest Du dann TTable in Deinem Programm verwenden.

Gruß Micha.

_________________
Viele Wege führen nach Rom.