# INSERT mit VB und ACCESS: letzte ID ermitteln



## Andreas Dunstheimer (15. Dezember 2003)

Hi,

leider finde ich über die Suche nur MySQL-Beiträge zu diesem Thema, aber das klappt in VB nicht so ganz.

Altbekanntes Problem: ich füge mit INSERT einen neuen Datensatz an eine Tabelle an, und will ermitteln, welche ID in einem Auto_Increment-Feld vergeben wurde.

Jemand nen Tip?


Dunsti


----------



## Luda (16. Dezember 2003)

neue sql - anweisung?!
z.b.
sql ="SELECT Max(autowert) AS MaxWert
FROM tbl1"


----------



## Andreas Dunstheimer (16. Dezember 2003)

danke, auf die Idee bin ich heute Nacht auch noch gekommen ;-)

ich dachte nur, da gäbe es evtl. was einfacheres!?


Dunsti


----------



## Luda (16. Dezember 2003)

einfacher!

auf welche db greifst du zu?
wenn du das mit acces und adodb machst, kannst du auch gleich den wert abfragen.
z.b.
msgbox rs.fields("autowert").value

aber das geht nur bei access


----------



## Andreas Dunstheimer (16. Dezember 2003)

ich habe Access, aber die Insert-Anweisung schicke ich per ADO-Command zur DB. Bei dieser Lösung bräuchte ich ja ein Recordset, oder?


Dunsti


----------



## Andreas Dunstheimer (16. Dezember 2003)

im Moment habe ich es so:


```
CnD.Provider = "Microsoft.Jet.OLEDB.4.0"
        CnD.ConnectionString = "Data Source=" + frmHaupt.DB_Name
        CnD.CursorLocation = adUseClient
        CnD.Open
        With Cmd
            .ActiveConnection = CnD
            .CommandType = adCmdText
            .CommandText = "INSERT INTO Kunden (Name, Vorname, Strasse, Postleitzahl, Ort, Telefon, Mobil, Email, Bemerkung1, Bemerkung2, Bemerkung3) VALUES ('" + txtName.Text + "', '" + txtVorname.Text + "', '" + txtStrasse.Text + "', '" + txtPostleitzahl.Text + "', '" + txtOrt.Text + "', '" + txtTelefon.Text + "', '" + txtMobil.Text + "', '" + txtEmail.Text + "', '" + txtBemerkung1.Text + "', '" + txtBemerkung2.Text + "', '" + txtBemerkung3.Text + "')"
            .Execute
        End With
        With RsT
            .ActiveConnection = CnD
            .CursorType = adOpenStatic
            .Source = "SELECT * FROM Kunden ORDER BY ID DESC"
            .Open
            .MoveFirst
            frmHaupt.KundenID = .Fields("ID")
        End With
```


----------



## Luda (16. Dezember 2003)

und wie schaut es damit aus?:
 With RsT
            .ActiveConnection = CnD
            .CursorType = adOpenStatic
            .Source = "SELECT * FROM Kunden ORDER BY ID DESC"
            .Open
.MoveLast 
            frmHaupt.KundenID = .Fields("ID")
        End With


----------



## Andreas Dunstheimer (16. Dezember 2003)

ich glaube, Du hast mich jetzt falsch verstanden: So wie ich es im Moment mache funktioniert es ! ich dachte nur, es gäbe eine einfachere Lösung als nochmal eine Select-Abfrage machen zu müssen. (Irgendwie als Rückgabewert der INSERT-Anweisung oder sowas)

Bei Deinem Beispiel springt er ja durch das ORDER DESC auf die kleinste (und somit älteste) ID


Dunsti


----------



## Luda (16. Dezember 2003)

ich hab da noch ne lösung, wenn du das ganze öffters machen musst. es ist nur ein beispiel. ich würde dann das ganze in 2 funktionen mit rückgabewert schreiben. z.b. db_recordset(cn as adodb.recordset,sql as string), db_connect(dbpfad as string).

    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim sql As String

    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    With cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Data Source=test.mdb" ' db
        .CursorLocation = adUseClient
        .Open
    End With

    sql = "select * from test" ' auswahl der tabelle
    With rs
        .Source = sql
        .ActiveConnection = cn
        .CursorType = adOpenKeyset
        .LockType = adLockOptimistic
        .Open
      End With
      rs.AddNew
      rs!wert1 = "Test" 'wert in die tabelle schreiben

      rs.Update
      MsgBox rs!auto ' aktueller datensatz(. nur bei access)


----------

