我正尝试使用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 –