[VB6] Records Affected

Pagina: 1
Acties:

  • nenne
  • Registratie: Juni 2004
  • Laatst online: 06-06-2024
Hallo Tweakers,

Ik ben bezig de code van mijn recent afgeronde applicatie te "stroomlijnen", maw te verbeteren waar mogelijk. De applicatie is geschreven in VB6 en maakt gebruik van een MS Access 2000 database.

In de database bevinden zich onder andere 3 tabellen, en wel de volgende:

Query's (QueryID primaire sleutel, .......)

Projecten (ProjectID primaire sleutel, ........)

QueryRegel (QueryRegelID primaire sleutel, QueryID refererende sleutel naar tabel Query's, ProjectID refererende sleutel naar tabel Projecten)

De situatie is als volgt:

Via mijn applicatie maak ik een query, welke ik opsla in de tabel Query's. Vervolgens wil ik het bijbehorende QueryID invoegen in de tabel QueryRegel, aangezien de query bij een bepaald project hoort.

Ik haal het QueryID op door het SQL-statement:

SELECT Max(QueryID) as MaxQueryID FROM Query's

Dit lijkt me erg omslachtig, aangezien ik eerst een INSERT uitvoer in de tabel Query's, vervolgens een SELECT in de tabel Query's om het laatst toegevoegde QueryID op te halen, en tot slot een INSERT om deze toe te voegen aan de tabel QueryRegel.

Volgens mij kan het laatst toegevoegde ID makkelijker opgehaald worden, en ik ben bezig geweest met "Records Affected", maar deze geeft alleen het aantal nieuwe/aangepaste records terug, en niet het ID zelf.

Weet iemand hoe ik dit kan oplossen?

Verwijderd

Wil je niet ontmoedigen, maar voor zover mij bekend los je het op de enig mogelijke manier op.

Heb er zelf ook eens naar gezocht en niets gevonden.

Binnen SQL Server kun je de laatst uitgegeven ID uitlezen via @@IDENTITY, maar ja, daar heb je lekker veel aan, duh.

Wellicht dat er iemand is die het wel uit de krochten van Access gepeurd heeft gekregen, ben benieuwd.

Verwijderd

Bij het starten van je applicatie gelijk het laatstgebruikte ID ophalen en dit via een tellertje bijhouden ?

Verwijderd

Google even op '@@IDENTITY ' ;)
' Insert a new record into the table
lsSQL = "INSERT INTO tMembers (MemberName) VALUES ('Manohar')"

' Execute the SQL statement
loConn.Execute(lsSQL)

' Get the @@IDENTITY. The key statement is the one below
' llID will contain the new identity value inserted
lsSQL = "SELECT @@IDENTITY AS NewID"
Set loRs = loConn.Execute(lsSQL)
llID = loRs.Fields("NewID").value
//edit

nog beter:

HOW TO: Retrieve the Identity Value While Inserting Records into Access Database By Using Visual Basic .NET - Microsoft KB

[ Voor 117% gewijzigd door Verwijderd op 08-07-2004 23:34 ]


Verwijderd

Even lezen misschien ?

De applicatie is geschreven in VB6 en maakt gebruik van een MS Access 2000 database.

Verwijderd

Verwijderd schreef op 08 juli 2004 @ 23:47:
Even lezen misschien ?

De applicatie is geschreven in VB6 en maakt gebruik van een MS Access 2000 database.
Dus? @@Identity is een functie van Access, niet van VB.net oid. AFAIK werkt die ook in VB6/Access 2000.

(misschien eerst even kijken of het klopt wat iemand zegt, voordat je zo bot reageert? ;) )

[ Voor 13% gewijzigd door Verwijderd op 09-07-2004 00:02 ]


Verwijderd

Let er wel op dat @@Identity in combinatie met een autonummer veld moet gebeuren. "Select @@identity from tabel" geeft namelijk de laatst geinsert autonummer van de tabel terug.

Verwijderd

Verwijderd schreef op 08 juli 2004 @ 23:59:
Let er wel op dat @@Identity in combinatie met een autonummer veld moet gebeuren. "Select @@identity from tabel" geeft namelijk de laatst geinsert autonummer van de tabel terug.
Ik ga er vanuit dat hij een autoinc veld gebruikt. Anders zou hij het ID al in de code beschikbaar hebben, immers anders zou hij 'm zelf moeten genereren en opslaan.

  • nenne
  • Registratie: Juni 2004
  • Laatst online: 06-06-2024
Verwijderd schreef op 08 juli 2004 @ 23:59:
Let er wel op dat @@Identity in combinatie met een autonummer veld moet gebeuren. "Select @@identity from tabel" geeft namelijk de laatst geinsert autonummer van de tabel terug.
Bedankt voor alle reacties, maar ik ben benieuwd naar een functie waarbij ik - na het INSERT-statement - niet opnieuw een SELECT-statement hoef uit te voeren. Je geeft in je mogelijke oplossing aan een SELECT-statement te gebruiken, wat ik in de huidige situatie ook al doe.

Ik sluit me vooralsnog aan bij de reactie van KingGeorge, jammer genoeg :'(

Verwijderd

nenne schreef op 09 juli 2004 @ 00:09:
Bedankt voor alle reacties, maar ik ben benieuwd naar een functie waarbij ik - na het INSERT-statement - niet opnieuw een SELECT-statement hoef uit te voeren. Je geeft in je mogelijke oplossing aan een SELECT-statement te gebruiken, wat ik in de huidige situatie ook al doe.

Ik sluit me vooralsnog aan bij de reactie van KingGeorge, jammer genoeg :'(
Let even op dat je applicatie met de huidige methode niet multi-user is. Als iemand anders in de tussentijd iets insert, klopt je ID niet. @@Identity is dan netter.

Een andere mogelijkheid is niet met een insert-query werken, maar je dataset in insert mode zetten, dan posten en vervolgens het ID uitlezen. Op die manier gebruik je maar 1 query, maar ik weet niet of VB6 dit ook ondersteund (kan me nauwelijks voorstellen van niet).

Verwijderd

Verwijderd schreef op 08 juli 2004 @ 23:49:
[...]


Dus? @@Identity is een functie van Access, niet van VB.net oid. AFAIK werkt die ook in VB6/Access 2000.

(misschien eerst even kijken of het klopt wat iemand zegt, voordat je zo bot reageert? ;) )
Sorry, you're right. Overigens maak je toch elke keer een trip naar de database, me dunkt een teller is efficienter, uitgaande van single user, maar misschien zijn daar andere bezwaren tegen ?

[ Voor 4% gewijzigd door Verwijderd op 09-07-2004 00:15 ]


Verwijderd

Verwijderd schreef op 09 juli 2004 @ 00:14:
[...]


Sorry, you're right. Overigens maak je toch elke keer een trip naar de database, me dunkt een teller is efficienter, uitgaande van single user, maar misschien zijn daar andere bezwaren tegen ?
Ook al is de app nu single user, hij zal dat niet voor eeuwig blijven.
Assumption...

Blijf vooralsnog even bij m'n standpunt dat nenne het nu op de enig correcte wijze oplost.

Misschien moet je eens proberen om de record niet via een INSERT toe te voegen, maar via een ADD op een recordset object. Ik zou me zo voor kunnen stellen dat het autonummer veld dan al de juiste waarde heeft. Zo niet dan zal een REQUERY zeker het _juiste_ nummer retourneren. Let wel: juiste nummer hoeft in een multiuser omgeving _niet_ het laatste nummer te zijn...
Pagina: 1