Errore: Eccezione lanciata da un componente esterno

di il
6 risposte

Errore: Eccezione lanciata da un componente esterno

Cercando di riuscire nella transizione da Access a un applicativo sviluppato in .NET, sono passato da Cà a VB.NET che sembrava avermi dato qualche risultato.

Sto seguendo gli articoli ".Net la gestione del database Microsoft Access tramite VB.Net e C#" di Emanuele Mattei(sant'uomo) con VS 2022.
Seguiti gli articoli l'applicazione funzionava.

Fatte altre prove con funzionalità semplici(richiamo di una form, passaggio di parametri tra due form, ecc.) ho cercato di provare un altro componente necessario i Report.

Individuate due soluzioni: Reportviewer  e Crystal Report.

Seguendo il sant'uomo sopra citato, ho seguito gli articoli con l'installazione e i primi tentativi.
Sono cominciati gli errori che hanno portato a che l'applicazione sviluppata non funzionasse più.

Cercando di fare un passo indietro ho disinstallato il Reportviewer.
Gli errori sono continuati.

Disinstallato VS 2022 e reinstallato.
Ripreso dall'inizio lo sviluppo seguendo l'articolo per la gestione del database.
Sviluppati gli oggetti(secondo articolo) che vengono popolati con i dati di Access e il codice per estrarre i dati al caricamento della Form.

Si ripresenta l'errore "Errore: Eccezione lanciata da un componente esterno".

Disinstallato VS 2022 cercando di ripulire, seguendo le indicazioni

Installato VS 2026. Senza risultato l'errore si ripresenta.
Su un altro pc il progetto si avvia e presenta i dati.

Questo è il codice presente

Imports System.Data.OleDb
Public Class frmInizio
   Dim strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=K:\VBasic\Dati.accdb"
   Private Sub CaricaDati()
       Try
           'carico le combobox
           Using sqlConnessione As New OleDbConnection(strConn)
               sqlConnessione.Open()
               Using CommandSql As New OleDbCommand("Select ID, Denominazione FROM Clienti", sqlConnessione)
                   Using dtaAdapter As New OleDbDataAdapter(CommandSql)
                       Using dttDati As New DataTable()
                           dtaAdapter.Fill(dttDati)
                           CmbClienti.ValueMember = "ID"
                           CmbClienti.DisplayMember = "Denominazione"
                           CmbClienti.DataSource = dttDati.DefaultView
                       End Using
                       Using dttDati As New DataTable
                           dtaAdapter.SelectCommand = New OleDbCommand("Select ID, NumeroFattura FROM Fatture", sqlConnessione)
                           dtaAdapter.Fill(dttDati)
                           CmbFattura.ValueMember = "ID"
                           CmbFattura.DisplayMember = "NumeroFattura"
                           CmbFattura.DataSource = dttDati.DefaultView
                       End Using
                       Using dttDati As New DataTable
                           dtaAdapter.SelectCommand = New OleDbCommand("SELECT fat.*, cli.*, ord.*  FROM ((Fatture fat left join Clienti cli on fat.idclienti = cli.id) left join ordini ord on fat.id = ord.idfattura)", sqlConnessione)
                           dtaAdapter.Fill(dttDati)
                           DtgDati.DataSource = dttDati
                       End Using
                   End Using
               End Using
           End Using
       Catch ex As Exception
           MessageBox.Show("Errore: " + ex.Message, "Gestione Errore", MessageBoxButtons.OK, MessageBoxIcon.Error)
       End Try
   End Sub
   Private Sub FrmInizio_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       Try
           CaricaDati()
       Catch ex As Exception
           MessageBox.Show("Errore: " + ex.Message, "Gestione Errore", MessageBoxButtons.OK, MessageBoxIcon.Error)
       End Try
   End Sub
End Class

Nella finestra di controllo immediato è presente il messaggio:

Eccezione generata: 'System.Runtime.InteropServices.SEHException' in System.Data.dll

Non ho trovato una soluzione al problema

6 Risposte

  • Re: Errore: Eccezione lanciata da un componente esterno

    A giudicare dal codice, non c'entrano nulla ne ReportViewer ne CristalReport. Dal codice che hai condiviso non li adoperi in quella parte di sorgente.

    Di sicuro la differenza non la fa VS2022 o VS2026 che son solo gli IDE.

    Quel che a prima vista trovo strano è che usi sempre dttDati come DataTable e che cambi in continuazione la Select del DataAdapter.

    Approfondirei anche la SEHException: hai qualcosa nella sua proprietà Data? ErrorCode è valorizzata? InnerException è diverso da Nothing?

    Anche il Try...Catch è usato in modo un po' confusionario. Se lo hai già usato nel corpo della Sub CaricaDati, a cosa serve usarlo anche nel Load? Nel Load non potrai mai avere il sollevamento di un'eccezione, visto che in CaricaDati non hai nessun blocco che non gestisce, o che sollevi nuove eccezioni o che faccia un Throw.

  • Re: Errore: Eccezione lanciata da un componente esterno

    Prova a togliere try...catch e manda in esecuzione il programma, magari si capisce meglio quale è la riga che va in errore

  • Re: Errore: Eccezione lanciata da un componente esterno

    Rispondo ai due post

    24/02/2026 - SirJo ha scritto:

    Prova a togliere try...catch e manda in esecuzione il programma, magari si capisce meglio quale è la riga che va in errore

    Tolto try...catch prima dal corpo della sub CaricaDati e dalla load.

    La riga evidenziata "sqlConnessione.Open()" nella sub. Non riesco a caricare lo screenshot deell'eccezione.

    I dettagli estratti:

    System.Runtime.InteropServices.SEHException
     HResult=0x80004005
     Messaggio=Eccezione lanciata da un componente esterno.
     Origine=System.Data
     Analisi dello stack:
      at System.Data.OleDb.DataSourceWrapper.InitializeAndCreateSession(OleDbConnectionString constr, SessionWrapper& sessionWrapper)
      at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
      at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
      at System.Data.ProviderBase.DbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
      at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
      at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
      at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
      at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
      at System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
      at System.Data.OleDb.OleDbConnection.Open()
      at WindowsApp2.frmInizio.CaricaDati() in K:\VBasic\Maschere\WindowsApp2\Form1.vb:line 8
      at WindowsApp2.frmInizio.FrmInizio_Load(Object sender, EventArgs e) in K:\VBasic\Maschere\WindowsApp2\Form1.vb:line 39
      at System.EventHandler.Invoke(Object sender, EventArgs e)
      at System.Windows.Forms.Form.OnLoad(EventArgs e)
      at System.Windows.Forms.Form.OnCreateControl()
      at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
      at System.Windows.Forms.Control.CreateControl()
      at System.Windows.Forms.Control.WmShowWindow(Message& m)
      at System.Windows.Forms.Control.WndProc(Message& m)
      at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
      at System.Windows.Forms.Form.WmShowWindow(Message& m)
      at System.Windows.Forms.Form.WndProc(Message& m)
      at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
      at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
      at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    

    Non so interpretare questi messaggi

  • Re: Errore: Eccezione lanciata da un componente esterno

    Ciao,

    E' possibile che il problema sia derivato dal tipo di compilazione, magari sulla tua macchina hai installato Office a 64bit quando in Visual Studio, di solito, è di default la compilazione con AnyCPU e preferenza sui 32bit.
    Prova a verificare questi parametri nelle proprietà del tuo Progetto.

    TheTruster

  • Re: Errore: Eccezione lanciata da un componente esterno

    Adesso appare chiaro che il problema è che non riesce ad accedere al database, molto probabilmente è un problema di accesso al driver:
    Innanzitutto non hai specificato che .NET stai usando (framework 4.8, .NET 5, .NET 8 o altri)

    Prima causa probabile:
    Stai usando nel programma una architettura diversa dal driver.
    Ad esempio, stai compilando a 64bit, ma i driver sono a 32bit, o viceversa.
    Prima di tutto quindi non compilare con "Any CPU" ma prova a forzarlo a 32bit oppure poi prova a 64bit
    (riesci a capire di tuoi driver se sono 32bit o 64bit ??)

    Seconda causa probabile:
    La versione del driver.
    Se hai installato un Office recente (2016, 2019 o Office 365), la versione installata potrebbe essere la 16.0
    Prova a cambiare la stringa di connessione in:
    Dim strConn = "Provider=Microsoft.ACE.OLEDB.16.0;Data Source=K:\VBasic\Dati.accdb"

    Terza causa probabile:
    Non c'è il driver installato.
    E' raro ma può succedere.
    Installa Microsoft Access Database Engine 2016 Redistributable.

    Quarta causa probabile:
    Permessi sulla cartella o file bloccato
    L'errore 0x80004005 è molto generico, e a volte può significare "Accesso negato"
    Controlla che il database non sia già aperto da altro programma e/o non sia bloccato da qualcos'altro.
    Verifica di avere i permessi di scrittura sia sulla cartella sia sul file.

    Se ancora non dovesse funzionare, fai una copia del database, cancella tutti i dati sensibili, inserisci un paio di record con dati a caso, mandaci il file ACCDB e vediamo cosa si può fare

    Ciao ciao
    Sergio

  • Re: Errore: Eccezione lanciata da un componente esterno

    25/02/2026 - SirJo ha scritto:

    Innanzitutto non hai specificato che .NET stai usando (framework 4.8, .NET 5, .NET 8 o altri)

    Il framework è il 4.8

    25/02/2026 - SirJo ha scritto:

    Prima causa probabile:
    Stai usando nel programma una architettura diversa dal driver.
    Ad esempio, stai compilando a 64bit, ma i driver sono a 32bit, o viceversa.
    Prima di tutto quindi non compilare con "Any CPU" ma prova a forzarlo a 32bit oppure poi prova a 64bit
    (riesci a capire di tuoi driver se sono 32bit o 64bit ??)

    Non sono andato a vedere i driver. Cambiando "Any CPU" prima a 32bit, stesso errore, in seguito a 64 finalmente funziona.

    Dovrò capire perché sul pc sono presenti due istanze di "Microsoft Access Database Engine 2010", la prima installa nel 2021  e la seconda 10 giorni fa

    Grazie a tutti e scusate, ma come avrete capito, sto imparando ad usare VS.

Devi accedere o registrarti per scrivere nel forum
6 risposte