[VB6 + Access] Hoe Autonummerings veld opvragen na invoegen

Pagina: 1
Acties:

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Hoe kan ik na het invoegen van een record in access vanuit visual basic het autoincrement veld opvragen? Ik wil dus hetzelfde als je in PHP kunt bereiken met "mysql_insert_id()".

Google vind ik een paar resultaten, maar geen oplossing. Op dit forum en andere staat hier ook niets over.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Public cnUniversal As ADODB.Connection

Public Function OpenConnection()
  Set cnUniversal = New ADODB.Connection
  
  With cnUniversal
    If .State <> adStateOpen Then
      .ConnectionString = "c:\mijn documenten\projecten\factuur\db\factuur.mdb" '
      .CursorLocation = adUseClient
      .Provider = "Microsoft.Jet.OLEDB.4.0"
      .Open
    End If
  End With
End Function

Public Function ExecuteSQL(strSQL As String) As ADODB.Recordset
  Dim rsUniversal As ADODB.Recordset
  Set rsUniversal = New ADODB.Recordset
  
  With rsUniversal
    .ActiveConnection = cnUniversal
    .CursorLocation = adUseClient
    .CursorType = adOpenDynamic
    .LockType = adLockOptimistic
    .Source = strSQL
    .Open
  End With
  
  Set ExecuteSQL = rsUniversal
End Function

Private Sub Invoegen()
  OpenConnection
  Dim rsBestel As ADODB.Recordset
  Set rsBestel = ExecuteSQL("INSERT INTO bestel (bestel_datum) VALUES('22/10/2003')")
End Sub

[ Voor 9% gewijzigd door Fles op 22-10-2003 16:08 ]


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Select MAX(AutoNumeringVeld) as HoogsteWaarde from bestel :?

Dit lijkt me een redelijk eenvoudige oplossing. Je vraagt dan gewoon de hoogste waarde op van het veld dat je autonummering bevat. Let wel op dat je door deze manier van werken problemen kunt krijgen bij concurrent users!!!

My personal website


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Als je met Access2000 werkt:
code:
1
SELECT @@identity

https://fgheysels.github.io/


  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
OZ-Gump schreef op 22 oktober 2003 @ 16:12:
Select MAX(AutoNumeringVeld) as HoogsteWaarde from bestel :?

Dit lijkt me een redelijk eenvoudige oplossing. Je vraagt dan gewoon de hoogste waarde op van het veld dat je autonummering bevat. Let wel op dat je door deze manier van werken problemen kunt krijgen bij concurrent users!!!
Ja deze manier heb ik ook aan gedacht, maar wat je zegt als ik hem op een ODBC laat draaien gaat dit misschien een keer fout... Nou zal dit programma niet echt door iedereen gebruikt gaan worden dus tot er iets beters is kan ik dit wel gebruiken.

Maar niet stoppen met nadenken! ;)

[ Voor 14% gewijzigd door Fles op 22-10-2003 16:26 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Als je met concurrent users gaat werken, is Access zowiezo geen optie als databank wmb.

Dan kan je beter naar SQL Server overstappen. Daar kan je meteen gebruik maken van stored procedures.
Je maakt dan bv. een SP die het record gaat gaan inserten, en die ook dmv een output-parameter het id van het nieuwe record teruggeeft:

code:
1
2
3
4
5
6
7
8
9
10
CREATE PROCEDURE InsertRecord (@p_naam   VARCHAR(25),
                               @p_id     INTEGER OUTPUT)
AS
BEGIN

  INSERT INTO tabel (persoonnaam) VALUES (@p_naam)

  SELECT @p_id = scope_identity() FROM tabel

END

[ Voor 3% gewijzigd door whoami op 22-10-2003 16:29 ]

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

whoami schreef op 22 October 2003 @ 16:29:
Dan kan je beter naar SQL Server overstappen. Daar kan je meteen gebruik maken van stored procedures.

Not to mention transactions :)

Professionele website nodig?


  • DukeMan
  • Registratie: Mei 2000
  • Niet online
OZ-Gump schreef op 22 October 2003 @ 16:12:
Select MAX(AutoNumeringVeld) as HoogsteWaarde from bestel :?

