Мне не удалось заставить это работать, используя поставщика данных с открытым исходным кодом из здесь . Тем не менее, я смог заставить это работать, используя бесплатную стандартную версию dotConnect следующим образом:
Создайте приведенный ниже импорт DLL, чтобы мы могли включить общий кэш для SQLite.
[DllImport("sqlite3.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int sqlite3_enable_shared_cache(int enable);
Выполните вышеуказанную функцию, чтобы включить общий кэш. Обратите внимание, что это нужно выполнить только один раз для всего процесса - см. документация SQLite .
sqlite3_enable_shared_cache(1);
Затем добавьте префикс SQL-запроса, используемого читателем данных, к прагматическому выражению следующим образом:
PRAGMA read_uncommitted = 1;
SELECT Column1, Column2 FROM MyTable
Теперь можно свободно обновлять и вставлять строки, когда программа чтения данных активна. Дополнительную документацию SQLite по общему кешу можно найти здесь .
Обновление:
Более новая версия поставщика данных Devart SQLite теперь поддерживает это в улучшенном виде.
Для включения общего кэша можно сделать следующий вызов:
Devart.Data.SQLite.SQLiteConnection.EnableSharedCache();
Можно настроить незафиксированные чтения в строку подключения, например, следующим образом:
Devart.Data.SQLite.SQLiteConnectionStringBuilder builder = new SQLiteConnectionStringBuilder();
builder.ReadUncommitted = true;
builder.DateTimeFormat = Devart.Data.SQLite.SQLiteDateFormats.Ticks;
builder.DataSource = DatabaseFilePath;
builder.DefaultCommandTimeout = 300;
builder.MinPoolSize = 0;
builder.MaxPoolSize = 100;
builder.Pooling = true;
builder.FailIfMissing = false;
builder.LegacyFileFormat = false;
builder.JournalMode = JournalMode.Default;
string connectionString = builder.ToString();