2013-10-08 60 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]