System.Data.SQLite : VACUUM INTO 一个内存数据库
System.Data.SQLite : VACUUM INTO an in-memory database
首先,我使用 System.Data.SQLite v1.0.111 打开一个到内存数据库的连接,如下所示。
SQLiteConnection dest= new SQLiteConnection("FullUri='file:db1?mode=memory&cache=shared'");
dest.Open();
然后我有另一个 sqlite 数据库文件,打开如下。
SQLiteConnection src= new SQLiteConnection(@"Data Source=C:\db1.sqlite");
src.Open();
接下来,我尝试VACUUM INTO
SQL将文件数据库复制到内存数据库中,但它给了我一个错误。
using( SQLiteCommand cmd = src.CreateCommand() )
{
cmd.CommandText = $"VACUUM main INTO 'file:db1?mode=memory&cache=shared';";
cmd.ExecuteNonQuery();
}
SQLiteException: out of memory
at System.Data.SQLite.SQLite3.Reset(SQLiteStatement stmt)
at System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)
at System.Data.SQLite.SQLiteDataReader.NextResult()
at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(CommandBehavior behavior)
at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()
文件中的数据库很小(20KB),但它说内存不足?
谢谢
好吧,首先感谢您 Vacuum into 语法示例,我找不到一个!
这是解决方案:
SQLiteConnection dest = new SQLiteConnection("FullUri='file:db1?mode=memory&cache=shared'");
dest.Open();
SQLiteConnection src = new SQLiteConnection(@"Data Source=MYDb.sqlite");
src.Open();
using (SQLiteCommand cmd = src.CreateCommand())
{
cmd.CommandText = @"VACUUM INTO 'file:db1?mode=memory&cache=shared';";
cmd.ExecuteNonQuery();
}
using (SQLiteCommand cmd = dest.CreateCommand())
{
cmd.CommandText = "SELECT count(*) FROM sqlite_master WHERE type = 'table'";
var ret = cmd.ExecuteScalar();
}
在我的例子中 ret 等于 9('MYDb.sqlite' 中的表数)。
我认为问题出在 vacuum into 语法中:您不应该指定源数据库(VACUUM INTO 不是 VACUUM main INTO ).
如果您使用“Microsoft.Data.Sqlite”(SQLite 的轻量级 ADO.NET 提供程序),这里是一个使用 VACUUM 的 C# 代码示例:
using (SqliteConnection connection = new SqliteConnection("Data Source=hello.db"))
connection.Open();
SqliteCommand sqliteCommand = new SqliteCommand("VACUUM", connection);
sqliteCommand.ExecuteNonQuery();
}
首先,我使用 System.Data.SQLite v1.0.111 打开一个到内存数据库的连接,如下所示。
SQLiteConnection dest= new SQLiteConnection("FullUri='file:db1?mode=memory&cache=shared'");
dest.Open();
然后我有另一个 sqlite 数据库文件,打开如下。
SQLiteConnection src= new SQLiteConnection(@"Data Source=C:\db1.sqlite");
src.Open();
接下来,我尝试VACUUM INTO
SQL将文件数据库复制到内存数据库中,但它给了我一个错误。
using( SQLiteCommand cmd = src.CreateCommand() )
{
cmd.CommandText = $"VACUUM main INTO 'file:db1?mode=memory&cache=shared';";
cmd.ExecuteNonQuery();
}
SQLiteException: out of memory
at System.Data.SQLite.SQLite3.Reset(SQLiteStatement stmt)
at System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)
at System.Data.SQLite.SQLiteDataReader.NextResult()
at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(CommandBehavior behavior)
at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()
文件中的数据库很小(20KB),但它说内存不足?
谢谢
好吧,首先感谢您 Vacuum into 语法示例,我找不到一个! 这是解决方案:
SQLiteConnection dest = new SQLiteConnection("FullUri='file:db1?mode=memory&cache=shared'");
dest.Open();
SQLiteConnection src = new SQLiteConnection(@"Data Source=MYDb.sqlite");
src.Open();
using (SQLiteCommand cmd = src.CreateCommand())
{
cmd.CommandText = @"VACUUM INTO 'file:db1?mode=memory&cache=shared';";
cmd.ExecuteNonQuery();
}
using (SQLiteCommand cmd = dest.CreateCommand())
{
cmd.CommandText = "SELECT count(*) FROM sqlite_master WHERE type = 'table'";
var ret = cmd.ExecuteScalar();
}
在我的例子中 ret 等于 9('MYDb.sqlite' 中的表数)。
我认为问题出在 vacuum into 语法中:您不应该指定源数据库(VACUUM INTO 不是 VACUUM main INTO ).
如果您使用“Microsoft.Data.Sqlite”(SQLite 的轻量级 ADO.NET 提供程序),这里是一个使用 VACUUM 的 C# 代码示例:
using (SqliteConnection connection = new SqliteConnection("Data Source=hello.db"))
connection.Open();
SqliteCommand sqliteCommand = new SqliteCommand("VACUUM", connection);
sqliteCommand.ExecuteNonQuery();
}