System.Data.SQLite:将VACUUM INTO用于内存数据库

3

首先我使用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();
}

SQLite异常:内存不足
   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),但它说内存不足?

谢谢


首先,filename参数需要是一个字符串。 - Shawn
@Shawn,它出现了另一个错误:内存不足... - Mr.Wang from Next Door
连接字符串Data Source=:memory:;Version=3;New=True;或者Data Source=:memory:;Version=3;New=True;Cache=Shared;是可行的,但是file:db1...不行。后者会抛出异常"数据源不能为空。请使用 :memory: 来打开内存数据库"。 - AlainD
连接字符串Data Source=:memory:;Version=3;New=True;Data Source=:memory:;Version=3;New=True;Cache=Shared;可以正常工作,但file:db1...不行。后者会抛出异常"数据源不能为空。请使用:memory:来打开内存数据库"。 - undefined
2个回答

4

首先,感谢您提供的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)。

1
如果您使用“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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接