2013-10-08 91 views
1

我正嘗試使用ZeosLib組件和Delphi XE2讀取sqlite數據庫。除了當我嘗試讀取存儲的三個時間戳值(基本上是17位數字)時,一切都可以正常工作。相反,獲得適當的價值,我得到零。函數讀取數據庫中的數據(表爲註釋行):Zeoslib無法從sqlite數據庫中讀取LargeInt字段

procedure TCookieImporter.LoadCookies(const AChromeDatabase: String); 
var 
    zconn   : TZConnection; 
    zquery   : TZReadOnlyQuery; 
    creation_utc : Int64; 
    expires_utc : Int64; 
    last_access_utc: Int64; 
    host_key  : String; 
    name   : String; 
    value   : String; 
    path   : String; 
    secure   : Integer; 
    httponly  : Integer; 
    has_expires : Integer; 
    persistent  : Integer; 
    priority  : Integer; 
    cookie   : TChromeCookie; 
begin 
    zconn := TZConnection.Create(nil); 
    try 
    zconn.Protocol := 'sqlite-3'; 
    zconn.Database := AChromeDatabase; 
    zconn.Connect; 
    if zconn.Connected then 
    try 
     zquery := TZReadOnlyQuery.Create(nil); 
     try 
     zquery.Connection := zconn; 
     zquery.SQL.Text := 'SELECT * FROM cookies'; 
     zquery.Active := TRUE; 
     while not zquery.Eof do 
     begin 
      // bug: following three lines - they all return zero 
      creation_utc := zquery.FieldByName('creation_utc').AsLargeInt; 
      expires_utc := zquery.FieldByName('expires_utc').AsLargeInt; 
      last_access_utc := zquery.FieldByName('last_access_utc').AsLargeInt; 

      // debug info for SO 
      WriteLn(zquery.FieldDefs[0].Name); // = creation_utc 
      WriteLn(zquery.FieldDefs[0].Size); // = 0 
      WriteLn(zquery.FieldByName('creation_utc').AsString); // = 0 
      WriteLn(VarToStr(zquery.FieldValues['creation_utc'])); // = 0 
      dt := zquery.FieldDefs[0].DataType; // dt = ftInteger 

      host_key := zquery.FieldByName('host_key').AsString; 
      name := zquery.FieldByName('name').AsString; 
      value := zquery.FieldByName('value').AsString; 
      path := zquery.FieldByName('path').AsString; 
      secure := zquery.FieldByName('secure').AsInteger; 
      httponly := zquery.FieldByName('httponly').AsInteger; 
      has_expires := zquery.FieldByName('has_expires').AsInteger; 
      persistent := zquery.FieldByName('persistent').AsInteger; 
      priority := zquery.FieldByName('priority').AsInteger; 

      cookie := TChromeCookie.Create(creation_utc, host_key, name, value, path, expires_utc, secure, httponly, last_access_utc, has_expires, persistent, priority); 
      FChromeCookies.Add(cookie); 

      zquery.Next; 
     end; 
     finally 
     zquery.Free; 
     end; 
    finally 
     zconn.Disconnect; 
    end; 
    finally 
    zconn.Free; 
    end; 
end; 

我已經試過了,我便想起,從簡單的獲得價值與.AsLargeInt()吸氣一切,得到它爲Variant,然後鑄造Integer/Int64/String等。在所有情況下,我得到零作爲返回值。我也嘗試過不同版本的ZeosLib,特別是7.0.6-stable7.1.1-rc。由於與Delphi的新版本不兼容,無法使用6.6.6-stable進行編譯。

下面是數據的外觀,當我使用SQLite管理器(火狐插件)打開它,如:

cookies table data

而且表結構:

cookies table structure

我已經試過另一種方法,通過與DISqlite3組件讀取數據,他們的工作,但他們是共享軟件,我寧願去與免費軟件,如果可能的話。

任何想法是什麼造成這個奇怪的錯誤?

+1

嘗試TRUNC(... AsDouble)。不完美,但可能工作。或者我們的開放源代碼類,以全速直接訪問SQl​​ite3 - 請參閱http://blog.synopse.info/post/2011/07/22/SynDBSQLite3%3A-SQLite3-direct-access - 而不是Int64大問題數字。 :) –

+0

謝謝一堆。我現在要給SynDBSQLite3一個。 Trunc()並沒有做這個技巧。 –

+0

嘗試將字段定義爲BIGINT;看到這裏的帖子:http://zeoslib.sourceforge.net/viewtopic.php?f=5&t=1275 –

回答

0

要回答我的問題,我創建了自己的官方論壇上線,並得到如下回應:

的Zeos是一種常見的訪問組件。我知道我們可以假設Integer字段的Int64類型。

其實我們用BIGINT來假設TLongInt-Fields。最關注的RDBM正在使用哪個。

這是一個公開討論。 Internaly SQLite接受兩個用於準備狀態的Integer綁定。這不是一個問題,使這個補丁..

所以其他人可以張貼在這裏,如果我們應該改變這一點或不。如果您有疑問,請參閱7.2,而不是7.0或7.1。想想:這是一個長期存在的代碼。如果用戶在那裏更新組件,它可能會造成很多麻煩。

[link to the thread]