2010-07-07 20 views
5

Tôi đang sử dụng DataSet để truy xuất dữ liệu từ Microsoft SQL Server. Tôi có cần phải đóng kết nối một cách rõ ràng (hoặc SqlDataAdapter cơ bản tự động đóng kết nối) không?Đóng kết nối cơ bản của DataSet một cách rõ ràng?

Tôi luôn sử dụng DataReader (với sử dụng), nhưng lần đầu tiên sử dụng DataSet - đó là lý do tại sao tự hỏi về thực hành tốt nhất. Cảm ơn trước.

Trả lời

0

Sử dụng câu lệnh làm sạch tài nguyên không được quản lý trước khi đối tượng thu thập rác. Kết nối, là một tài nguyên không được quản lý vì vậy nó phải được đóng ngay cả khi bạn đang có một DataSet.

+0

Am hiện không sử dụng "sử dụng" với DataSet, đó là chính xác tôi đã tự hỏi? Tôi có cần phải đóng khi giao dịch với DataSet không? Cảm ơn. –

+0

nếu bạn đang sử dụng trình đọc thì bạn phải đóng/bỏ bộ điều hợp và/hoặc người đọc được sử dụng để tránh ngoại lệ. Xem câu trả lời của tôi dưới đây. –

+0

Amit: Như tôi đã đề cập ở trên, tôi đã sử dụng "sử dụng" cho DataReaders (sẽ xử lý việc đóng). Câu hỏi của tôi chỉ dành cho DataSets. Vui lòng đọc lại câu hỏi của tôi. Cảm ơn. –

0

Chỉ để làm mọi việc rõ ràng, tôi đang theo dõi cách thức người mới bắt đầu truyền thống tương tác với db.

public DataSet GetData() 
{ 
    SqlDataReader reader; 
    string connstr = your conn string; 
    SqlConnection conn = new SqlConnection(connstr); 
    DataTable st = new DataTable(); 
    DataSet ds = new DataSet(); 
    try 
    {     
     SqlCommand cmd = new SqlCommand(); 
     cmd.CommandText = "Your select query"; 
     cmd.Connection = conn; 
     conn.Open(); 

     reader = cmd.ExecuteReader(); 
     dt.Load(reader); 
     ds.Tables.Add(dt); 
    } 
    catch (Exception ex) 
    { 
     // your exception handling 
    } 
    finally 
    { 
     reader.Close(); 
     reader.Dispose(); 
     conn.Close(); 
     conn.Dispose(); 
    }  
    return ds; 
} 
0

Tôi luôn nghĩ rằng nên theo dõi kết nối của mình, bất kể tôi đang kết nối với cơ sở dữ liệu như thế nào.

Bạn đã nói rằng bạn luôn sử dụng trình quản lý dữ liệu, nhưng bây giờ bạn đang sử dụng tập dữ liệu. Tôi giả định rằng có nghĩa là bạn đang sử dụng một DataAdapter để đi với DataSet của bạn. Nếu trường hợp đó xảy ra và bạn đang sử dụng MSSQL, thì SqlDataAdapter sẽ mở và đóng kết nối cho bạn, nhưng như tôi đã nói, tôi muốn theo dõi điều này, đặc biệt vì bạn có thể sử dụng SqlCommand.ExecuteScalar (ngay cả khi bạn đang sử dụng a DataAdapter phần lớn thời gian) tại một số thời điểm và SqlCommand sẽ không quản lý trạng thái kết nối của bạn cho bạn.

SqlDataAdapter doc: http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx

3

Một DataSet là một 'xem' bị ngắt kết nối vào cơ sở dữ liệu. Tức là, bạn tải dữ liệu từ cơ sở dữ liệu vào DataSet (thực tế, trong một DataTable, có thể được đặt trong DataSet) và bạn có thể đóng Kết nối mà bạn đã sử dụng để điền DataTable hoặc DataSet.

Bạn có thể tiếp tục làm việc với dữ liệu nằm trong tập dữ liệu. Nó không yêu cầu kết nối mở với DB.

Thực tế, bạn nên đóng kết nối DB ngay khi bạn không cần bất kỳ quyền truy cập DB nào sớm. Các kết nối tới cơ sở dữ liệu phải ngắn ngủi.

1

Cách tốt nhất là để gọi Dispose() cho tất cả thành viên thực hiện ADO.NET IDisposable: kết nối, lệnh, adapter, bàn, thiết lập, đọc, vv:

using (SqlConnection connection = new SqlConnection(connectionString)) 
using (SqlCommand command = connection.CreateCommand()) 
{ 
    connection.Open(); 
    using (DataSet ds = new DataSet()) 
    using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
    { 
     adapter.Fill(ds); 
    } 
} 
Các vấn đề liên quan