2014-04-09 20 views
6

Tôi đang phát triển một ứng dụng WinForm với Visual Studio 2012 Phiên bản cuối cùng với tất cả gói dịch vụ, C# và Khuôn khổ .NET 4.5.Lỗi Nhà cung cấp Dữ liệu Khung Nội bộ 1

tôi nhận được ngoại lệ này:

Internal .Net Framework Data Provider error 1 

Với đống này:

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

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

tôi nhận được ngoại lệ trong dòng this.conn.Close();.

connprivate SqlConnection conn = null;

Bạn có biết tại sao?

+0

Có một số sai lầm, bạn không cần phải 'this.conn = null; 'sau khi xử lý nó, và tôi cũng khuyên bạn nên vứt bỏ lệnh của bạn trước khi gọi' DisposeCurrentConnection() ' – RezaRahmati

Trả lời

10

Tôi đã tìm thấy giải pháp tại đây: http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/b23d8492-1696-4ccb-b4d9-3e7fbacab846/.

Về cơ bản là:

Thận trọng
Đừng gọi Close hoặc Vứt bỏ trên một kết nối, một DataReader, hoặc bất kỳ đối tượng quản lý khác trong phương thức Finalize của lớp học của bạn. Trong finalizer, bạn chỉ nên phát hành các tài nguyên không được quản lý mà lớp của bạn sở hữu trực tiếp. Nếu lớp của bạn không sở hữu bất kỳ tài nguyên không được quản lý nào, không bao gồm phương thức Finalize trong định nghĩa lớp của bạn. Để biết thêm thông tin, xem Bộ sưu tập rác.

0

này không trả lời nhưng tôi đề nghị bạn nên sử dụng kết nối thông qua cách này và bạn không cần phải lo lắng về việc xử lý đối tượng

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

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

} 
Các vấn đề liên quan