Multithreading e DB

mercoledì 05 dicembre 2007 - 12.51

gennyfor Profilo | Junior Member

[vb 2005 .net]
Già ho letto qualcosa al riguardo e a quanto pare è un problema molto comune, ma nn sono riuscito a trovare la soluzione.....
Ho questa subroutine x un backgroundworker che mi carica degli articoli su un trhead separato, mentre l'applicazione principale continua a funzionare....Ovviamente ciò non mi funziona
Il programma si inceppa all'assegnazione della connessione al comando (recupera.Connection = connection)
La connessione viene persa.......qualcuno sa il perchè????

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
CheckForIllegalCrossThreadCalls = False
ProgressBar.Show()
Dim recupera As New OleDbCommand
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
CheckForIllegalCrossThreadCalls = False
ProgressBar.Show()
Dim recupera As New OleDbCommand
recupera.Connection = connection
recupera.CommandText = "SELECT codice,descrizion FROM [data$]"
Dim recuperar As OleDbDataReader = recupera.ExecuteReader
If recuperar.HasRows Then

Dim i As Integer = 0
Do While recuperar.Read
ListView1.Items.Add("", i)
ListView1.Items(i).SubItems.Add(recuperar.GetString(0))
ListView1.Items(i).SubItems.Add(recuperar.GetString(1))
i = i + 1
ProgressBar.Increment(1)
Loop
recuperar.Close()
ProgressBar.Value = 7000
ProgressBar.Hide()
Label1.Text = "Articoli presenti: " & ListView1.Items.Count
Else : MessageBox.Show("Non vi sono articoli presenti nel database", "Attenzione", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If

Grazie in anticipo

lbenaglia Profilo | Guru

>Il programma si inceppa all'assegnazione della connessione al
>comando (recupera.Connection = connection)
>La connessione viene persa.......qualcuno sa il perchè????

connection dove è definita?

>Grazie in anticipo
Prego

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

gennyfor Profilo | Junior Member

in un modulo a parte comprso nel progetto... Ah non ho scritto che se eseguivo tutto su un solo trhead funzionava...
la connection è definita come Public

lbenaglia Profilo | Guru

>in un modulo a parte comprso nel progetto... Ah non ho scritto
>che se eseguivo tutto su un solo trhead funzionava...
>la connection è definita come Public

E dove la apri?
Probabilmente ogni thread non è in grado di condividere una connessione aperta da un altro thread, ma deve aprirne una nuova...

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

gennyfor Profilo | Junior Member

acc..............mi sa che è proprio cosi.............
si perchè la connessione viene comnque aperta nel thread principale, quando viene caricato il main form della applicazione, è probabilmente c'e questa sorta di incompatibilità fra i vari thread, va bè grazie lo stesso devo risolvere diversamente

lbenaglia Profilo | Guru

>acc..............mi sa che è proprio cosi.............
>si perchè la connessione viene comnque aperta nel thread principale,
>quando viene caricato il main form della applicazione, è probabilmente
>c'e questa sorta di incompatibilità fra i vari thread, va bè
>grazie lo stesso devo risolvere diversamente

Per massimizzare la scalabilità della tua applicazione, appesantendo il meno possibile sia il client ma soprattutto il server, è opportuno aprire le connessioni solo per lo stretto tempo necessario a richiedere i dati e a sottomettere le modifiche.
Quindi potrai risolvere facilmente il problema aprendo e chiudendo le connessioni in ogni procedura che effettua un accesso al DBMS.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5