Access - ODBC - Insert - AutoIncrement -

Sapperlot

Mitglied
Hallo,
Ich habe eine Access Datenbank... leider...
Über ODBC greife ich auf diese zu, mit Borland C++ Builder.


Ich verallgemeiner mal mein Prob.

Tabelle T02_PRUEFUNG
T02_ID -> Auto Wert -> Primary Key
T02_WERT1 -> Text
T02_WER2 -> Text


Ich möchte, dass der Auto_Wert inkrementiert wird, wie mache ich das?


Durch ein Query-Objekt kann man über ODBC auf die Datenbank zugreifen. (

Query1->SQL->Clear();
Query1->SQL->Add("insert into T02_PRUEFUNG (T02_WERT1, T02_WERT2)";
Query1->SQL->Add("values :)Param0, :param1)");
Query1->ParamByName("Param0")->AsString = "BLABLA;
Query1->ParamByName("Param1")->AsString = "BLUB";
Query1->ExecSQL();

Jetzt kommt ein Fehler! Und zwar vermisst der BCB jetzt den Auto Wert (Primary Key)
Er sieht in der Datenbank:
Aha, es sind 3 Spalten, aber es werden nur 2 Parameter übergeben. Dachte eigentlich durch das explizite Angeben von insert into T02_PRUEFUNG <b>(T02_WERT1, T02_WERT2)</b> akzeptiert er das in der Form, aber er erwartet einen 3. Parameter.

Weiss jemand bescheid, wie ich den AutoIncrement Wert automatisch nach oben zählen lassen kann?

Ich selbst hab' nen Algorithmus geschrieben, der mit nem Select Statement alle PKs ausliest, dann sortiert und den größten Wert raussucht.
Größter_Wert++; bildet dann den neuen PK

Ist aber eher unelegant, und ne Notlösung


Hoffe mir kann jemand weiterhelfen.

Vielen Dank,
Gruß, basti
 
Welcher Fehler kommt denn genau? In dem von Dir geposteten Statement sind nämlich auch noch Syntaxfehler:

Query1->SQL->Clear();
Query1->SQL->Add("insert into T02_PRUEFUNG (T02_WERT1, T02_WERT2)"; <-- Hier fehlt die Klammer zu vom Add
Query1->SQL->Add("values :)Param0, :param1)");
Query1->ParamByName("Param0")->AsString = "BLABLA; <-- Hier fehlt das schliessende "
Query1->ParamByName("Param1")->AsString = "BLUB";
Query1->ExecSQL();

Die Syntax und Logik des SQL Statement an sich sind m.E. richtig.

Zu Deinem Workaround: Statt alle PKs zu lesen und dann zu sortieren, kannst Du auch die Query
SELECT MAX (T02_ID) + 1 AS NeueID FROM T02_PRUEFUNG
absetzen, dann bekommst Du den nächsten freien PK in einem Statement geliefert. Aber das sollte wirklich nur ein Workaround sein, denn diese Methode kann in einer Multi-User -Umgebung schnell in die Hose gehen, bzw wird sehr aufwendig.
 
Hallo,
wie sieht deine Tabellendefinition aus? Ist vielleicht die falsch? Unter Delphi wird das ID-Feld automatisch weitergezählt, wenn ein neuer Datensatz eingefügt wird. Versuch mal direkt in Access einen Datensatz einzufügen.
 
Hallo,
So jetzt meld ich mich mal wieder. Danke erst mal. Die Fehlermeldung bezog. Hab' es leider erst jetzt herausgefunden woran es lag...

Und zwar folgendes.

Query1->ParamByName("Param1")->AsString = "16.10.2004";

Param1 ist ein DateTime Feld.


Dem Query kann man ja auch noch andere Werte übergeben,
z.B.
Query1->ParamByName("Param1")->AsBoolean = false;
oder
Query1->ParamByName("Param1")->AsInteger = 18;

Also dachte ich:

TDate * datum = new TDate();

Query1->ParamByName("Param1")->AsDate = datum->CurrentDate();
oder
Query1->ParamByName("Param1")->AsDate = Datum->CurrentDate().FormatString(dd:mm:yyyy);;

Akzeptiert er beides mal nicht

Fehlermeldung, wenn ich versuche das datum.->CurrentDate() zurückzugeben bekommt er nen NullPointer zurück.:
Im Programm blabla.exe ist eine Exception der Klasse EDBEngineError aufgetreten. Meldung 'Allgemeiner SQL Fehler'
[Microsoft][ODBC Microsoft Access Dirver] Ungueltiges Dateiformat (null). Prozess wurde angehalten.


Weisst da bescheid?

gruß, basti
 
Zuletzt bearbeitet:
Hab's so weit, in meinem testprogramm...

Query1->ParamByName("Param1")->AsDateTime = DatumZeit->CurrentDate();

Daran lag's ....
Aber evtl besteht das Autoinkrement Problem weiter...
Muss jetzt vorher meine DB wieder so herrichten, dass sie einen PK hat... Eigentlich braucht sie keinen, weil auf die kein FK weist. Aber rein interessehalber.

Ich sag' bescheid ob ich weiterkomm...

gruß, Basti
 
andi_g69 hat gesagt.:
SELECT MAX (T02_ID) + 1 AS NeueID FROM T02_PRUEFUNG
absetzen, dann bekommst Du den nächsten freien PK in einem Statement geliefert. Aber das sollte wirklich nur ein Workaround sein, denn diese Methode kann in einer Multi-User -Umgebung schnell in die Hose gehen, bzw wird sehr aufwendig.

Danke schön...
Funktioniert jetzt alles hervorragend

Gruß, Basti
 

Neue Beiträge

Zurück