Присоедините базу данных sqlite в памяти к физическому соединению с базой данных в С#C#

Место общения программистов C#
Ответить
Anonymous
 Присоедините базу данных sqlite в памяти к физическому соединению с базой данных в С#

Сообщение Anonymous »

У меня есть физическая база данных sqlite на диске и именованная база данных в памяти, к которой мне нужно выполнять совместные запросы. Читая документацию, не совсем понятно, возможно ли это и как это сделать.
Глядя на документацию на https://www.sqlite.org/inmemorydb.html, я вижу фразу «Когда база данных в памяти называется таким образом, она будет делиться своим кешем только с другим соединением, которое использует точно такое же имя».
Эта фраза «точно то же имя» заставляет меня думать, что это не так. возможно.
var dbFile = @"D:\Downloads\test.db3";
if (File.Exists(dbFile))
File.Delete(dbFile);

// create connection to physical db
var physicalCon = new SqliteConnection(new SqliteConnectionStringBuilder
{
DataSource = dbFile,
Mode = SqliteOpenMode.ReadWriteCreate,
Cache = SqliteCacheMode.Shared,
Pooling = false
}.ToString());
physicalCon.Open();

// create connection to in-memory db
var memoryCon = new SqliteConnection(new SqliteConnectionStringBuilder
{
DataSource = "memtest",
Mode = SqliteOpenMode.Memory,
Cache = SqliteCacheMode.Shared,
Pooling = false
}.ToString());
memoryCon.Open();

try
{
// create some tables in physical db, insert values, and test read
using (var p1Cmd = physicalCon.CreateCommand())
{
p1Cmd.CommandText = "CREATE TABLE Phys (Val TEXT);";
p1Cmd.ExecuteNonQuery();
p1Cmd.CommandText = "INSERT INTO Phys (Val) Values ('Phys1'), ('Phys2');";
p1Cmd.ExecuteNonQuery();
p1Cmd.CommandText = "SELECT * FROM Phys;";
using var pReader = p1Cmd.ExecuteReader();
while (pReader.Read())
{
Debug.WriteLine("P : " + pReader.GetString(0));
}
}

// create some tables in memory db, insert values, and test read
using (var m1Cmd = memoryCon.CreateCommand())
{
m1Cmd.CommandText = "CREATE TABLE Mem (Val TEXT);";
m1Cmd.ExecuteNonQuery();
m1Cmd.CommandText = "INSERT INTO Mem (Val) Values ('Mem1'), ('Mem2');";
m1Cmd.ExecuteNonQuery();
m1Cmd.CommandText = "SELECT * FROM Mem;";
using var mReader = m1Cmd.ExecuteReader();
while (mReader.Read())
{
Debug.WriteLine("M : " + mReader.GetString(0));
}
}

// attach memory db to physical db connection
using (var attach = physicalCon.CreateCommand())
{
attach.CommandText = "ATTACH DATABASE 'file:memtest?mode=memory&cache=shared' AS m;";
attach.ExecuteNonQuery();
}

// read memory db values from physical db connection
using (var testCmd = physicalCon.CreateCommand())
{
testCmd.CommandText = "SELECT * FROM m.Mem;"; // exception 'm.Mem' table does not exist
using var reader = testCmd.ExecuteReader();
while (reader.Read())
{
Debug.WriteLine("T : " + reader.GetString(0));
}
}
}
finally
{
physicalCon.Close();
memoryCon.Close();
}


Подробнее здесь: https://stackoverflow.com/questions/774 ... in-c-sharp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»