繁体   English   中英

无法使用System.Data.Sqlite访问(Firefox的)Sqlite数据库

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM