SQLite создает дисковый файл для БД в памяти - PullRequest
0 голосов
/ 27 мая 2018

Я пытался создать разделяемую базу данных в памяти в соответствии с документацией, представленной на сайте SQLite.Но в итоге я нахожу решение проблемы.

 var connectionString = "Data Source=sharedmemdb;Mode=Memory;Cache=Shared";

            using (var connection1 = new SQLiteConnection(connectionString))
            {
                connection1.Open();

                var command1 = connection1.CreateCommand();
                command1.CommandText =
                    "CREATE TABLE Message ( Text TEXT );" +
                    "INSERT INTO Message ( Text ) VALUES ( 'Is there anybody out there?' );";
                command1.ExecuteNonQuery();

                using (var connection2 = new SQLiteConnection(connectionString))
                {
                    connection2.Open();

                    var command2 = connection2.CreateCommand();
                    command2.CommandText = "SELECT Text FROM Message;";


                    var message = command2.ExecuteScalar() as string;
                }
            }

Если я выполню этот код, он создаст в памяти БД с именем sharedmemdb, и общий кэш будет включен при создании соединения, поэтому это соединение доступнок другим соединениям также.Если я запускаю этот первый раз, это работает довольно хорошо, но если я закрываю приложение и запускаю снова, он выдает ошибку «Сообщение таблицы уже существует», и это выглядит очень странно, так как я создал таблицу в памяти, и это не должно быть доступно, если приложение перезапускается.

После получения этой ошибки я заглянул в каталог приложения и обнаружил файл «sharedmemdb», который означает, что SQLite не создает разделяемую базу данных в памяти.

Любая подсказка, почему это происходит.?

После перемещения команды в блок using:

var connectionString = "Data Source =sharedmemdb; Mode = Memory; Cache = Shared";

            using (var connection1 = new SQLiteConnection(connectionString))
            {
                connection1.Open();

                using (var command1 = connection1.CreateCommand())
                {
                    command1.CommandText =
                        "CREATE TABLE Message ( Text TEXT );" +
                        "INSERT INTO Message ( Text ) VALUES ( 'Is there anybody out there?' );";
                    command1.ExecuteNonQuery();
                }
                using (var connection2 = new SQLiteConnection(connectionString))
                {
                    connection2.Open();

                    using (var command2 = connection2.CreateCommand())
                    {
                        command2.CommandText = "SELECT Text FROM Message;";


                        var message = command2.ExecuteScalar() as string;
                    }
                }
            }

1 Ответ

0 голосов
/ 27 мая 2018

System.Data.SQLite не поддерживает параметр «Mode» (это Microsoft.Data.Sqlite).

Однако в System.Data.SQLite вы можете использовать параметр «FullUri» для передачиаргументы непосредственно к SQLite, так что вы можете достичь того, что вы хотели, изменив строку подключения на

FullUri=file:mem.db?mode=memory&cache=shared
Protocol^    ^      ^           ^
DB Name -----|      |           |
Use memory mode ----+           |
Use shared cache ---------------+

(первая строка является фактической строкой подключения, следующие несколько строк разбивают ее)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...