Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di giacomino_jack
    Registrato dal
    Feb 2002
    residenza
    Italy
    Messaggi
    202

    [VB6][SQL] Lock del record

    Ho appena filnito di leggermi un po' di documentazione sulla proprietà LOCKTYPE ma non sono riuscito a chiarirmi le idee

    Per bloccare un record (BENEDETTO IL COBOL con READ LOCK...)
    come devo fare?

    Mi sembra di aver capito che deve modificare un record direttamente dal recordset impostando il tipo di cursore come KeySet, il tipo di Lock in pessimistico o ottimistico, ed utilizzando i metodi AddNew, Update, CancelUpdate e valutando la proprietà EditMode.

    Giusto ?

    Ma se accedo al DB direttamente con comandi SQL
    Se per modificare un record eseguo direttamente " UPDATE [NomeTabella] etc. etc." come faccio a bloccare il record? E come faccio a verificare se il record è bloccato da un altro utente?

    Sono disperato....

  2. #2
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212
    classicissimo problema di gestiore db ad accesso multiplo

    O imposti un flag oppure trovi un'altra soluzione. Ogni scelta avrà i pro ed i contro

    butta un occhio pure sulle transazioni, vedi se ti tornano utili

  3. #3
    Utente di HTML.it L'avatar di giacomino_jack
    Registrato dal
    Feb 2002
    residenza
    Italy
    Messaggi
    202
    Purtroppo si

    Ho più utenti che inseriscono dati e vanno ad aggiornare uno stesso record di totali.
    Tutta la registrazione dei dati inseriti è in una transazione.
    Ho fatto diverse prove ed attualmente ho aggiunto una tabella dove flaggo l'inizio delle operazioni di salvataggio. Questa operazione è fuori dalla transazione. Il tutto è fatto con un comando SQL di Update del record. Ho pensato: Quanto potrà durare l'esecuzione di una Update? Un decimo di secondo? Forse un centesimo di secondo? E vuoi che in quel lasso di tempo un altro operatore registri i suoi dati? Non accadra mai .... COL KAZ non accadrà mai.....
    E' una settimana che il cliente mi rompe le palle con i problemi di quadratura. E il problema è sempre li'.

    Il primo utente legge il record di lock, verifica che ha la posibilità di salvare i dati ma prima che effettui l'Update del record di lock qualche altro utente ha già effettuato la lettura dello stesso record trovandolo ancora non flaggato.

    Troverò una soluzione ?

    Qualche suggerimento?

  4. #4
    hai provato ad usare le transazione per lockare il record?
    Vascello fantasma dei mentecatti nonchè baronetto della scara corona alcolica, piccolo spuccello di pezza dislessico e ubriaco- Colui che ha modificato l'orribile scritta - Gran Evacuatore Mentecatto - Tristo Mietitore Mentecatto chi usa uTonter danneggia anche te

  5. #5
    Utente di HTML.it L'avatar di giacomino_jack
    Registrato dal
    Feb 2002
    residenza
    Italy
    Messaggi
    202
    Ho usato la transazione solo per la parte di registrazione dei dati inseriti dato che finiscono su più tabelle.

    Per la tabella di lock mi sono tenuto fuori dalla transazione.
    Cosa dovrei fare di preciso

  6. #6
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212
    il lock devi dividerlo in 2 momenti: la lettura per la modifica (o l'inserimento di una nuova chiave) e il salvataggio

    quando effettui la lettura per la modifica ti salvi la chiave che stai modificando

    un secondo utente, quando legge la stessa chiave la trova bloccata. Quando salvi togli il lock

    Ricorda che se il client che ha effettuato il lock va i ncrash ti rimane la tabella con la chiave del lock, quindi fai in modo di mettere nella tabellla anche un id della postazione che aveva messo il lock così puoi fare la pulizia in caso di necessita

  7. #7
    Utente di HTML.it L'avatar di giacomino_jack
    Registrato dal
    Feb 2002
    residenza
    Italy
    Messaggi
    202
    OK. CI SONO! :metallica

    Questo il test da me provato:

    codice:
    Private Sub Command1_Click()
       Dim rdsTemp As Recordset
       
       On Error GoTo Errore
       
       Set rdsTemp = New Recordset
       
       With rdsTemp
          .ActiveConnection = gConnessioneADODB
          .LockType = adLockPessimistic
          .Source = "SELECT * FROM LOCKTABLE WHERE IDRECORD = ""PROG1"" "
          .Open
          If IsNull(.Fields("DATAORA")) Then
             ' Inserisce la data/ora di blocco del record (da portare a NULL allo sblocco)
             .Fields("DATAORA") = Now
             .Update
          Else
             MsgBox "Record bloccato"
          End If
          .Close
       End With
       
       Set rdsTemp = Nothing
       
       Exit Sub
    
    Errore:
       Select Case rdsTemp.EditMode
          Case adEditNone
             MsgBox "Errore non previsto: ..." , vbCritical, "Attenzione:"
          Case adEditInProgress
             MsgBox "Record in uso.", vbExclamation, "Attenzione:"
       End Select
    End Sub
    Lanciando da 2 task diversi di VB6 ho potuto provare l'effettivo blocco del record con chiave 'PROG1' nella tabella 'LOCKTABLE'.
    Il blocco viene riscontrato se un task ha già effettuato l'Update dope che l'altro task ha effettuato solo l'Open e/o le variazione dei campi: all'esecuzione del comando Update si genera un errore che si può tranquillamente controllare valutando lo stato di EditMode.

    MA.....
    Se invece di lavorare direttamente sul recordset utilizzo un comando SQL per variare il record di LOCKTABLE

    codice:
    ...
    UPDATE LockTable SET DataOra = #2004/05/12 10:00# WHERE  ((LockTable.DataOra)="PROG1"))
    ...
    si può effettuare il lock del record in qulache maniera? :tongue:

    ...O NO

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.