2014-04-09 17 views
6

Ich bin 4.5 eine WinForm app mit Visual Studio 2012 Ultimate Edition mit alle Service Pack, C# und .NET Framework zu entwickeln.Internal .Net Framework Data Provider Fehler 1

Ich erhalte diese Ausnahme:

Internal .Net Framework Data Provider error 1 

Mit diesem Stapel:

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() 

Im destructor:

~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; 
    } 
} 

ich die Ausnahme in Zeile this.conn.Close(); bekommen.

Und conn ist private SqlConnection conn = null;

Wissen Sie, warum?

+0

Es gibt einige Fehler, braucht man nicht zu 'this.conn = null; 'nachdem sie entsorgen, und auch schlage ich Ihren Befehl zu entsorgen vor dem Aufruf von' DisposeCurrentConnection() ' – RezaRahmati

Antwort

10

Ich habe hier die Lösung gefunden: http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/b23d8492-1696-4ccb-b4d9-3e7fbacab846/.

Grundsätzlich ist:

Vorsicht
Rufen Sie nicht schließen oder auf einer Verbindung entsorgen, ein Datareader oder ein anderes verwaltetes Objekt in der Finalize-Methode der Klasse. In einem Finalizer sollten Sie nur nicht verwaltete Ressourcen freigeben, die der Klasse direkt gehören. Wenn Ihre Klasse alle nicht verwalteten Ressourcen nicht besitzt, keine Finalize-Methode in Ihrer Klassendefinition enthalten. Weitere Informationen finden Sie unter Garbage Collection.

0

Dies ist nicht zu beantworten, aber ich empfehle Ihnen Verbindung über diese Art und Weise zu verwenden, und Sie nicht über Entsorgung Objekte betreffen müssen

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

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

} 
Verwandte Themen