Newsgroup: it.comp.lang.visual-basic
Titolo: Multiutenza sun MDB

Ciao,
so benissimo che non si DEVE fare...ma purtroppo io per ora ci devo
convivere..(continuando a sognare Firebird :-) )
Ora, la mia situazione è:
ho un mdb condiviso, effettuo un'aggiornamento (o tramite SQL o tramite
un recordset).
Al termine dell'operazione invio un messaggio alle altre postazioni per
rileggere i/il record, ma queste lo trovano ancora non aggiornato
(nonostante il Requery del recorset o effettuando una SELECT tramite
l'Execute).
Ho provato anche ad inviare il messaggio aspettando l'evento
ExecuteComplete della connessione, ma nada.
Ora, il mio dubbio dov'è il 'ritardo'? Sulla scrittura-sblocco della
tabella oppure sulla 'resa disponibile' dei nuovi dati?
Tnx.
Daniele.

 tabella oppure sulla 'resa disponibile' dei nuovi dati?
Il jet engine ha di default una latenza di circa 2 secondi per scrivere 
fisicamente su disco.
Devi forzare il flush con DbEngine.Idle dbFlushCache (se ricordo bene il 
parametro), rigorosamente DAO.
Ciao 

 parametro), rigorosamente DAO.
Aspetta...in che senso "rigorosamente DAO"? Con ADO questo non si può
fare?!
Tnx.
Daniele.

Barzo@Google ha scritto:

Si esatto ti passo l'Help che di certo può aiutare.
Sospende l'elaborazione dei dati, consentendo al modulo di gestione di
database Microsoft Jet di completare le attività in sospeso, come
l'ottimizzazione della memoria o i timeout di pagina. Solo per le aree
di lavoro di Microsoft Jet.
Sintassi
DBEngine.Idle [dbRefreshCache]
Osservazioni
Il metodo Idle consente al modulo di gestione di database Microsoft Jet
di eseguire attività in background che potrebbero non essere
aggiornate a causa di un'intensa attività di elaborazione dati. Ciò
avviene spesso in ambienti multiutente e multitasking che non
dispongono di tempo di elaborazione in background sufficiente per
mantenere correnti tutti i record di un oggetto Recordset.
I blocchi di lettura, in genere, vengono eliminati ed i dati contenuti
negli oggetti Recordset locali di tipo dynaset vengono aggiornati solo
quando non vengono effettuate altre azioni, compresi gli spostamenti
del mouse. Se il metodo Idle viene utilizzato periodicamente, Microsoft
Jet può disporre di tempo sufficiente per le attività in background
rilasciando i blocchi di lettura non necessari.
Se si specifica l'argomento opzionale dbRefreshCache, le scritture in
sospeso vengono forzate nei file MDB e la memoria viene aggiornata con
i dati più recenti del file MDB.
Questo metodo non è necessario negli ambienti a utente singolo, a meno
che non siano in esecuzione più istanze di una stessa applicazione. Il
metodo Idle può migliorare le prestazioni in un ambiente multiutente
in quanto forza il modulo di gestione di database a scrivere i dati su
disco, rilasciando i blocchi nella memoria.
Nota   I blocchi di lettura possono essere rilasciati anche includendo
le operazioni in una transazione.
In questo esempio si utilizza il metodo Idle per assicurare che una
routine di output stia accedendo ai dati più correnti disponibili del
database. Per eseguire questa routine si richiede la routine
IdleOutput.
Sub IdleX()
	Dim dbsNorthwind As Database
	Dim strPaese As String
	Dim strSQL As String
	Dim rstOrdini As Recordset
	Set dbsNorthwind = OpenDatabase("Northwind.mdb")
	' Ottiene il nome del paese dell'utente e
	' costruisce con esso un'istruzione SQL.
	StrPaese = Trim(InputBox("Immettere paese:"))
	strSQL = "SELECT * FROM Ordini WHERE Paese = '" & _
		strPaese & "' ORDER BY IDOrdine"
	' Apre un oggetto Recordset con un'istruzione SQL.
	Set rstOrdini = dbsNorthwind.OpenRecordset(strSQL)
' Visualizza il contenuto di un oggetto Recordset.
	IdleOutput rstOrdini, strPaese
	rstOrdini.Close
	dbsNorthwind.Close
