簡體   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