Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Eccezione ContextSwitchDeadlock durante copia di dati da Access a SQLS...
mercoledì 13 aprile 2011 - 12.17
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
Elenco Tags
VB.NET
|
.NET 2.0
|
Windows XP
|
Visual Studio 2005
|
SQL Server Express
|
Access (.mdb)
Barabas
Profilo
| Junior Member
102
messaggi | Data Invio:
mer 13 apr 2011 - 12:17
Salve,
ho un'applicazione realizzata in vb.net che salva dati su un database access.
il db ha un'unica tabella con le colonne data-ora, provenienza, valore.
le righe della tabella variano da 20.000 a 500.000.
volevo passare a SQLServer Express 2005.
ho modificato l'applicazione vb.net e funziona.
ho pensato di aggiungere all'applicazione vb.net una funzione per copiare i dati da Access a SQLServer.
leggo tutto il contenuto della tabella access, e una riga alla volta controllo se non è già presente nel sb sql e nel caso manchi la inserisco.
durante il debug dopo circa 20.000 righe inserite va in eccezione ContextSwitchDeadlock. (incollo alla fine il testo che è lungo)
se non faccio il controllo di presenza riga non vi sono eccezioni e tutti le righe vengono copiate, anche se duplicate.
vorrei chiedere 2 cose:
1) qual è il metodo più giusto per copiare grandi quantità di dati da un db all'altro evitando duplicazioni di righe
2) cos'è questa eccezione e perchè viene generata...
la mia applicazione non usa thread, e l'unica operazione in corso al momento dell'eccezione era la copia dei dati, e l'eccezione non è stata rilevata dai blocchi try catch preposti.
ecco il testo dell'eccezione:
ContextSwitchDeadlock è stata rilevata
Message: Impossibile eseguire la transizione dal contesto COM 0x1a1318 al contesto COM 0x1a1488 per 60 secondi. Probabilmente il thread a cui appartiene il contesto/apartment di destinazione è impegnato nell'attesa senza distribuzione o nell'elaborazione di un'operazione a esecuzione prolungata che non prevede la distribuzione di messaggi Windows. Questa situazione in genere ha un impatto negativo sulle prestazioni e può causare una mancata risposta dall'applicazione o un accumulo continuato nel tempo dell'utilizzo della memoria. Per evitare questo problema, è necessario che durante le operazioni a esecuzione prolungata tutti i thread in modalità STA (Single Thread Apartment) utilizzino primitive di attesa con distribuzione (ad esempio CoWaitForMultipleHandles) e messaggi distribuiti in base a routine.
e un esempio semplificato del codice che causa il problema:
...
Dim Rcommand As New OleDbCommand("Select dataora,provenienza,valore from tabella", connessioneAccess)
Dim rdr As OleDbDataReader
rdr = Rcommand.ExecuteReader
connessioneSQL .Open()
While rdr.Read
(...Leggo dataora...)
(...Leggo provenienza...)
Dim SQLcomm As New SqlCommand("select * from tabella where dataora=... and provenienza=.... " , connessioneSQL)
Dim SQLrdr As SqlDataReader
SQLrdr = SQLcomm.ExecuteReader
If Not SQLrdr.HasRows Then
....Insert ....
End If
SQLrdr.Close()
SQLcomm.Dispose()
End While
...
Grazie in anticipo
Saluti
Barabas
Barabas
Torna su
Stanze Forum
Elenco Threads
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?
Dopo esserti registrato potrai chiedere
aiuto sul nostro
Forum
oppure aiutare gli altri
Consulta le
Stanze
disponibili.
Registrati ora !