Dit lijkt me een redelijk eenvoudige oplossing. Je vraagt dan gewoon de hoogste waarde op van het veld dat je autonummering bevat. Let wel op dat je door deze manier van werken problemen kunt krijgen bij concurrent users!!!
Dit gaat fout als je met meerdere mensen tegelijkertijd op de database werkt en gelijktijdig records invoer. Je krijgt dan wel het hoogtse nummer, maar is die wel van jou???

Ik doe het meestal als volgt:
In mijn insert query vul ik een veld (bjiv. naam) met een bepaalde (random) waarde. Vervolgens doe ik een insert, en doe ik een select query op het id en de naam = random. Vervolgens een update ala: update x set naam = 'waarde' where id = 'newid'.

Dit gaat eigenlijk altijd goed.... Dat random getal kan je bijvoorbeeld doen door een GUID te genereren... Er bestaat een api voor (ik geloof cocreateguid). Deze laat door windows een guid creeeren welke altijd uniek is...

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
curry684 schreef op 22 October 2003 @ 16:35:
[nohtml]
[...]
[/nohtml]
Not to mention transactions :)


Met Access kan je ook wel transacties afdwingen hoor.
Alleen moet je dat dan wel in je client-applicatie doen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
OleDbTransaction trans = conn.BeginTransaction();
try
{

  // doe hier wat meuk.

   trans.Commit();
}
catch
{
   trans.Rollback();
}

https://fgheysels.github.io/


Verwijderd

Als je ik je goed begrijp wil je het Idnr van het zojuist toegevoegde record opvragen?

Ik doe het altijd zo.

Visual Basic 6:
1
2
3
4
5
6
7
8
    With objRS
        If .EOF Then .AddNew  'ivm Nieuw Record toevoegen
        .Fields("Naam") = m_sNaam

        .Update
        ' Id ophalen is namelijk autonumber
         m_lId = .Fields("Id")
    End With


Waarbij objRS je recordset is met een select query op het nummer dat je wilt wijzigen. Als je wilt toevoegen is dit nummer 0 en komt het niet voor en is objRS = EOF.

Let wel op in dit geval is de procedure die de records wijzigt en toevoegt het zelfde.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
Verwijderd schreef op 23 October 2003 @ 10:13:
Visual Basic 6:
1
2
3
4
5
6
7
8
    With objRS
        If .EOF Then .AddNew  'ivm Nieuw Record toevoegen
        .Fields("Naam") = m_sNaam

        .Update
        ' Id ophalen is namelijk autonumber
         m_lId = .Fields("Id")
    End With
Ik vraag me af of deze contructie altijd werkt, heb meerdere malen gezien dat updates niet direct geflushed worden.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Ik heb dat probleem niet ondervonden, misschien ligt het er aan met welke attributen je de recordset hebt geopend. De wijzigingen worden bij mij meteen na de update weggeschreven.

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Verwijderd schreef op 23 October 2003 @ 10:13:
Als je ik je goed begrijp wil je het Idnr van het zojuist toegevoegde record opvragen?

Ik doe het altijd zo.

Visual Basic 6:
1
2
3
4
5
6
7
8
    With objRS
        If .EOF Then .AddNew  'ivm Nieuw Record toevoegen
        .Fields("Naam") = m_sNaam

        .Update
        ' Id ophalen is namelijk autonumber
         m_lId = .Fields("Id")
    End With


Waarbij objRS je recordset is met een select query op het nummer dat je wilt wijzigen. Als je wilt toevoegen is dit nummer 0 en komt het niet voor en is objRS = EOF.

Let wel op in dit geval is de procedure die de records wijzigt en toevoegt het zelfde.
Ja, ik werk alleen met een insert query en niet met een recordset.

Verwijderd

Graveheart schreef op 23 October 2003 @ 14:45:
[...]

Ja, ik werk alleen met een insert query en niet met een recordset.
True, maar je zou het kunnen oplossen op de bovenstaande manier en aangezien je gebruik maakt van rsBestel As ADODB.Recordset heb je dus wel een recordset waarmee je het kan doen. :)
Pagina: 1