2012-05-05 27 views
7

Tôi đang tạo ứng dụng dành cho máy tính để bàn trong winform sẽ sử dụng Cơ sở dữ liệu Sqlite.Cách đóng kết nối Sqlite mà không gọi rõ ràng phương thức đóng bằng cách sử dụng .NET

Vì vậy, tôi đã tạo lớp Sqlite Helper sử dụng System.Data.SQLite và mỗi phương thức của lớp Trình trợ giúp đó sẽ mở và đóng kết nối.

Nhưng bây giờ tôi cũng đã thêm khả năng đính kèm cơ sở dữ liệu bổ sung nhưng sau khi Kết nối bị đóng, tất cả các cơ sở dữ liệu đính kèm sẽ bị mất.

Để sửa lỗi này, tôi đã sửa đổi lớp để kết nối được mở trong hàm khởi tạo và vẫn mở.

Sau khi ứng dụng kết thúc, tôi muốn kết nối đó đóng mà không gọi phương thức Close một cách rõ ràng.

Bất kỳ đề xuất nào về cách thực hiện điều đó?

+4

Bạn có thể sử dụng câu lệnh 'using' –

+0

@NikhilAgrawal - Điều đó có thể là chữ thường' u'. – Oded

+0

Không chắc chắn làm thế nào kể từ khi lớp helper được tạo ra trong sự kiện Form_load và ứng dụng sử dụng lớp đó trong suốt thời gian tồn tại của ứng dụng. – user850010

Trả lời

5

Giữ kết nối mở trong suốt thời gian đăng ký của bạn không phải là một cách hay.
Tôi khuyên bạn không nên đi theo tuyến đường này.
Ngược lại, tôi sẽ cố gắng đóng gói chức năng để đính kèm một cơ sở dữ liệu bên trong một phương thức có thể được gọi trên cơ sở cần sử dụng.

Ví dụ:

private static void AttachDB(string fileDB, string aliasName, SQLiteConnection cn) 
{ 
    string sqlText = string.Format("ATTACH '{0}' AS {1}", fileDB, aliasName) 
    SQLiteCommand cmd = new SQLiteCommand(sqlText, cn) 
    cmd.ExecuteNonQuery(); 
} 

sau đó trong mã của bạn

using(SQLiteConnection cn = new SQLiteConnection(GetConnectionString())) 
{ 
    AttachDB(@"C:\SQLite\UserData.sqlite3", "UserData", cn); 
    // Do your code here 
} 
+0

Bạn có muốn mở các kết nối ngắn nhất có thể không và sau khi mở kết nối, tôi đính kèm cơ sở dữ liệu? – user850010

+3

Có, giữ kết nối mở trong thời gian ngắn nhất. Đó là một quy tắc chung. NET sử dụng [kết nối tổng hợp] (http://en.wikipedia.org/wiki/Connection_pool) để tránh chi phí reinitializing kết nối mọi lúc. Tuy nhiên, SQlite không kích hoạt nó theo mặc định. Sử dụng chuỗi kết nối như thế này 'Data Source = filename; Version = 3; Pooling = True; Max Pool Size = 100;'. [Xem ở đây] (http://www.connectionstrings.com/sqlite) – Steve

+0

Tôi nghĩ về điều đó quá nhưng nó chỉ có vẻ tốn kém hơn để reattach cơ sở dữ liệu mỗi khi tôi sử dụng phương pháp sqlite. – user850010

1

Tùy thuộc vào cách lớp của bạn được xác định, bạn có thể sử dụng Vứt bỏ hoặc hủy. Hoặc, gọi một cách rõ ràng Close() ở cuối chương trình (từ trong Main, sau Run ...).

+0

Vứt bỏ và Destructor âm thanh như những gì tôi cần. Tôi nên sử dụng cái nào? – user850010

+0

Như tôi đã nói, phụ thuộc vào những gì trong lớp của bạn đã có. Đọc [this] (http: // msdn.microsoft.com/en-us/library/66x5fx1b(v=vs.80).aspx), [this] (http://msdn.microsoft.com/en-us/library/system.object.finalize (v = vs.80) .aspx) và [this] (http://msdn.microsoft.com/en-us/library/fs2xkftw (v = vs.80) .aspx) để giúp bạn quyết định. –

1

Trong C# có một cú pháp đặc biệt đối với tình hình như vậy:

using(var connection = new Connection()) 
{ 
    //work with connection 
} 

nó biên dịch cho một cái gì đó như:

Connection connection = null; 
try 
{ 
    connection = new Connection(); 
    //your operations 
} 
finally 
{ 
    connection.Dispose(); 
} 

trên gọi Dispose(), bạn kết nối chặt chẽ.

+1

Không hoàn toàn - sau khi khởi tạo kết nối, nó chưa được * mở - bạn vẫn phải gọi 'Open()'. Tuy nhiên, khi làm như vậy, nó cảm thấy sai, không đối xứng, không gọi 'Close()' trước 'Dispose()' ... –

4

Close không nên ngắt kết nối cơ sở dữ liệu của bạn, nhưng điều này sẽ chỉ làm việc khi cơ chế NET kết nối tổng hợp trên. Đảm bảo bạn đã bật tính năng đó trong chuỗi kết nối của mình:

Data Source=filename;Version=3;Pooling=True;Max Pool Size=100; 
Các vấn đề liên quan