2014-04-09 17 views
6

Zajmuję się tworzeniem aplikacji WinForm z edycją Visual Studio 2012 Ultimate ze wszystkimi dodatkami Service Pack, C# i .NET Framework 4.5.Wewnętrzny błąd dostawcy danych .Net Framework 1

otrzymuję ten wyjątek:

Internal .Net Framework Data Provider error 1 

Z tego stosu:

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

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

otrzymuję wyjątek w linii this.conn.Close();.

I conn jest private SqlConnection conn = null;

Czy wiesz dlaczego?

+0

Istnieją pewne błędy, nie ma potrzeby 'this.conn = null; 'po wyrzuceniu go, a także proponuję zrzucić twoje polecenie przed wywołaniem' DisposeCurrentConnection() ' – RezaRahmati

Odpowiedz

10

Znalazłem rozwiązanie tutaj: http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/b23d8492-1696-4ccb-b4d9-3e7fbacab846/.

Zasadniczo jest:

Uwaga
Nie nazywaj Zamknij lub wyrzucić na Connection, a DataReader lub jakiegokolwiek innego zarządzanego obiektu w metodzie Finalize swojej klasie. W finalizatorze należy zwolnić zasoby niezarządzane, które bezpośrednio należą do klasy. Jeśli twoja klasa nie ma żadnych zasobów niezarządzanych, nie włączaj metody Finalize do definicji klasy. Aby uzyskać więcej informacji, zobacz Garbage Collection.

0

To nie jest odpowiedź, ale ja zdecydowanie wskazują na korzystanie z połączenia poprzez ten sposób i nie trzeba do troski o rozstrzygających obiektów

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

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

} 
Powiązane problemy