2010-04-21 43 views
14

Mã sau có để mở kết nối nếu có ngoại lệ không?Cách đúng để đóng kết nối cơ sở dữ liệu trong trường hợp ngoại lệ

Tôi đang sử dụng cơ sở dữ liệu ấn bản Microsoft SQL nhỏ gọn.

try 
{ 
    SqlCeConnection conn = new SqlCeConnection(ConnectionString); 

    conn.Open(); 

    using (SqlCeCommand cmd = 
     new SqlCeCommand("SELECT stuff FROM SomeTable", conn)) 
    { 
     // do some stuff 
    } 

    conn.Close(); 
} 
catch (Exception ex) 
{ 
    ExceptionManager.HandleException(ex); 
} 

Chắc chắn cách tốt hơn là khai báo đối tượng kết nối trước khi thử, thiết lập kết nối bên trong khối thử và đóng nó trong khối cuối cùng?

SqlCeConnection conn = null; 
try 
{ 
    conn = new SqlCeConnection(ConnectionString); 

    conn.Open(); 

    using (SqlCeCommand cmd = 
     new SqlCeCommand("SELECT stuff FROM SomeTable", conn)) 
    { 
     // do some stuff 
    } 
} 
catch (Exception ex) 
{ 
    ExceptionManager.HandleException(ex); 
} 
finally 
{ 
    if(conn != null) conn.Close(); 
} 

Trả lời

4
try 
catch 
finally 

là cách thích hợp để xử lý việc này, bởi vì kết nối luôn luôn nên được đóng cửa ở mức cuối cùng. nhưng bạn nên kiểm tra không chỉ conn != null mà còn nếu trạng thái conn không phải là Closed.

8

Sử dụng Using

using(SqlConnection conn = new SqlConnection()) 
{ 
//put all your code here. 
} 
0

Tại sao không sử dụng một sử dụng xung quanh kết nối cũng như các lệnh?

27

Cách bạn đang xử lý SqlCeCommand trong mã của mình với sự trợ giúp của khối using, bạn có thể thực hiện tương tự cho số SqlCeConnection.

SqlCeConnection conn; 
using (conn = new SqlCeConnection(ConnectionString)) 
{ 
    conn.Open(); 
    using (SqlCeCommand cmd = 
     new SqlCeCommand("SELECT stuff FROM SomeTable", conn)) 
    { 
    // do some stuff 
    } 
} 

Lưu ý: Bạn có thể sử dụng một khối using cho các lớp học mà thực hiện IDisposable.

EDIT: Đây là giống như

try 
{ 
    conn = new SqlCeConnection(ConnectionString); 
    conn.Open(); 

    SqlCeCommand cmd = conn.CreateCommand(); 
    cmd.CommandText = "..."; 

    cmd.ExecuteNonQuery(); 
} 
finally 
{ 
    conn.Close(); 
} 

ref: http://msdn.microsoft.com/en-us/library/system.data.sqlserverce.sqlceconnection%28VS.80%29.aspx

+0

Tôi vẫn không thể bao quanh đầu. Từ ref: "Nếu SqlCeConnection nằm ngoài phạm vi, nó không bị đóng. Bạn phải đóng kết nối một cách rõ ràng bằng cách gọi Close hoặc Dispose." Trong ví dụ đầu tiên của bạn, bạn không "đóng kết nối rõ ràng". –

+1

Khi sử dụng câu lệnh 'using', nó gọi phương thức' Dispose' trên đối tượng đang được sử dụng, lần lượt gọi phương thức 'Close', trong trường hợp' SqlCeConnection'. Sử dụng một công cụ như ILSpy để xem mã nào được thực hiện khi 'Dispose' được gọi trên' SqlCeConnection'. Xem tài liệu [tại đây] (http://msdn.microsoft.com/en-us/library/bb300654%28v=vs.100%29.aspx). – shahkalpesh

0

Bạn nên sử dụng using tuyên bố, mà xử lý việc đóng kết nối mà không phức tạp http://davidhayden.com/blog/dave/archive/2005/01/13/773.aspx

+0

Còn về kết nối khác như kết nối Mysql .net và các thiết bị khác. @Mamoo – Adrian

+0

Bất kỳ trình kết nối nào, giống như nhà cung cấp Mysql.net * nên * (và có khả năng) triển khai IDisposable trên các đối tượng như Kết nối và Lệnh, vì vậy "sử dụng" có thể và nên ở đó. Tương tự như vậy đối với truy cập tệp hoặc bất kỳ khi nào một đối tượng chuyển sang mã/tài nguyên không được quản lý – plyawn

0

Bạn phải cố gắng Sau Way. Vì kết nối đóng vào cuối cùng, hãy chặn

try 
{ 
    SqlCeConnection conn = new SqlCeConnection(ConnectionString); 

    conn.Open(); 

    using (SqlCeCommand cmd = 
     new SqlCeCommand("SELECT stuff FROM SomeTable", conn)) 
    { 
     // do some stuff 
    } 
} 
catch (Exception ex) 
{ 

} 
finally 
{ 
\\close connection here 
} 
Các vấn đề liên quan