Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Sono molte le novità che ASUS ha scelto di presentare al CES 2026 di Las Vegas, partendo da una gamma di soluzioni NUC con varie opzioni di processore passando sino agli schermi gaming con tecnologia OLED. Il tutto senza dimenticare le periferiche di input della gamma ROG e le soluzioni legate alla connettività domestica
Le novità ASUS per il 2026 nel settore dei PC desktop
Le novità ASUS per il 2026 nel settore dei PC desktop
Molte le novità anticipate da ASUS per il 2026 al CES di Las Vegas: da schede madri per processori AMD Ryzen top di gamma a chassis e ventole, passando per i kit di raffreddamento all in one integrati sino a una nuova scheda video GeForce RTX 5090. In sottofondo il tema dell'intelligenza artificiale con una workstation molto potente per installazioni non in datacenter
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-05-2011, 17:54   #1
jackk87
Senior Member
 
Iscritto dal: Jan 2007
Messaggi: 404
[VB.NET] Problema rilascio instanza excel con backgroundworker..

Buongiorno a tutti,
dalla mia applicazione vb devo importare i dati di un file excel che contiene i comuni quindi circa 10000 record.
L'importazione la eseguo tramite il backgroundworker in modo che l'applicazione non si blocchi. L'importazione funziona correttamente solo che al termine della stessa mi rimane il processo di excel in memoria (task manager) e non viene rilasciato.

