Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    59

    [C#] Numeri progressivi con OleDb e Access

    Ciao a tutti.
    Ho bisogno di crearmi una sequenza su database per generare numeri progressivi univoci (p.es. numeri dei preventivi) in ambito concorrente, con diversi processi che accedono allo stesso database anche da computer diversi.

    Da C# (dotnet 2.0) uso il driver OleDb con connection-string
    codice:
    Provider=Microsoft.JET.OLEDB.4.0;data source=c:\percorso\file.mdb
    Eseguendo prima una SELECT poi una UPDATE (o vice versa) c'è il problema della concorrenza per cui due o più processi possono ottenere lo stesso progressivo.
    Avendo esperienza con MySql ho pensato subito alla "SELECT ... FOR UPDATE" ma sembra che in Access non ci sia nulla di equivalente.
    documentazione mysql

    Per il momento ho risolto con un workaround ma sto cercando una soluzione definitiva.
    Non posso usare i campi contatore con incremento automatico.
    So che esiste la possibilità di aprire il file in modo esclusivo (Exclusive=1 nella connectionstring) ma è una proprietà della connessione mentre a me serve solo nel momento in cui genero il progressivo.

    Qualche idea?

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    59
    potrebbe andar bene anche l'equivalente delle istruzioni MySql
    codice:
    "LOCK TABLE ..."
    "UNLOCK TABLE ..."
    qualcuno sa se esistono su Access?

  3. #3
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244

    Re: [C#] Numeri progressivi con OleDb e Access

    Originariamente inviato da bitman
    Non posso usare i campi contatore con incremento automatico.
    So che esiste la possibilità di aprire il file in modo esclusivo (Exclusive=1 nella connectionstring) ma è una proprietà della connessione mentre a me serve solo nel momento in cui genero il progressivo.
    Esatto, i campi Contatore di Access sono una ciofeca in multi-utenza.
    La sola cosa da fare è utilizzare un contatore personalizzato:

    HOW TO Implement Multiuser Custom Counters in Jet 4.0 and ADO 2.1
    http://support.microsoft.com/default...b;EN-US;240317


  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    59
    grazie gibra era proprio quello che cercavo!
    peccato però che è per VB6..
    in C# esiste l'equivalente del seguente codice?
    codice:
    rs.Open TableName, cn, adOpenDynamic, adLockPessimistic, adCmdTableDirect
    ...
    Dim Jet As JRO.JetEngine
    Set Jet = New JRO.JetEngine
    Jet.RefreshCache cn
    fondamentale pare che sia "adLockPessimistic" oltre che "RefreshCache"

  5. #5
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Originariamente inviato da bitman
    grazie gibra era proprio quello che cercavo!
    peccato però che è per VB6..
    in C# esiste l'equivalente del seguente codice?
    Non esiste alcun equivalente in .NET, ma dall'articolo qui sotto puoi capire come utilizzare l'oggetto JRO, e quando hai quello sei a cavallo.
    Il codice è banale e 'tradurlo' in C# lo è altrettanto:

    HOW TO: Comprimere un database di Microsoft Access Database con Visual Basic .NET
    http://support.microsoft.com/kb/306287




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.