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();
}