У меня есть физическая база данных 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
Присоедините базу данных sqlite в памяти к физическому соединению с базой данных в С# ⇐ C#
Место общения программистов C#
1762900361
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();
}
Подробнее здесь: [url]https://stackoverflow.com/questions/77432275/attach-in-memory-sqlite-database-to-physical-database-connection-in-c-sharp[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия