Recupero nuove identity e transazioni

di il
9 risposte

Recupero nuove identity e transazioni

Buongiorno a tutti

Ho il seguente problema, vorrei recuperare l'identity di un record aggiunto a una tabella collocata su un SQL server via ODBC durante una transazione.

Questo è il codice che ho utilizzato
Private Sub Comando0_Click()
    Dim wrk As DAO.Workspace
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim rst1 As DAO.Recordset
    Dim NewId As Integer
    
    Set wrk = DBEngine(0)
    Set db = CurrentDb()
    Set rst = db.OpenRecordset("TabellaVenature", dbOpenSnapshot)
    Set rst1 = db.OpenRecordset("TabellaVenature", dbOpenDynaset, dbSeeChanges)
    rst.FindFirst ("IdRecord=5")
    If rst.NoMatch Then
        MsgBox ("Venatura non trovata")
        Exit Sub
    End If
    
    On Error GoTo trans_Err
    wrk.BeginTrans
    
    rst1.AddNew
    For i = 1 To rst.Fields.Count - 1
        rst1(i) = rst(i)
    Next
    rst1.Update
    NewId = DBEngine(0)(0).OpenRecordset("SELECT @@identity FROM TabellaVenature")(0)
    MsgBox (NewId)
    
    wrk.CommitTrans dbForceOSFlush
    
trans_exit:
    rst.Close
    rst1.Close
    db.Close
    wrk.Close
    Exit Sub
    
trans_Err:
    i = MsgBox("Errore di scrittura sul database " & Err.Number & " - " & Err.Description, vbCritical)
    'Roll back the transaction
    wrk.Rollback
    Resume trans_exit
    
End Sub
Il mio problema è che quando cerco di recuperare il nuovo id si blocca tutto e dopo qualche secondo genera un errore di scrittura non riuscita.
Se non metto la transazione tutto funziona bene.
Io vorrei usare la transazione perchè poi devo aggiungere righe a un altra tabella da collegare alla prima tramite l'id recuperato.

Esiste un modo per fare questa cosa?

9 Risposte

  • Re: Recupero nuove identity e transazioni

    Temo che sia impossibile... finchè non effettui il COMMIT il DB non dovrebbe scrivere veramnete nella tabella.
    Infatti solitamente si usa con Query ACTION di Insert...
    Puoi provare a leggere il Valore della proprietà [LastModified] del Rs...
    
    With Rst1
        .AddNew
               ....
        .Update
        .Bookmark = .LastModified
        lIdentity = !ID
    End With
  • Re: Recupero nuove identity e transazioni

    Grazie per la pronta risposta Alex

    Immaginavo che il problema fosse quello ma speravo ci fosse un modo per aggirare il problema visto che anche se la tabella non viene scritta l'id viene assegnato infatti se si fa il rollback quell'id è perso.
    proverò a fare come mi ha suggerito, sono in ambiente multitasking ma la posibilità che questa procedura venga usata da due persone in contemporanea è molto remota.
  • Re: Recupero nuove identity e transazioni

    Beachman ha scritto:


    ...
    proverò a fare come mi ha suggerito, sono in ambiente multitasking ma la posibilità che questa procedura venga usata da due persone in contemporanea è molto remota.
    Però esiste, questo significa che accadrà. Sicuramente.
    Posso suggerire un paio di accorgimenti? Forse non hanno alcuna rilevanza però mi sembra di chiudere tutte le possibilità d'errore.
    Set wrk = DBEngine(0)
    Set db = CurrentDb()
    ...
    NewId = DBEngine(0)(0).OpenRecordset("SELECT @@identity FROM TabellaVenature")(0)
    
    Hai già un oggetto Workspace sul quale hai aperto una transazione, forse è meglio assegnare l'oggetto Database all'elemento 0 di Databases?
    Set wrk = DBEngine(0)
    Set db = wrk(0)
    ...
    NewId = db.OpenRecordset("SELECT @@identity FROM TabellaVenature")(0)
    E' un po' buttata lì però: intuito + logica = 100% (ma non vi dico le singole percentuali della somma). Di certo 0% di fondamento tecnico.
  • Re: Recupero nuove identity e transazioni

    Grazie della risposta Phill
    Ho provato ma non funziona nemmeno così, ho lo stesso tipo di problema.

    Per il momento ho eliminato la transazione e gestirò manualmente eventuali errori
  • Re: Recupero nuove identity e transazioni

    Beachman ha scritto:


    Grazie della risposta Phill
    Ho provato ma non funziona nemmeno così, ho lo stesso tipo di problema.
    La mia conoscenza della multiutenza e di SQL Server sono prossime allo zero.

    Beachman ha scritto:


    Per il momento ho eliminato la transazione e gestirò manualmente eventuali errori
    Cosa comporta modificare il codice così?
        wrk.BeginTrans
        rst1.AddNew
    ...
        rst1.Update
        wrk.CommitTrans dbForceOSFlush
        NewId = DBEngine(0)(0).OpenRecordset("SELECT @@identity FROM TabellaVenature")(0)
        MsgBox (NewId)
        
        'wrk.CommitTrans dbForceOSFlush
  • Re: Recupero nuove identity e transazioni

    Ciao Phil

    Così probabilmente funziona (non ho provato ma dovrebbe andare perchè prima di cercare il nuovo ID chiudi la transizione) purtroppo però si perde lo scopo iniziale che è ottenere l'ID prima di chiudere la transizione in modo da poterlo utilizzare per aggiungere record ad altre tabelle con relazione uno a molti con la prima.
  • Re: Recupero nuove identity e transazioni

    Se usi il metodo che ti ho suggerito, ed includi anche le modifiche alle Tabelle lato Molti all'interno della transazione... cosa non funziona in questo modo...?
  • Re: Recupero nuove identity e transazioni

    Sto provando adesso, ci ho rimesso mano oggi.
    Vi aggiorno sui risultati
  • Re: Recupero nuove identity e transazioni

    Con il metodo di Alex funziona, grazie mille per il suggerimento sei un grande
Devi accedere o registrarti per scrivere nel forum
9 risposte