Toon posts:

[access] AutoInc veld via ODBC werkt niet

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ok, ik zit dus met een vrij fors prob. Ik heb morgen presentatie van een (extreem) belangrijk project op school en er zit een ernstige bug in ons prog...het is een C++Builder 5 programma wat gebruikt maakt van een MSAccess database die we via de BDE en een ODBC connectie aanspreken. In de tabellen van deze database zitten 2 velden (IDnummers) die als datatype autoincrement hebben. In Access wordt bij het aanmaken van een nieuw record idd netjes een nummer toegekend aan dit veld, maar als ik via C++ builder een nieuw record aanmaak gebeurt dit niet. Aangezien dit een heel belangrijk veld is (noodzakelijk) is dit dus nogal een probleem.
Als iemand hier een oplossing voor weet (of in ieder geval weet wat het prob is) dan zou ik het errug op prijs stellen als-ie dat ff met mij zou willen delen.

Bij voorbaat dank

  • whoami
  • Registratie: December 2000
  • Laatst online: 06:24
Hmm. Raar. Ik heb al verschillende apps gemaakt in C++ Builder met een Access databank en nog nooit dat probleem gehad. De connectie gebeurt ook via ODBC.

Hoe ziet uw INSERT statement eruit?


[off-topic]
(Vandaag de dag maak ik nauwelijks nog gebruik van die auto-increment fields van access. Ik hou in een systeemtabelletje voor iedere andere tabel een record bij met daarin de hoogste PK van iedere tabel.
Bij het maken van een nieuw record kijk ik dan in die tabel om de nieuwe PK te bepalen.
[/off-topic]

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 06:24
Als je tabel er zo uit ziet:
code:
1
2
3
4
Tabel test:
id     : auto - increment
naam     : varchar(50)
adres   : varchar(50)

Dan moet je insert statement er zo uit zien:
code:
1
2
3
INSERT INTO test (naam, adres) 
VALUES
("whoami", "zulte")

De pk mag je er dus niet inzetten als het een auto-inc field is. Access zal wel zorgen dat er waarde aan toegekend wordt;

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik maak geen gebruik van een query, maar van een Ttable object. Door eerst Append() te gebruiken en dan de waardes uit de DBEdit-velden met Post() aan de database toe te voegen...ik heb nagekeken of het datatype in C++Builder ook als autoinc is gedefineerd en dat is zo. Zoals ik het nou heb wordt een nieuw record niet aan de database toegevoegd aangezien dit veld (wat verplicht is) niet ingevuld is.

  • whoami
  • Registratie: December 2000
  • Laatst online: 06:24
Op zondag 13 januari 2002 22:19 schreef D-mension het volgende:
Ik maak geen gebruik van een query, maar van een Ttable object. Door eerst Append() te gebruiken en dan de waardes uit de DBEdit-velden met Post() aan de database toe te voegen...ik heb nagekeken of het datatype in C++Builder ook als autoinc is gedefineerd en dat is zo. Zoals ik het nou heb wordt een nieuw record niet aan de database toegevoegd aangezien dit veld (wat verplicht is) niet ingevuld is.
Gebruik maken van TTables vind ik niet 'the way to go'.
Welke fout krijg je precies?

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 06:24
'k heb net even een testje uitgevoerd.

Een TTable component op een form gesleurt, een Datasource component gepakt en gelinkt aan de Table.
Vervolgens wat DBEdit controls op de form gezet en deze gelinkt met de desbetreffende velden.
(De PK heb ik er NIET bijgezet).
Vervolgens mbhv de TTable::Append() en TTable::Post() functies het record toegevoegd en geen problemen ondervonden.

https://fgheysels.github.io/


Verwijderd

Op zondag 13 januari 2002 22:19 schreef D-mension het volgende:
Ik maak geen gebruik van een query, maar van een Ttable object. Door eerst Append() te gebruiken en dan de waardes uit de DBEdit-velden met Post() aan de database toe te voegen...ik heb nagekeken of het datatype in C++Builder ook als autoinc is gedefineerd en dat is zo. Zoals ik het nou heb wordt een nieuw record niet aan de database toegevoegd aangezien dit veld (wat verplicht is) niet ingevuld is.
Gebruik in het vervolg i.p.v. een TTable een TQuery. De TTable werkt wel maar super inefficiënt. Maar dat terzijde.

Staat er ook een DBEdit die gelinkt is aan het auto inc veld? Zo ja, verwijder deze.

De waarde m.b.t. auto inc-veld wordt pas 'gemaakt' na de Post, dus niet tijdens de Append.

Als het niet teveel moeite is kun je beter in volgende projecten de DBAware controls links laten liggen en delete, update en insert queries gebruiken, zijn stukken efficiënter imho.

  • whoami
  • Registratie: December 2000
  • Laatst online: 06:24
Op maandag 14 januari 2002 10:50 schreef hvdberg het volgende:


Gebruik in het vervolg i.p.v. een TTable een TQuery. De TTable werkt wel maar super inefficiënt. Maar dat terzijde.
Helemaal mee eens, zie ook een vorige post van mij hierboven.
Als het niet teveel moeite is kun je beter in volgende projecten de DBAware controls links laten liggen en delete, update en insert queries gebruiken, zijn stukken efficiënter imho.
Hier ben ik het niet volledig mee eens. Als je een overzicht van een hele hoop records wilt tonen, dan is een data-aware grid veel sneller dan als je een SELECT statement uitvoerd en dan alle gegevens zelf in een ListView ofzo gooit.

https://fgheysels.github.io/


Verwijderd

Op maandag 14 januari 2002 11:05 schreef whoami het volgende:

[..]

Hier ben ik het niet volledig mee eens. Als je een overzicht van een hele hoop records wilt tonen, dan is een data-aware grid veel sneller dan als je een SELECT statement uitvoerd en dan alle gegevens zelf in een ListView ofzo gooit.
Dat klopt. Maar gebruik dan i.i.g. alleen de grid voor display.

PS. 'k Gebruik zelf ook de DBAware controls en daarom raad ik anderen altijd aan om ze niet te gebruiken tenzij het niet anders kan. DBGrid is zo'n uitzondering hoewel er DBGrids op de markt zien die veel meer en veel beter kunnen.

Verwijderd

Topicstarter
Nou, ik heb mijn presentatie inmiddels achter de rug (en het is behoorlijk mis gegaan). Maar goed...

Het vreemde is dat het autoinc veld in het begin wel fatsoenlijk werkte, maar om de 1 of andere reden niet meer...uiteindelijk heb ik dat op kunnen lossen door de hoogste ID in de database te pakken en er daar 1 bij op te tellen...
Achteraf gezien had ik idd beter een TQuery kunnen gebruiken, maar ja: weer wat geleerd he?!

Bedankt voor de reacties in ieder geval!
Pagina: 1