我正嘗試使用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-stable
和7.1.1-rc
。由於與Delphi的新版本不兼容,無法使用6.6.6-stable
進行編譯。
下面是數據的外觀,當我使用SQLite管理器(火狐插件)打開它,如:
而且表結構:
我已經試過另一種方法,通過與DISqlite3
組件讀取數據,他們的工作,但他們是共享軟件,我寧願去與免費軟件,如果可能的話。
任何想法是什麼造成這個奇怪的錯誤?
嘗試TRUNC(... AsDouble)。不完美,但可能工作。或者我們的開放源代碼類,以全速直接訪問SQlite3 - 請參閱http://blog.synopse.info/post/2011/07/22/SynDBSQLite3%3A-SQLite3-direct-access - 而不是Int64大問題數字。 :) –
謝謝一堆。我現在要給SynDBSQLite3一個。 Trunc()並沒有做這個技巧。 –
嘗試將字段定義爲BIGINT;看到這裏的帖子:http://zeoslib.sourceforge.net/viewtopic.php?f=5&t=1275 –