2011-12-31 20 views
6

Tôi đang sử dụng System.data.sqlite.dll trong chương trình vb.net của mình. Và đối với cuộc sống của tôi, tôi không thể tìm ra mã để kích hoạt chế độ WAL.System.data.sqlite - Kích hoạt chế độ tạp chí WAL

Tôi có kích hoạt lệnh này ngay sau khi tôi tạo DB hay với mỗi SQLiteConnection mới.

Và nếu như vậy những gì mã sẽ cần phải được sử dụng ngay bây giờ im sử dụng một cái gì đó như:

cnn As New SQLiteConnection(String.Format("Data Source={0}\{1};PRAGMA jounal_mode=WAL;", Application.StartupPath, DBName)) 

là thế này làm thế nào mà lệnh PRAGMA nên được sử dụng?

Trả lời

8

Bạn luôn có thể sử dụng lớp SQLiteConnectionStringBuilder để làm công việc cho bạn:

SQLiteConnectionStringBuilder connBuilder = new SQLiteConnectionStringBuilder(); 
    connBuilder.DataSource = filePath; 
    connBuilder.Version = 3; 
    //Set page size to NTFS cluster size = 4096 bytes 
    connBuilder.PageSize = 4096; 
    connBuilder.CacheSize = 10000; 
    connBuilder.JournalMode = SQLiteJournalModeEnum.Wal; 
    connBuilder.Pooling = true; 
    connBuilder.LegacyFormat = false; 
    connBuilder.DefaultTimeout = 500; 
    connBuilder.Password = "yourpass"; 


    using(SQLiteConnection conn = new SQLiteConnection(connBuilder.ToString())) 
    { 
    //Database stuff 
    } 
+0

Lưu ý rằng bạn không phải đặt WAL cho mọi kết nối - nó đủ để thiết lập nó một lần trong khi tạo cơ sở dữ liệu của bạn. – UGEEN

1

Bạn cần thực thi lệnh pragma dưới dạng lệnh không cần thiết.

Using cmd As SQLiteCommand = cnn.CreateCommand() 
    cmd.CommandText = "PRAGMA journal_mode=WAL" 
    cmd.ExecuteNonQuery() 
End Using 

Miễn là bạn giữ kết nối của mình mở, setting this once sẽ là đủ.

+0

Cảm ơn, được đánh giá cao. Tuy nhiên tôi có xu hướng đóng kết nối thường xuyên, thường là sau khi chèn, Cập nhật Ect .. Điều đó có nghĩa là tôi phải bao gồm điều đó với Chèn, Cập nhật, Xóa, đăng ký của tôi? –

+1

Đáng buồn thay, vâng. Nếu nó là một cơ sở dữ liệu địa phương chỉ, không nên có bất kỳ nhược điểm để rời khỏi kết nối mở trong suốt cuộc đời của ứng dụng. Chúng tôi làm điều này tất cả các thời gian với các thiết bị di động và máy tính bảng có một DB địa phương. –

+0

Ví dụ tốt, cảm ơn. – kwoxer

3

Đây là một chuỗi kết nối mẫu từ dự án của tôi (App.config):

<connectionStrings> 
    <add name="SQLiteDb" providerName="System.Data.SQLite" connectionString="Data Source=data.sqlite;Version=3;Pooling=True;Synchronous=Off;journal mode=Memory"/> 
    </connectionStrings> 

Thay vì journal mode=Memory bạn có thể chỉ định journal mode=WAL.

Nếu bạn không chỉ định chế độ nhật ký trong chuỗi kết nối, bạn có thể chuyển đổi nó theo cách thủ công bằng cách thực hiện truy vấn PRAGMA jounal_mode=WAL tới cơ sở dữ liệu.

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