我正在尝试使用ZeosLib组件和Delphi XE2读取sqlite数据库。一切都很完美,除非我尝试读取存储的三个时间戳值,基本上是17位数字。相反,获得正确的价值,我得到零。读取数据库数据的功能(注意注释行):
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()
getter获取价值,到将其设为Variant
,然后转换为Integer
/ Int64
/ String
等。在所有情况下,我得到零作为返回值。我也尝试过不同版本的ZeosLib,特别是7.0.6-stable
和7.1.1-rc
版本。由于与较新版本的Delphi不兼容,无法使用6.6.6-stable
进行编译。
以下是使用SQLite Manager(firefox插件)打开数据时的样子:
表格结构:
我尝试了另一种方法,通过使用DISqlite3
组件读取数据,它们可以工作,但它们是共享软件,如果可能的话,我宁愿选择免费软件。
任何想法导致这个奇怪的错误?
答案 0 :(得分:0)
为了回答我自己的问题,我在他们的官方论坛上创建了帖子,得到了以下回复:
Zeos是一种常见的访问组件。我知道我们可以为Integer字段假设Int64类型。
实际上我们使用BIGINT来假设TLongInt-Fields。大多数RDBM都在使用它。
这是一个公开的讨论。 Internaly SQLite为准备好的语句接受两个Integer绑定。制作这个补丁不是问题..
所以如果我们应该改变这个,别人可以在这里发帖。如果您怀疑,请在7.2上,而不是7.0或7.1。想一想:这是一个长期存在的代码。如果用户确实更新了组件,它可能会带来麻烦。