End Sub
Sub IdleOutput(rstTemp As Recordset, strTemp As String)
	' Chiama il metodo Idle per rilasciare blocchi non
	' necessari, forza scritture in sospeso e rigenera
	' la memoria con i dati correnti del file mdb.
	DBEngine.Idle dbRefreshCache
	' Elenca l'oggetto Recordset.
	With rstTemp
		Debug.Print "Ordini da " & strTemp & ":"
Debug.Print , "IDOrdine", "IDCliente", "DataOrdine"
		Do While Not .EOF
			Debug.Print , !IDOrdine, !IDCliente, !DataOrdine
			.MoveNext
		Loop
	End With
End Sub
@Alex

 l'ottimizzazione della memoria o i timeout di pagina.
Ora, il primo dubbio è: perchè in ADO non esiste + una cosa simile?!
Quindi dovrei cambiare ed usare DAO anzichè ADO? Naaaa!!
Daniele.

 fare?!
Sě ma devi referenziare la libreria "Microsoft Jet and Replication Objects 2.6
Library" ed utilizzare il metodo JRO.RefreshCache, passandogli un oggetto
Connection aperto sul tuo DB.
Ricorda poi che puoi effettuare un "fine tuning" delle prestazioni di Jet agendo
su opportune impostazioni del registro:
http://office.microsoft.com/it-it/assistance/HP010321611040.aspx
Bye
Raf
-----------------------------------------------------
Funk: cooler than the other side of the pillow.

 
http://office.microsoft.com/it-it/assistance/HP010321611040.aspx
A suo tempo feci queste prove, ma non riuscii a farle funzionare: la latenza 
rimaneva.
Ciao 


Grazie Raf!!
Adesso faccio due prove continuando l'azione di convincimento per
passare ad un DB Server!
Daniele.

 Daniele.
@Alex

[...]
Come quotato si possono usare le transazioni, no?
..non vorrei aver detto una stupidata ma c'č proprio scritto cosě mentre 
sembra che nessuno se ne sia accorto dai post successivi..
..non č che con MDB non si possono fare le transazini magari? ..chiedo, 
perchč non so, di solito uso MSSQL..
Ciao,
    Diego 

 perchè non so, di solito uso MSSQL..
Le transazioni su un MDB si possono fare, ma dato che non è un engine server 
secondo me funzionano solo in locale, cioè funziona il concetto di "o tutto 
o niente", ma per ogni singola macchina.
Non credo che un utente in transazione possa bloccare gli altri.
Ciao 

 Ciao
Visto che anche tu resti nel campo delle ipotesi allora posso dire che la 
mia ipotesi è che in questo o tutto o niente sia compresa anche la scrittura 
sul db che dovrebbe risolvere il problema posto..
..io un tentativo lo farei..
..magari con delle istruzioni di prova e senza aggiornare subito tutto il 
programma..
..poi magari Barzo@Google se vuoi farci sapere come va..
Ciao,
    Diego 

 programma..
Un po' di tempo fa ho scritto un ActiveX exe che faceva da motore server per 
gli mdb.
Cioč messo su un PC "server" tutti i comandi da e per l'mdb passavano da lui 
anzichč direttamente dal jet locale, simulando cosě una situazione 
client-server anche per access.
Se interessa e se riesco a ritrovare i sorgenti...
Ciao 

[...]
A quel punto sarebbe il caso di usare un server vero credo..
..ma chiaramente ci sono icasi in cui non si può, vero? Anche io una volta 
avevo pensto a una cosa del genere poi ho lasciato perdere ritenendo che 
fosse troppo macchinosa. Complimenti comunque!
ciao,
    Diego 

 Ciao
Di fatto il componente intermedio si occupava di gestire le transazioni
verso JET..?
Hai avuto modo di verificare casi di corruzione dati..?
In ogni caso interessa moltissimo...., anche di più.
Se poi non ti spiace lo vorrei pubblicare nel mio sito(previo
consenso).
Visto che esagero, se ci fossero alcune istruzioni per l'uso faresti
felici molti...!
Ora se vuoi mandarmici fai pure.
;-)
Grazie
@Alex