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