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

时间:2011-03-29 13:19:21

标签: c# .net firefox 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 Wrapper DLL for Sqlite v.3.6.23.1。 该应用程序的目标框架是.Net 2.0。

使用名为SqliteExpert的应用程序,我能够毫无问题地打开sqlite数据库。

如果有人有想法会很棒!

此致 鲍里斯

4 个答案:

答案 0 :(得分:7)

Firefox 4.0使用SQLite版本3.7.4。 (要查看此信息,请在“执行SQL”选项卡中下载SQLite Manager并运行select sqlite_version();。)

v3.7.4似乎创建了v3.6.23.1无法读取的数据库。我无法在release notes中明确说明这一点,但通过将cookies.sqlite文件与格式发生变化的file format documentation进行比较可以清楚地看到。具体来说,根据文档,字节19(0x13)应为1,但cookies.sqlite文件中的该字节为2。根据文件:

  

如果读取大于1的值   SQLite,然后库将拒绝   打开数据库。

     

就像描述的“写版本”一样   以上,此字段存在以方便   某种程度的前向兼容性,   万一需要它。如果一个   在。中创建的SQLite版本   未来使用的文件格式可能不会   被旧的SQLite安全阅读   版本,然后将设置此字段   大于1的值。

要读取数据库,您需要使用最新版本的SQLite;遗憾的是System.Data.SQLite近一年没有更新。该项目后来被sqlite.org接管,但是downloads are not currently available

如果您不想等待sqlite.org发布基于v3.7.x的.NET包装器,您可以尝试下载source并手动将SQLite.NET/SQLite.Interop/src/sqlite3.c升级到最新版本合并C源文件(可用here)。

编辑:正如sdwilsh所述,Firefox 4.0使用Write-Ahead Logging;正如新记录模式的描述所述:

  

因此,如果是旧版本的SQLite   尝试连接到SQLite   在WAL中运行的数据库   模式,它将报告错误   “文件加密或是   不是数据库“。

答案 1 :(得分:3)

我遇到了同样的问题。以前我使用Python脚本(使用sqlite集成)从cookies.sqlite和perms.sqlite文件中获取数据。后者仍然可以正常工作。实际上,除了cookies.sqlite和places.sqlite之外,所有其他.sqlite文件都是可读的。这两个产生“加密或不是数据库”错误。

我没有搜索Python(或sqlite3)的升级,而是为.sqlite文件创建了一个补丁。这个C代码将偏移18和19处的字节从2更改为1.我在Cygwin下的Windows上运行它,但它应该在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);
}

答案 2 :(得分:2)

您好,非常感谢您的回答!

我以这种方式使我的应用程序工作:

1。 我在这里下载了当前ADO.NET Connector for .NET 4.0的源代码:http://system.data.sqlite.org/index.html/timeline?r=trunk

也许您必须首先使用匿名用户名和capcha作为密码登录网站。

2。 我通过下载安装此ADO.NET连接器获得了sqlite3.dll v.3.7.4的预编译版本:http://www.devart.com/dotconnect/sqlite/ (您也可以使用ADO.NET连接器库来替换system.data.sqlite.org中的连接器。 我自己只对sqlite3.dll感兴趣。)

3。 从system.data.sqlite.org编译源代码后,我将生成的System.Data.Sqlite.dll和sqlite3.dll复制到我的应用程序输出目录。请注意,这两个DLL都是针对x86或x64机器编译的。

此致

答案 3 :(得分:-1)

我想我遇到了你的问题。您的数据库连接正常。首先,您使用的是哪个版本的dotnetFramework?因此,您可以下载并使用System.Data.SQLite.dll文件到您的参考文献,然后您的问题可能会得到解决。我认为你使用的是较旧的System.Data.SQLite.dll文件(与你的dot net版本不符)。