2012-08-20 26 views
7

thể trùng lặp:
Will a using block close a database connection?Có cần đóng một DbConnection nếu sử dụng mệnh đề sử dụng không?

db.Close() không cần thiết trong những điều sau đây?

using (DbConnection db = GetDbConnection()) 
{ 
    // do data-access stuff 
    // ... 

    db.Close(); 
} 
+1

không, sử dụng trong thực hiện phương pháp vứt bỏ trong DBConnection, gọi db.Close(). Nó là không cần thiết –

+0

Vì vậy, nó là không cần thiết? – CJ7

+1

Vâng, đó là (không cần thiết). –

Trả lời

2

Đối với những gì tôi biết, khi phương pháp Dispose() được gọi, Close() được tự động thực hiện.
Vì vậy, db.Close(); không cần thiết ở đây.

1

Ở góc đóng, Dispose() được gọi.

Tôi nghĩ trong phương thức DbConnection phương thức Dispose cũng sẽ kiểm tra xem kết nối có được đóng hay không. Vì vậy, không, nó có lẽ không cần thiết, nhưng cá nhân tôi nghĩ rằng đó là thực hành tốt và cải thiện khả năng đọc và nó không ảnh hưởng đến hiệu suất vì Close sẽ được gọi bằng cách này hay cách khác.

9

Có cần đóng một DbConnection nếu sử dụng mệnh đề sử dụng không?

Không, không cần phải đóng DbConnection nếu sử dụng mệnh đề sử dụng?

Có nó là không cần thiết ở đây bởi vì khi sử dụng kết nối đầu sẽ định đoạt nghĩa bế mạc và phát hành tất cả các bộ nhớ.

DBConnection thực hiện IDisposable giao diện, chức năng đóng nằm ở phương thức DisposeDBConnection.

Nhưng nếu một số dòng là sau khi đường gần thì nó rất hữu ích

using (DbConnection db = GetDbConnection()) 
{ 
    // do data-access stuff 
    // ... 

    db.Close(); //Useless 
} 

Nhưng ở đây nó rất hữu ích

using (DbConnection db = GetDbConnection()) 
{ 
    // do data-access stuff 
    // ... 

    db.Close(); //Useful 

// Some more code 
} 

Trong trường hợp đó bạn có thể làm

using (DbConnection db = GetDbConnection()) 
{ 
    // do data-access stuff 
    // ... 

} 

// Some more code which was previously inside using section. 
+3

+1 cho thiết kế đẹp để đóng thủ công trong trường hợp có thêm mã tồn tại mà không sử dụng kết nối. Tuy nhiên trong trường hợp đó, tốt hơn là không bao gồm mã đó trong khối sử dụng. – Aphelion

+0

@Aphelion: vâng, chắc chắn mã bên dưới dấu Đóng() không được nằm trong khối – CJ7

+0

Tại sao một số mã khác bên dưới db.CLose() hữu ích? –

1

mã được trích xuất từ việc thực hiện vứt bỏ SqlConnection (Có nguồn gốc từ DbConnection) cl ass:

public void Dispose() 
{ 
    Dispose(true); 
} 

protected override void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
    this.Close(); 
    } 
    base.Dispose(disposing); 
} 

Từ khóa using sử dụng giao diện IDisposable. Phương pháp trên là phương pháp triển khai. Nó sẽ đóng kết nối.

4

Chỉ cần chắc chắn tôi đã kiểm tra mã :)

protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
     this._userConnectionOptions = (DbConnectionOptions) null; 
     this._poolGroup = (DbConnectionPoolGroup) null; 
     this.Close(); 
     } 
     this.DisposeMe(disposing); 
     base.Dispose(disposing); 
    } 

Đây là việc thực hiện các SqlConnection được kế thừa từ DbConnection.Như bạn có thể thấy có this.Close() phương thức :)

+0

Tôi đã tự hỏi ở đây, 'using' statement gọi' Dispose() 'hoặc' Dispose (bool disposing) ' –

+0

@Aphelion: pls bạn có thể trả lời về điều này không? –

+0

@CuongLe Nó sẽ gọi là 'Vứt bỏ()' là công khai. Việc thực hiện của nó sau đó sẽ gọi là 'Vứt bỏ (đúng) '. – Aphelion

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