2014-04-09 13 views
6

Sto sviluppando un'app WinForm con Visual Studio 2012 Ultimate Edition con tutti i service pack, C# e .NET Framework 4.5.Errore di provider di dati .NET Framework interno 1

ottengo questa eccezione:

Internal .Net Framework Data Provider error 1 

Con questo stack:

en System.Data.ProviderBase.DbConnectionInternal.PrePush(Object expectedOwner) 
    en System.Data.ProviderBase.DbConnectionPool.PutObject(DbConnectionInternal obj, Object owningObject) 
    en System.Data.ProviderBase.DbConnectionInternal.CloseConnection(DbConnection owningObject, DbConnectionFactory connectionFactory) 
    en System.Data.SqlClient.SqlConnection.CloseInnerConnection() 
    en System.Data.SqlClient.SqlConnection.Close() 
    en AdoData.TRZIC.DisposeCurrentConnection() 
    en AdoData.TRZIC.Finalize() 

nel distruttore:

~TRZIC() 
{ 
    DisposeCurrentConnection(); 

    if (this.getCodeCmd != null) 
     this.getCodeCmd.Dispose(); 
} 

private void DisposeCurrentConnection() 
{ 
    if (this.conn != null) 
    { 
     if (this.conn.State == ConnectionState.Open) 
      this.conn.Close(); 

     this.conn.Dispose(); 
     this.conn = null; 
    } 
} 

ottengo l'eccezione in linea this.conn.Close();.

E conn è private SqlConnection conn = null;

sapete perché?

+0

Ci sono alcuni errori, è non ha bisogno di 'this.conn = null; 'dopo averlo eliminato, inoltre suggerisco di disporre il comando prima di chiamare' DisposeCurrentConnection() ' – RezaRahmati

risposta

10

Ho trovato la soluzione qui: http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/b23d8492-1696-4ccb-b4d9-3e7fbacab846/.

è fondamentalmente:

Attenzione
Non chiamare Chiudi o Dispose su una connessione, un DataReader, o qualsiasi altro oggetto gestito nel metodo Finalize della classe. In un finalizzatore, dovresti rilasciare solo risorse non gestite che la tua classe possiede direttamente. Se la tua classe non possiede risorse non gestite, non includere un metodo Finalize nella definizione della classe. Per ulteriori informazioni, vedere Garbage Collection.

0

Questo non è la risposta, ma vi consiglio vivamente di utilizzare la connessione via in questo modo e non avete bisogno di preoccupazione per gli oggetti smaltimento

using (SqlConnection connection = new SqlConnection(connectionString)) 
{  
    try  
    { 

      connection.Open(); 
      SqlCommand command = new SqlCommand("......", connection); 
      command.ExecuteNonQuery();  
    } 
    catch (Exception) 
    { 
     /*Handle error*/ 
    } 

} 
Problemi correlati