View Full Version : [VB2010] - Refresh DataTable e DataGridView
lucausa75
10-11-2010, 07:48
Salve ragazzi,
avendo a disposizione una DataTable (definita Dtb nel mio progetto) e una DataGridView; col seguente codice elimino il record X selezionato nella griglia:
Dim Cmd As OleDbCommand
Dim Valore_ID As Long
Cmd = New OleDbCommand
Try
'Cnn.Open()
Cmd.Connection = Cnn
Valore_ID = Dtb.Rows(Riga).Item(0)
Cmd.CommandText = "DELETE FROM [" & Tabella & "] WHERE [" & Dtb.Columns(0).ColumnName & "]=" & Valore_ID & ""
cmd.ExecuteNonQuery()
Cnn.Close()
MsgBox("Record deleted Successfully.", , "Delete Record")
Catch ex As Exception
MsgBox(ex.Message.ToString)
End Try
Cnn.Close()
Il mio problema è come effettuare un refresh della DataTable e della DataGridView ad esso collegata in quanto una volta eliminato il record questo rimane ancora visibile e selezionato nella griglia.
Se chiudo e riapro il mio programma questo record, giustamente, manca
:confused:
Grazie
dopo l'eliminazione svuota la datagrid e ricarica i dati dal db :D
lucausa75
10-11-2010, 10:46
dopo l'eliminazione svuota la datagrid e ricarica i dati dal db :D
Con questo codice svuoto la griglia:
dgvBiblioteca.DataBindings.Clear()
dgvBiblioteca.DataSource = Nothing
dgvBiblioteca.DataMember = Nothing
dgvBiblioteca.Rows.Clear()
dgvBiblioteca.Refresh()
e con questo carico il DataSource
dgvBiblioteca.DataSource = Dtb
ma nulla come se il DataTable non effettua alcun Refresh :confused:
Con questo codice svuoto la griglia:
dgvBiblioteca.DataBindings.Clear()
dgvBiblioteca.DataSource = Nothing
dgvBiblioteca.DataMember = Nothing
dgvBiblioteca.Rows.Clear()
dgvBiblioteca.Refresh()
e con questo carico il DataSource
dgvBiblioteca.DataSource = Dtb
ma nulla come se il DataTable non effettua alcun Refresh :confused:
allora di solito io rieseguo la query per il datatable e poi la associo al datasource. Facendo così come sopra non si aggiorna perchè tu devi aggiornare il dtb quindi devi ricaricare di nuovo tutti i dati
lucausa75
10-11-2010, 15:05
allora di solito io rieseguo la query per il datatable e poi la associo al datasource. Facendo così come sopra non si aggiorna perchè tu devi aggiornare il dtb quindi devi ricaricare di nuovo tutti i dati
...non esiste un metodo Refresh per il DataTable da poter richiamare?
E' impossibile che per ogni eliminazione debbo ricaricare il DataTable...:confused:
...non esiste un metodo Refresh per il DataTable da poter richiamare?
E' impossibile che per ogni eliminazione debbo ricaricare il DataTable...:confused:
Se l'operazione viene effettuata a livello di DataTable, puoi provare a refreshare solo il DataGridView, che espone un metodo Refresh().
Ma forse era meglio fare il percorso inverso, ossia popolare il DataGridView in modalità disconnessa. Quando un utente esegue un'operazione, come la Delete, prima ti pigli l'id della riga, e poi aggiorni tu il DB con un semplice Command. In questo modo elimini alla radice ogni problema di refresh... ;)
lucausa75
11-11-2010, 11:33
Se l'operazione viene effettuata a livello di DataTable, puoi provare a refreshare solo il DataGridView, che espone un metodo Refresh().
Ma forse era meglio fare il percorso inverso, ossia popolare il DataGridView in modalità disconnessa. Quando un utente esegue un'operazione, come la Delete, prima ti pigli l'id della riga, e poi aggiorni tu il DB con un semplice Command. In questo modo elimini alla radice ogni problema di refresh... ;)
...sono un pò confuso;
questo è il codice con cui elimino il record e all'interno mi daresti una diritta su come e dove posizionare le righe di codice per far ciò che mi consigli?
Dim Cmd As OleDbCommand
Dim Valore_ID As Long
Cmd = New OleDbCommand
Try
'Cnn.Open()
Cmd.Connection = Cnn
Valore_ID = Dtb.Rows(Riga).Item(0)
Cmd.CommandText = "DELETE FROM [" & Tabella & "] WHERE [" & Dtb.Columns(0).ColumnName & "]=" & Valore_ID & ""
cmd.ExecuteNonQuery()
Cnn.Close()
MsgBox("Record deleted Successfully.", , "Delete Record")
Catch ex As Exception
MsgBox(ex.Message.ToString)
End Try
Cnn.Close()
Grazie
Bah, non è che quel codice mi entusiasmi poi molto... :O
Inoltre non sono d'accordo sulla costruzione della stringa sql. Se proprio vuoi, usa almeno i parameters !
Personalmente la risolverei in modo molto più agile.
1. Eseguo il Binding tra il DataGridView e il DataSet "DS" ( o DataTable che sia ), precedentemente "fillato" con apposito Adapter "DA" :
DA.Fill(DS)
DataGridView1.DataSource = DS.Tables(0)
2. A questo punto inserisco un pulsante unico di "Applica Modifiche", che contiene tutta la gestione di tutte le possibili azioni che un utente può fare su una o anche più righe contemporaneamente, mediante un OleDbCommandBuilder, che esiste proprio per questo :
Private Sub cmd_applica_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_applica.Click
If DS.HasChanges() Then
Using CB As New OleDb.OleDbCommandBuilder(DA)
DA.UpdateCommand = CB.GetUpdateCommand
DA.InsertCommand = CB.GetInsertCommand
DA.DeleteCommand = CB.GetDeleteCommand
DA.Update(DS)
End Using
DS.AcceptChanges()
MsgBox("Modifiche Salvate", MsgBoxStyle.Information, "OK")
End If
End Sub
E il gioco è fatto : gestisce tutto in un colpo solo ed evita virtualmente ogni problema di refresh. ;)
lucausa75
12-11-2010, 10:44
Bah, non è che quel codice mi entusiasmi poi molto... :O
Inoltre non sono d'accordo sulla costruzione della stringa sql. Se proprio vuoi, usa almeno i parameters !
Personalmente la risolverei in modo molto più agile.
1. Eseguo il Binding tra il DataGridView e il DataSet "DS" ( o DataTable che sia ), precedentemente "fillato" con apposito Adapter "DA" :
DA.Fill(DS)
DataGridView1.DataSource = DS.Tables(0)
2. A questo punto inserisco un pulsante unico di "Applica Modifiche", che contiene tutta la gestione di tutte le possibili azioni che un utente può fare su una o anche più righe contemporaneamente, mediante un OleDbCommandBuilder, che esiste proprio per questo :
Private Sub cmd_applica_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_applica.Click
If DS.HasChanges() Then
Using CB As New OleDb.OleDbCommandBuilder(DA)
DA.UpdateCommand = CB.GetUpdateCommand
DA.InsertCommand = CB.GetInsertCommand
DA.DeleteCommand = CB.GetDeleteCommand
DA.Update(DS)
End Using
DS.AcceptChanges()
MsgBox("Modifiche Salvate", MsgBoxStyle.Information, "OK")
End If
End Sub
E il gioco è fatto : gestisce tutto in un colpo solo ed evita virtualmente ogni problema di refresh. ;)
Grazie del tuo aiuto ma sono nuovo di VB2010 e di Oledb.
Se volessi abbinare il tuo codice al mio da dove dovrei iniziare?
Non mi è chiaro il concetto del binding...:confused:
Grazie del tuo aiuto ma sono nuovo di VB2010 e di Oledb.
Se volessi abbinare il tuo codice al mio da dove dovrei iniziare?
Non mi è chiaro il concetto del binding...:confused:
No, la mia soluzione è totalmente alternativa. Non può essere "integrata" con la tua. Il Binding lo si esegue semplicemente con quel DataGridView1.DataSource. A quel punto ogni modifica dell'utente a livello di UI ( sul DataGridView ) si riflette sul DataSet DS ( o DataTable, il concetto è lo stesso ).
Perciò per applicare le modifiche al DB, basta controllare se DS "HasChanges" e agire come nel secondo blocco di codice che ho postato.
Secondo me è molto meglio come soluzione, ed anche più elegante, piuttosto che stare a gestire ogni possibile azione dell'utente separatamente... ;)
lucausa75
13-11-2010, 12:40
No, la mia soluzione è totalmente alternativa. Non può essere "integrata" con la tua. Il Binding lo si esegue semplicemente con quel DataGridView1.DataSource. A quel punto ogni modifica dell'utente a livello di UI ( sul DataGridView ) si riflette sul DataSet DS ( o DataTable, il concetto è lo stesso ).
Perciò per applicare le modifiche al DB, basta controllare se DS "HasChanges" e agire come nel secondo blocco di codice che ho postato.
Secondo me è molto meglio come soluzione, ed anche più elegante, piuttosto che stare a gestire ogni possibile azione dell'utente separatamente... ;)
Ho cercato delle prove e questo è alla fine il codice che ne è venuto fuori:
Sub Eliminazione()
Adapter.Fill(Ds)
Ds.Tables(0).Rows(Riga).Delete()
Riga = 0
dgvBiblioteca.DataSource = Ds.Tables(0)
If Ds.HasChanges = True Then
Using CB As New OleDb.OleDbCommandBuilder(Adapter)
Adapter.UpdateCommand = CB.GetUpdateCommand
Adapter.InsertCommand = CB.GetInsertCommand
Adapter.DeleteCommand = CB.GetDeleteCommand
Adapter.Update(Ds)
End Using
Ds.AcceptChanges()
MsgBox("Modifiche Salvate", MsgBoxStyle.Information, "OK")
End If
End Sub
ma con questo errore:
http://img408.imageshack.us/img408/8268/immaginezl.th.png (http://img408.imageshack.us/i/immaginezl.png/)
:confused: :confused: :confused:
lucausa75
13-11-2010, 14:49
...per ultimo ho provato questo codice:
Dim Cmd As New OleDbCommand("DELETE FROM [" & Tabella & "] WHERE [" & Ds.Tables(Tabella).Columns(0).ColumnName & "]=" & Valore_ID & "", Cnn)
Dim Adp As New OleDbDataAdapter
Adp.SelectCommand = Cmd
Dim Dst As New DataSet(Tabella)
Adp.Fill(Dst)
Dst.Tables(Tabella).Rows(Riga).Delete()
Riga = 0
Adp.Update(Dst)
ma ho questo errore: :confused:
http://img403.imageshack.us/img403/3967/immaginebf.th.png (http://img403.imageshack.us/i/immaginebf.png/)
:confused: :confused: :confused:
lucausa75
14-11-2010, 13:00
...ancora quest'altro codice
CnnString = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & AppPath() & DB & ";Jet OLEDB:Database Password=" & PW
Conn = New OleDbConnection(CnnString)
StrSql = "DELETE * FROM [" & Tabella & "] WHERE [" & Ds.Tables(Tabella).Columns(0).ColumnName & "]=" & Valore_ID & ""
Conn.Open()
Adapter = New OleDbDataAdapter(StrSql, Conn)
Adapter.Fill(Ds, Tabella)
Adapter.Update(Ds, Tabella)
With MyGrid
.DataSource = Ds.Tables(Tabella).DefaultView
End With
ma la DataGridView non si aggiorna :muro: :muro: :muro:
No, non ci siamo. Non devi cercare di fondere le due soluzioni assieme. Si fa solo un gran casino.
La prima tua soluzione è inutile. Non serve fare il Fill dell'Adapter sul DataSet tutte le volte che un utente fa una Delete...
Il secondo codice è per me incomprensibile : se usi un semplice Command, a quel punto non serve a nulla un DataSet... :confused:
Se vuoi usare la MIA soluzione devi solo aggiungere un pulsante di "Applica Modifiche", collegare il DataGridView al DataSet ( Binding... ), lasciare che l'utente faccia le sue operazioni, e applicarle al DB come ho illustrato.
Se vuoi usare la TUA soluzione, è tutta un'altra cosa : allora popolerai il DataGridView in modalità disconnessa, e poi ti vai a gestire una per una le possibili azioni : Update-Delete-Insert... Che è sicuramente più prolissa e meno elegante, come cosa.
Una qualsiasi combinazione di queste due "soluzioni-tipo" è per me superflua, è uno spreco di risorse di calcolo, e inoltre porta ad errori, come infatti ti è successo.
Spero di essere stato un po' più chiaro... ;)
lucausa75
14-11-2010, 13:13
No, non ci siamo. Non devi cercare di fondere le due soluzioni assieme. Si fa solo un gran casino.
La prima tua soluzione è inutile. Non serve fare il Fill dell'Adapter sul DataSet tutte le volte che un utente fa una Delete...
Il secondo codice è per me incomprensibile : se usi un semplice Command, a quel punto non serve a nulla un DataSet... :confused:
Se vuoi usare la MIA soluzione devi solo aggiungere un pulsante di "Applica Modifiche", collegare il DataGridView al DataSet ( Binding... ), lasciare che l'utente faccia le sue operazioni, e applicarle al DB come ho illustrato.
Se vuoi usare la TUA soluzione, è tutta un'altra cosa : allora popolerai il DataGridView in modalità disconnessa, e poi ti vai a gestire una per una le possibili azioni : Update-Delete-Insert... Che è sicuramente più prolissa e meno elegante, come cosa.
Una qualsiasi combinazione di queste due "soluzioni-tipo" è per me superflua, è uno spreco di risorse di calcolo, e inoltre porta ad errori, come infatti ti è successo.
Spero di essere stato un po' più chiaro... ;)
Intanto grazie per la tua pazienza ;)
Mi sento molto confuso in quanto cose che prima riuscivo a farle ad occhi chiusi adesso mi vengono complicatissime.
Ciò che voglio realizzare è proprio quello di dare la possibilità all'utente tramite alcuni bottoni di fare l'inserimento, l'aggiornamento o la eliminazione del record selezionato nel DataGridView.
1) Come popolare il DataGridView in modalità disconnessa?
Non basta che nel form load lo popolo collegandolo al mio DatSet?
2) Come gestire una per una le possibili azioni : Update-Delete-Insert?
Debbo lavorare sullo stesso DataSet o debbo utilizzare un DataTable, un DataReader o simili...?:confused:
lucausa75
19-11-2010, 10:36
Salve ragazzi,
alla fine ho risolto così:
Private Sub Aggiornamento(ByVal MyGrid As DataGridView)
Try
Dim Cnn As New OleDb.OleDbConnection(CnnString)
Cnn.Open()
Adp.UpdateCommand = Cnn.CreateCommand
Adp.UpdateCommand.CommandText = StrSQL
Adp.UpdateCommand.ExecuteNonQuery()
Me.Cursor = Cursors.Default
MsgBox("Record aggiornato con successo", MsgBoxStyle.Information, NomeApplicazione)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
Dst.Clear()
Adp.Fill(Dst)
MyGrid.DataSource = Dst.Tables(0)
End Sub
Private Sub Eliminazione(ByVal MyGrid As DataGridView)
Try
Dim Cnn As New OleDb.OleDbConnection(CnnString)
Cnn.Open()
Adp.DeleteCommand = Cnn.CreateCommand
Adp.DeleteCommand.CommandText = "DELETE * FROM [" & Tabella & "] WHERE [" & Dst.Tables(0).Columns(0).ColumnName & "]=" & Valore_ID & ""
Adp.DeleteCommand.ExecuteNonQuery()
Me.Cursor = Cursors.Default
MsgBox("Record eliminato con successo", MsgBoxStyle.Information, NomeApplicazione)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
Dst.Clear()
Adp.Fill(Dst)
MyGrid.DataSource = Dst.Tables(0)
End Sub
Private Sub Inserimento(ByVal MyGrid As DataGridView)
Try
Dim Cnn As New OleDb.OleDbConnection(CnnString)
Cnn.Open()
Adp.InsertCommand = Cnn.CreateCommand
Adp.InsertCommand.CommandText = StrSQL
Adp.InsertCommand.ExecuteNonQuery()
Me.Cursor = Cursors.Default
MsgBox("Record inserito con successo", MsgBoxStyle.Information, NomeApplicazione)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
Dst.Clear()
Adp.Fill(Dst)
MyGrid.DataSource = Dst.Tables(0)
End Sub
Noooo... :doh: :D
Vabbeh, Luca. Contento te...
lucausa75
19-11-2010, 11:25
Noooo... :doh: :D
Vabbeh, Luca. Contento te...
..sicuramente sei contraio al fill ripetuto vero?
Però ho preso spunto un pò dal tuo codice :D e per ciò ti ringrazio!
Troverò una via alternativa e quindi snellirò il progetto.
Invece perchè non dai un'occhiata all'altro mio thread?
..sicuramente sei contraio al fill ripetuto vero?
Però ho preso spunto un pò dal tuo codice :D e per ciò ti ringrazio!
Troverò una via alternativa e quindi snellirò il progetto.
Invece perchè non dai un'occhiata all'altro mio thread?
Diciamo che non sono d'accordo in generale sull'impostazione di quella Form. Adesso vedendo l'immagine che hai postato sull'altro Thread ho capito perchè trovavi tanto ostica la mia soluzione.
E' soprattutto questione di "stile personale", perciò non è una critica.
Almeno questo però non farlo ! :
Adp.DeleteCommand.CommandText = "DELETE * FROM [" & Tabella & "] WHERE [" & Dst.Tables(0).Columns(0).ColumnName & "]=" & Valore_ID & ""
:D
lucausa75
19-11-2010, 13:18
Diciamo che non sono d'accordo in generale sull'impostazione di quella Form. Adesso vedendo l'immagine che hai postato sull'altro Thread ho capito perchè trovavi tanto ostica la mia soluzione.
E' soprattutto questione di "stile personale", perciò non è una critica.
Almeno questo però non farlo ! :
Adp.DeleteCommand.CommandText = "DELETE * FROM [" & Tabella & "] WHERE [" & Dst.Tables(0).Columns(0).ColumnName & "]=" & Valore_ID & ""
:D
Cmq anche se la tua fosse una critica è sicuramente costruttiva e io la prendo per buona!
Che ben vengano le tue pseudo "critiche" perchè sono state molto produttive!
Non capisco perchè non debbo fare:
Adp.DeleteCommand.CommandText = "DELETE * FROM [" & Tabella & "] WHERE [" & Dst.Tables(0).Columns(0).ColumnName & "]=" & Valore_ID & ""
Come elimino il record?
Non capisco perchè non debbo fare:
Adp.DeleteCommand.CommandText = "DELETE * FROM [" & Tabella & "] WHERE [" & Dst.Tables(0).Columns(0).ColumnName & "]=" & Valore_ID & ""
Come elimino il record?
In quel caso specifico non sei molto esposto in quanto concateni solo un valore ID, che è un semplice numero intero.
Ma quel "ColumnName", ad esempio, potrebbe sempre contenere parole o caratteri tali da creare un bel casino !
Prima ti liberi di quel sistema, meglio è.
Ancora non ho aggiornato la mia pagina FB con tutte le soluzioni che voglio pubblicare. Ma c'è, mi pare proprio in questo Forum, una discussione piuttosto completa in cui davo consigli sugli OleDbParameters...
Dato che in questi giorni le sto facendo passare, appena la trovo la metto sulla mia pagina... "Stay tuned"... ;) :D
lucausa75
19-11-2010, 13:33
In quel caso specifico non sei molto esposto in quanto concateni solo un valore ID, che è un semplice numero intero.
Ma quel "ColumnName", ad esempio, potrebbe sempre contenere parole o caratteri tali da creare un bel casino !
Prima ti liberi di quel sistema, meglio è.
Ancora non ho aggiornato la mia pagina FB con tutte le soluzioni che voglio pubblicare. Ma c'è, mi pare proprio in questo Forum, una discussione piuttosto completa in cui davo consigli sugli OleDbParameters...
Dato che in questi giorni le sto facendo passare, appena la trovo la metto sulla mia pagina... "Stay tuned"... ;) :D
Ottimo Marco ;)
lucausa75
24-11-2010, 10:26
Carissimi,
ho notato che se da questo codice di eliminazione Record:
Private Sub Eliminazione(ByVal MyGrid As DataGridView)
Try
Dim Cnn As New OleDb.OleDbConnection(CnnString)
Cnn.Open()
Adp.DeleteCommand = Cnn.CreateCommand
Adp.DeleteCommand.CommandText = "DELETE * FROM [" & Tabella & "] WHERE [" & Dst.Tables(0).Columns(0).ColumnName & "]=" & Valore_ID & ""
Adp.DeleteCommand.ExecuteNonQuery()
Me.Cursor = Cursors.Default
MsgBox("Record eliminato con successo", MsgBoxStyle.Information, NomeApplicazione)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
Dst.Clear()
Adp.Fill(Dst)
MyGrid.DataSource = Dst.Tables(0)
End Sub
escludo la riga di codice relativa la message box
MsgBox("Record eliminato con successo", MsgBoxStyle.Information, NomeApplicazione)
l'eliminazione avviene ma solo alla seconda richiamata della sub
:confused:
lucausa75
24-11-2010, 16:15
Carissimi,
ho notato che se da questo codice di eliminazione Record:
Private Sub Eliminazione(ByVal MyGrid As DataGridView)
Try
Dim Cnn As New OleDb.OleDbConnection(CnnString)
Cnn.Open()
Adp.DeleteCommand = Cnn.CreateCommand
Adp.DeleteCommand.CommandText = "DELETE * FROM [" & Tabella & "] WHERE [" & Dst.Tables(0).Columns(0).ColumnName & "]=" & Valore_ID & ""
Adp.DeleteCommand.ExecuteNonQuery()
Me.Cursor = Cursors.Default
MsgBox("Record eliminato con successo", MsgBoxStyle.Information, NomeApplicazione)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
Dst.Clear()
Adp.Fill(Dst)
MyGrid.DataSource = Dst.Tables(0)
End Sub
escludo la riga di codice relativa la message box
MsgBox("Record eliminato con successo", MsgBoxStyle.Information, NomeApplicazione)
l'eliminazione avviene ma solo alla seconda richiamata della sub
:confused:
...dopo numerose prove pare che l'eliminazione di queste righe di codice risolve il problema
Try
Catch ex As Exception
MsgBox(ex.ToString)
Finally
End Try
E' un comportamento strano, su una tecnica che non utilizzo mai ( eh eh :D )...
Ma perchè concateni una stringa vuota in :
& Valore_ID & ""
:confused:
lucausa75
24-11-2010, 16:44
E' un comportamento strano, su una tecnica che non utilizzo mai ( eh eh :D )...
Ma perchè concateni una stringa vuota in :
& Valore_ID & ""
:confused:
...Valore_ID non è vuota!
...Valore_ID non è vuota!
No, intendevo dire DOPO Valore_ID :
& Valore_ID & ""
lucausa75
25-11-2010, 06:13
No, intendevo dire DOPO Valore_ID :
& Valore_ID & ""
...si mi erano scappati gli apici :D
lucausa75
26-11-2010, 20:11
...un consiglio.
Al fine di evitare connessioni aperte inultimente o oggetti da "resettare" dopo le operazioni di Aggiornamento, Eliminazione e Inserimento ho inserito queste righe di codice:
Cnn.Close()
Cnn.Dispose()
dove Cnn è dichiarata a livello di form Dim Cnn As New OleDb.OleDbConnection però rimangono ancora da chiudere e/o resettare
Dim Adp As New OleDb.OleDbDataAdapter
Dim Comm As New OleDb.OleDbCommand
Dim Dst As New DataSet
che risultano dichiarati a livello di form.
Dove è consigliabile resettare il tutto?
Penso il bottone esci sia il maggiore indiziato giusto?
Grazie ancora!
Se sono dichiarati a livello di Form, e penso riutilizzati in vari metodi del Form stesso, appena prima dell'uscita dal Form.
E il buon Garbage Collector farà il resto.
Io sono però dell'idea che bisognerebbe farsi una classe che serva a gestire connessioni e operazioni su DB, che magari implementa l'interfaccia IDisposable e che una volta distrutta ( magari utilizzandola in un blocco Using ) si porta via con sè tutto in un colpo solo... ;)
lucausa75
26-11-2010, 21:09
Se sono dichiarati a livello di Form, e penso riutilizzati in vari metodi del Form stesso, appena prima dell'uscita dal Form.
E il buon Garbage Collector farà il resto.
Io sono però dell'idea che bisognerebbe farsi una classe che serva a gestire connessioni e operazioni su DB, che magari implementa l'interfaccia IDisposable e che una volta distrutta ( magari utilizzandola in un blocco Using ) si porta via con sè tutto in un colpo solo... ;)
...leggendo i tuoi consigli mi rendo conto che ho molto da studiare ancora!
:D
Cmq, come da tuo consiglio, chiuderò tutto nella gestione del codice del bottone ESCI ;)
lucausa75
12-12-2010, 17:10
...un consiglio.
Al fine di evitare connessioni aperte inultimente o oggetti da "resettare" dopo le operazioni di Aggiornamento, Eliminazione e Inserimento ho inserito queste righe di codice:
Cnn.Close()
Cnn.Dispose()
dove Cnn è dichiarata a livello di form Dim Cnn As New OleDb.OleDbConnection però rimangono ancora da chiudere e/o resettare
Dim Adp As New OleDb.OleDbDataAdapter
Dim Comm As New OleDb.OleDbCommand
Dim Dst As New DataSet
che risultano dichiarati a livello di form.
Dove è consigliabile resettare il tutto?
Penso il bottone esci sia il maggiore indiziato giusto?
Grazie ancora!
...riportando in alto questo argomento quindi che istruzioni uso per chiudere e disconnettere i seguenti oggetti così dichiarati?
Dim Cnn As New OleDb.OleDbConnection
Dim Adp As New OleDb.OleDbDataAdapter
Dim Dst As New DataSet
Cnn.Close()
Cnn.Dispose()
Adp.Dispose()
Dst.Dispose()
lucausa75
13-12-2010, 18:01
Cnn.Close()
Cnn.Dispose()
Adp.Dispose()
Dst.Dispose()
Ottimo :D
quindi una Sub del genere direi che va più che bene giusto?
Public Sub ChiusuraConnessioni(ByVal MyComm As OleDb.OleDbCommand, ByVal MyCnn As OleDb.OleDbConnection, ByVal MyADP As OleDb.OleDbDataAdapter, ByVal MyDST As DataSet)
If IsNothing(MyComm) = False Then
MyComm.Dispose()
End If
If IsNothing(MyCnn) = False Then
MyCnn.Close()
MyCnn.Dispose()
End If
If IsNothing(MyADP) = False Then
MyADP.Dispose()
End If
If IsNothing(MyDST) = False Then
MyDST.Dispose()
End If
End Sub
Sì. Può avere un suo perchè... ;)
lucausa75
14-12-2010, 14:01
Sì. Può avere un suo perchè... ;)
Grazie MarcoGG sei stato utilissimo...
preparati alla fase di passaggio ai parameters :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.