[英]Cannot access Sqlite Database (of Firefox) using System.Data.Sqlite
我编写了一个小型C#/。Net应用程序,它能够读取Firefox的cookies.sqlite文件。 由于我已升级到Firefox 4,因此我的应用程序无法打开数据库文件:
执行“ connection.Open();”行 (在下面的代码示例中)将有一个执行程序,内容为:
“打开的文件不是数据库文件。文件已加密或不是数据库”
这是我的程序代码:
class Program
{
static void Main()
{
const string PATH_TO_DATABASE = @"C:\Users\Boris\Desktop\TEMP\cookies.sqlite";
const string CONNECTION_STRING = @"Data Source=" + PATH_TO_DATABASE;
if (!File.Exists(PATH_TO_DATABASE)) return;
using (SQLiteConnection connection = new SQLiteConnection(CONNECTION_STRING))
{
connection.Open();
using (SQLiteCommand command = new SQLiteCommand("SELECT id, name, host, path FROM moz_cookies", connection))
{
using (SQLiteDataReader read = command.ExecuteReader())
{
while (read.Read())
{
string id = read[0].ToString();
string name = read[1].ToString();
string host = read[2].ToString();
string path = read[3].ToString();
Console.WriteLine("ID: " + id);
Console.WriteLine("Name: " + name);
Console.WriteLine("Host: " + host);
Console.WriteLine("Path: " + path);
}
}
}
}
}
}
我正在将.Net包装器DLL用于Sqlite v 3.6.23.1。 该应用程序的目标框架是.Net 2.0。
我能够使用名为SqliteExpert的应用程序打开sqlite数据库,而不会出现任何问题。
如果有人有一个主意,那就太好了!
鲍里斯
Firefox 4.0使用SQLite版本3.7.4。 (要查看此内容,请下载SQLite Manager ,然后在“执行SQL”标签中运行select sqlite_version();
)
v3.7.4似乎创建了v3.6.23.1无法读取的数据库。 我在发行说明中找不到明确声明的内容,但是通过将cookies.sqlite文件与文件格式文档进行比较可以清楚地看出格式已更改。 具体来说,根据文档,字节19(0x13)应该为1
,但是cookies.sqlite文件中的该字节为2
。 根据文档:
如果SQLite读取的值大于1,则库将拒绝打开数据库。
类似于上述“写入版本”,该字段的存在是为了在一定程度上需要向前兼容性。 如果将来创建的SQLite版本使用旧版SQLite可能无法安全读取的文件格式,则此字段将设置为大于1的值。
要读取数据库,您将需要使用最新版本的SQLite。 不幸的是System.Data.SQLite差不多一年都没有更新。 此项目已由sqlite.org接管,但目前没有下载 。
如果不想等待sqlite.org发布基于v3.7.x的.NET包装器,则可以尝试下载源代码并手动将SQLite.NET/SQLite.Interop/src/sqlite3.c
升级到最新的合并C源文件( 在此处提供 )。
编辑:如sdwilsh所述 ,Firefox 4.0使用预写日志记录 ; 如该新日记帐模式的描述所述:
因此,如果旧版本的SQLite尝试连接到以WAL模式运行的SQLite数据库,它将报告“文件已加密或不是数据库”的错误。
我有同样的问题。 以前,我使用Python脚本(具有sqlite集成)从cookies.sqlite和perms.sqlite文件中获取数据。 后者仍然可以正常工作。 实际上,除cookie.sqlite和place.sqlite外,其他所有.sqlite文件都是可读的。 这两个产生“加密或不是数据库”错误。
我没有为Python(或sqlite3)寻找升级,而是为.sqlite文件创建了补丁。 此C代码将偏移量18和19处的字节从2更改为1。我在Windows上的Cygwin上运行此代码,但它应编译并在Unix / Linux上运行。
警告:请勿对原始的Firefox cookies.sqlite文件执行此操作。 而是将其复制到临时文件,然后在副本上运行补丁。
// ffpatch.c
// Edits the specified Firefox .sqlite file.
// Changes 0x0202 to 0x0101 at offset 18/19.
// BEFORE
// 0000000 S Q L i t e f o r m a t 3 \0
// 0000020 004 \0 002 002 \0 @ \0 \0 005 034 \0 \0 \0 N
// AFTER
// 0000000 S Q L i t e f o r m a t 3 \0
// 0000020 004 \0 001 001 \0 @ \0 \0 005 034 \0 \0 \0 N
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#define PROGNAME "ffpatch"
#define MY_OFFSET 18
int main (int argc, char *argv[])
{
int fd;
char buf[2];
off_t offset;
ssize_t wsize;
if (argc != 2)
{
fprintf(stderr, "usage: %s sqlite-file\n", PROGNAME);
exit(1);
}
if ((fd = open(argv[1], O_RDWR)) == -1)
{
fprintf(stderr, "cannot open %s\n", argv[1]);
exit(1);
}
if ((offset = lseek(fd, MY_OFFSET, SEEK_SET)) != MY_OFFSET)
{
fprintf(stderr, "lseek() failed\n");
exit(1);
}
buf[0] = 1;
buf[1] = 1;
wsize = write(fd, buf, 2);
close(fd);
exit(0);
}
您好,非常感谢您的回答!
我通过以下方式使应用程序工作:
1.我在此处下载了用于.NET 4.0的当前ADO.NET连接器的源: http : //system.data.sqlite.org/index.html/timeline?r=trunk
也许您必须先使用匿名用户名和验证码作为密码在网站上登录。
2.通过下载安装此ADO.NET连接器获得了sqlite3.dll v.3.7.4的预编译版本: http : //www.devart.com/dotconnect/sqlite/ (您可以使用ADO.NET连接器libs也可以替代system.data.sqlite.org中的连接器。我本人仅对sqlite3.dll感兴趣。)
3.从system.data.sqlite.org编译源代码之后,我将生成的System.Data.Sqlite.dll和sqlite3.dll复制到了我的应用程序输出目录中。 请注意,两个DLL都是针对x86或x64机器编译的。
问候
我想我有你的问题。 您的数据库连接正常。 首先,您正在使用哪个版本的dotnetFramework
? 因此,您可以下载并使用System.Data.SQLite.dll
文件作为参考,然后可以解决您的问题。 我认为您使用的是较旧的System.Data.SQLite.dll
文件(与您的点网版本不匹配)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.