Eccezione ContextSwitchDeadlock durante copia di dati da Access a SQLS...

mercoledì 13 aprile 2011 - 11.44
Tag Elenco Tags  VB.NET  |  .NET 2.0  |  Windows XP  |  Visual Studio 2005  |  SQL Server Express  |  Access (.mdb)

Barabas Profilo | Junior Member

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
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 !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5