# Access -  ODBC - Insert - AutoIncrement -



## Sapperlot (21. Juli 2005)

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, aram1)");
 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


----------



## andi_g69 (21. Juli 2005)

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, aram1)");
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.


----------



## WieGehts (21. Juli 2005)

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.


----------



## Sapperlot (21. Juli 2005)

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


----------



## Sapperlot (21. Juli 2005)

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


----------



## Sapperlot (21. Juli 2005)

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


----------