il codice che uso è:
Codice:
Private Sub ImportaFileExcel()
        Dim FileExcel As Microsoft.Office.Interop.Excel.Workbook
        Dim FoglioExcel As Microsoft.Office.Interop.Excel.Worksheet

        Try
            FileExcel = excelApp.Workbooks.Open(tbDirectory.Text) 'cartella di lavoro Excel

            excelApp.Visible = False 'Nascondo l'applicazione Excel
            FileExcel.Activate() 'Attivo il file
            FoglioExcel = FileExcel.Worksheets(1) 'Seleziono il primo foglio

            Dim numcolonna As Integer = 1 'Variabile per scansionare tutte le colonne
            Dim ColonnaComune As Integer = 0 'Variabile per memorizzare la colonna del Comune
            Dim ColonnaCap As Integer = 0 'Variabile per memorizzare la colonna del Cap
            Dim ColonnaProvincia As Integer = 0 'Variabile per memorizzare la colonna della Provincia

            'Ciclo per trovare gli indici di colonna
            For numcolonna = 1 To 50
                If FoglioExcel.Cells(1, numcolonna).value = "Descrizione" Then
                    ColonnaComune = numcolonna
                ElseIf FoglioExcel.Cells(1, numcolonna).value = "CAP" Then
                    ColonnaCap = numcolonna
                ElseIf FoglioExcel.Cells(1, numcolonna).value = "Codice_Provincia" Then
                    ColonnaProvincia = numcolonna
                End If
                If (FoglioExcel.Cells(1, numcolonna).value = Nothing) And (ColonnaComune <> 0) And (ColonnaCap <> 0) And (ColonnaProvincia <> 0) Then
                    Exit For
                End If
            Next

            If ColonnaCap = 0 Or ColonnaComune = 0 Or ColonnaProvincia = 0 Then
                FoglioExcel = Nothing
                FileExcel.Close(False)
                FileExcel = Nothing
                excelApp.Quit()
                excelApp = Nothing

                MessageBox.Show("Errore: Impossibile trovare le colonne interessate (Descrizione,CAP,Codice_Provincia)..", "Ricerca colonne nel file excel", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

                ErroreColonne = True
                Exit Sub
            End If

            Dim numriga As Integer = 2 'Variabile per scansionare tutte le riche
            Dim Comune, Cap, Provincia As String 'Variabile per memorizzare il destinatario e l'indirizzo
            Dim percentuale As Integer = 0 'Variabile per memorizzare la percentuale dell'avanzamento
            Dim numerorighe As Integer = FoglioExcel.UsedRange.Rows.Count 'Variabile che contiene il numero di righe totali
            Dim idcategoria As Integer = 0 'variabile dove memorizzo l'ID della categoria
            Dim DR As SqlDataReader

            Dim TR As SqlClient.SqlTransaction 'Variabile della Transazione SQL
            Try
                Cn.Open() 'Apro la connessione al DB

                TR = Cn.BeginTransaction(IsolationLevel.ReadCommitted) 'Inizio della Transazione
                Dim CMD As New SqlCommand("", Cn, TR) 'SqlCommand con la transazione

                'Codice SQL
                CMD.CommandText = "DELETE FROM comuni"

                CMD.ExecuteNonQuery() 'Eseguo il codice SQL

                TR.Commit() 'Effettuo le modifiche nel DB
                Cn.Close() 'Chiudo la connessione al DB
            Catch ex As Exception
                FoglioExcel = Nothing
                FileExcel.Close(False)
                FileExcel = Nothing
                excelApp.Quit()
                excelApp = Nothing
                MessageBox.Show("Errore: " & ex.Message, "Svuotamento tabella comuni nel DB", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Try
                    TR.Rollback() 'Non effettuo le modifiche nel DB mandando un errore
                Catch exRollback As Exception
                    MessageBox.Show("Errore: " & exRollback.Message, "Svuotamento tabella comuni nel DB con RollBack", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                End Try
                If Cn.State = ConnectionState.Open Then 'Se la connessione al DB è aperta
                    Cn.Close() 'Chiudo la connessione al DB
                End If
                Exit Sub
            End Try

            'Ciclo per memorizzare i dati nel DB
            For numriga = 2 To numerorighe
                Try
                    Comune = FoglioExcel.Cells(numriga, ColonnaComune).value
                    Cap = FoglioExcel.Cells(numriga, ColonnaCap).value
                    Provincia = FoglioExcel.Cells(numriga, ColonnaProvincia).value

                    If String.IsNullOrEmpty(Comune) Then
                        Exit Try
                    End If

                    Cn.Open() 'Apro la connessione al DB

                    TR = Cn.BeginTransaction(IsolationLevel.ReadCommitted) 'Inizio della Transazione
                    Dim CMD As New SqlCommand("", Cn, TR) 'SqlCommand con la transazione

                    'Codice SQL
                    CMD.CommandText = "INSERT INTO comuni(descrizione,cap,provincia) " & _
                                      "VALUES(@descrizione,@cap,@provincia)"

                    CMD.Parameters.Add("@descrizione", SqlDbType.VarChar) 'Parameters
                    CMD.Parameters.Add("@cap", SqlDbType.Int) 'Parameters
                    CMD.Parameters.Add("@provincia", SqlDbType.VarChar) 'Parameters

                    'Assegnazione Parametri :
                    CMD.Parameters("@descrizione").Value = Comune
                    If String.IsNullOrEmpty(Cap) Then
                        CMD.Parameters("@cap").Value = 0
                    Else
                        CMD.Parameters("@cap").Value = Cap
                    End If

                    If String.IsNullOrEmpty(Provincia) Then
                        CMD.Parameters("@provincia").Value = ""
                    Else
                        CMD.Parameters("@provincia").Value = Provincia
                    End If

                    CMD.ExecuteNonQuery() 'Eseguo la query

                    percentuale = percentuale + 1

                    bwImportaExcel.ReportProgress(percentuale * 100 / numerorighe)

                    TR.Commit() 'Effettuo le modifiche nel DB
                    Cn.Close() 'Chiudo la connessione al DB
                Catch ex As Exception
                    FoglioExcel = Nothing
                    FileExcel.Close(False)
                    FileExcel = Nothing
                    excelApp.Quit()
                    excelApp = Nothing
                    MessageBox.Show("Errore: " & ex.Message, "Inserimento comune importato nel DB", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    Try
                        TR.Rollback() 'Non effettuo le modifiche nel DB mandando un errore
                    Catch exRollback As Exception
                        MessageBox.Show("Errore: " & exRollback.Message, "Inserimento comune importato nel DB con RollBack", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    End Try
                    If Cn.State = ConnectionState.Open Then 'Se la connessione al DB è aperta
                        Cn.Close() 'Chiudo la connessione al DB
                    End If
                    Exit Sub
                End Try
            Next

            FoglioExcel = Nothing
            FileExcel.Close(False)
            FileExcel = Nothing
            excelApp.Quit()
            excelApp = Nothing
        Catch ex As Exception
            FoglioExcel = Nothing
            FileExcel.Close(False)
            FileExcel = Nothing
            excelApp.Quit()
            excelApp = Nothing
            MessageBox.Show("Errore: " & ex.Message, "Inserimento file Excel nel DB", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Exit Sub
        End Try
    End Sub

    '*******BACKGROUND WORKER***********
    Private Sub bwImportaExcel_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bwImportaExcel.DoWork
        ImportaFileExcel() 'Chiamo la procedura
    End Sub

    Private Sub bwImportaExcel_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bwImportaExcel.ProgressChanged
        pbPercentuale.Value = e.ProgressPercentage
        lbPercentuale.Text = e.ProgressPercentage & " %"
    End Sub

    Private Sub bwImportaExcel_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bwImportaExcel.RunWorkerCompleted
        If e.Cancelled Then
            'Una cancellazione?
            MessageBox.Show("Importazione annullata!", "Errore..", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            btSalva.Enabled = True
            btAnnulla.Enabled = True
        ElseIf e.Error IsNot Nothing Then
            'Un'eccezione?
            MessageBox.Show("Si è verificato un errore!", "Errore..", MessageBoxButtons.OK, MessageBoxIcon.Error)
            btSalva.Enabled = True
            btAnnulla.Enabled = True
        Else
            frmOpzioni.CaricaDGW_Comuni()
            If ErroreColonne = False Then
                MsgBox("Importazione effettuata con successo!", MsgBoxStyle.Information, "Avviso..")
            Else
                MessageBox.Show("Importazione annullata!", "Errore..", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            End If
            abilitachiusura = True
            Me.Close()
        End If
        bwImportaExcel.Dispose()
    End Sub
ho provato anche con oledb ma il problema rimane il codice è:
Codice:
Private Sub ImportaFileExcelConOleDB()
        Dim CnFileExcel As OleDbConnection
        Try
            CnFileExcel = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & tbDirectory.Text & ";Extended Properties='Excel 8.0'")

            Dim sql As String

            sql = "select Descrizione,CAP,Codice_Provincia from Comuni_ISTAT"

            CnFileExcel.Open()

            Dim CMDExcel As OleDbCommand = New OleDbCommand(sql, CnFileExcel)
            Dim DA As OleDbDataAdapter = New OleDbDataAdapter(CMDExcel)
            Dim DT As DataTable = New DataTable()
            DA.Fill(DT)

            CMDExcel.Dispose()

            CnFileExcel.Close()

            Dim TR As SqlClient.SqlTransaction 'Variabile della Transazione SQL
            Try
                Cn.Open() 'Apro la connessione al DB

                TR = Cn.BeginTransaction(IsolationLevel.ReadCommitted) 'Inizio della Transazione
                Dim CMD As New SqlCommand("", Cn, TR) 'SqlCommand con la transazione

                'Codice SQL
                CMD.CommandText = "DELETE FROM comuni"

                CMD.ExecuteNonQuery() 'Eseguo il codice SQL

                TR.Commit() 'Effettuo le modifiche nel DB
                Cn.Close() 'Chiudo la connessione al DB
            Catch ex As Exception
                MessageBox.Show("Errore: " & ex.Message, "Svuotamento tabella comuni nel DB", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Try
                    TR.Rollback() 'Non effettuo le modifiche nel DB mandando un errore
                Catch exRollback As Exception
                    MessageBox.Show("Errore: " & exRollback.Message, "Svuotamento tabella comuni nel DB con RollBack", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                End Try
                If Cn.State = ConnectionState.Open Then 'Se la connessione al DB è aperta
                    Cn.Close() 'Chiudo la connessione al DB
                End If
                Exit Sub
            End Try

            Dim Comune, Cap, Provincia As String 'Variabile per memorizzare il destinatario e l'indirizzo
            Dim percentuale As Integer = 0 'Variabile per memorizzare la percentuale dell'avanzamento

            For i = 0 To DT.Rows.Count - 1
                Try
                    Comune = DT.Rows(i).Item(0).ToString
                    Cap = DT.Rows(i).Item(1).ToString
                    Provincia = DT.Rows(i).Item(2).ToString

                    If String.IsNullOrEmpty(Comune) Then
                        Exit Try
                    End If

                    Cn.Open() 'Apro la connessione al DB

                    TR = Cn.BeginTransaction(IsolationLevel.ReadCommitted) 'Inizio della Transazione
                    Dim CMD As New SqlCommand("", Cn, TR) 'SqlCommand con la transazione

                    'Codice SQL
                    CMD.CommandText = "INSERT INTO comuni(descrizione,cap,provincia) " & _
                                      "VALUES(@descrizione,@cap,@provincia)"

                    CMD.Parameters.Add("@descrizione", SqlDbType.VarChar) 'Parameters
                    CMD.Parameters.Add("@cap", SqlDbType.Int) 'Parameters
                    CMD.Parameters.Add("@provincia", SqlDbType.VarChar) 'Parameters

                    'Assegnazione Parametri :
                    CMD.Parameters("@descrizione").Value = Comune
                    If String.IsNullOrEmpty(Cap) Then
                        CMD.Parameters("@cap").Value = 0
                    Else
                        CMD.Parameters("@cap").Value = Cap
                    End If

                    If String.IsNullOrEmpty(Provincia) Then
                        CMD.Parameters("@provincia").Value = ""
                    Else
                        CMD.Parameters("@provincia").Value = Provincia
                    End If

                    CMD.ExecuteNonQuery() 'Eseguo la query

                    percentuale = percentuale + 1

                    bwImportaExcel.ReportProgress(percentuale * 100 / DT.Rows.Count)

                    TR.Commit() 'Effettuo le modifiche nel DB
                    Cn.Close() 'Chiudo la connessione al DB
                Catch ex As Exception
                    MessageBox.Show("Errore: " & ex.Message, "Inserimento comune importato nel DB", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    Try
                        TR.Rollback() 'Non effettuo le modifiche nel DB mandando un errore
                    Catch exRollback As Exception
                        MessageBox.Show("Errore: " & exRollback.Message, "Inserimento comune importato nel DB con RollBack", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    End Try
                    If Cn.State = ConnectionState.Open Then 'Se la connessione al DB è aperta
                        Cn.Close() 'Chiudo la connessione al DB
                    End If
                    Exit Sub
                End Try
            Next
        Catch ex As Exception
            If CnFileExcel.State = ConnectionState.Open Then
                CnFileExcel.Close()
            End If
            MessageBox.Show("Errore: " & ex.Message, "Inserimento file Excel nel DB", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Exit Sub
        End Try
    End Sub
grazie in anticipo a tutti
jackk87 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Le novità MSI del 2026 per i videogiocatori Le novità MSI del 2026 per i videogiocato...
I nuovi schermi QD-OLED di quinta generazione di MSI, per i gamers I nuovi schermi QD-OLED di quinta generazione di...
NASA: l'equipaggio di Crew-11 rientrer&a...
CoopVoce lancia le sue prime offerte 5G:...
Rivoluzione The Elder Scrolls Online: un...
Lo strapotere cinese è evidente c...
GeForce RTX 6000: niente SUPER e attesa ...
Anche gli Stati Uniti puntano il dito co...
È cinese la prima (enorme) pala e...
A Pechino è record di giorni con ...
Lenovo al CES 2026: Qira, IA ambientale ...
Le sette startup italiane che ridefinisc...
Philips Hue SpatialAware: la configurazi...
Sport & Lifestyle: performance, dati...
Le novità HP al CES 2026 tra AI P...
Gigabyte propone OLED per tutti con lumi...
Musk contro OpenAI, la guerra arriva in ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 03:18.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v
Hardware Upgrade Forum Database Error
Database Error Database error
The Hardware Upgrade Forum database has encountered a problem.

Please try the following:
  • Load the page again by clicking the Refresh button in your web browser.
  • Open the www.hwupgrade.it home page, then try to open another page.
  • Click the Back button to try another link.
The www.hwupgrade.it forum technical staff have been notified of the error, though you may contact them if the problem persists.
 
We apologise for any inconvenience.