首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zeoslib无法从sqlite数据库读取LargeInt字段

Zeoslib无法从sqlite数据库读取LargeInt字段
EN

Stack Overflow用户
提问于 2013-10-08 17:17:48
回答 1查看 850关注 0票数 1

我试着用ZeosLib组件和Delphi XE2来读取sqlite数据库。除了我试着读取三个存储的时间戳值(基本上是17位数字)外,一切都很完美。相反,得到适当的值,我得到零。读取数据库数据的函数(注意注释行):

代码语言:javascript
复制
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,然后再转换到.AsLargeInt()等等。在所有情况下,我得到的返回值为零。我也尝试过不同版本的ZeosLib,特别是7.0.6-stable7.1.1-rc版本。由于与较新版本的Delphi不兼容,无法使用6.6.6-stable one进行编译。

下面是使用SQLite管理器(firefox )打开数据时的样子:

和表格结构:

我尝试了另一种方法,使用DISqlite3组件读取数据,它们可以工作,但是它们是共享软件,如果可能的话,我宁愿使用免费软件。

知道是什么导致了这个奇怪的错误吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-09 00:58:39

为了回答我自己的问题,我在他们的官方论坛上创建了一个帖子,得到了以下回复:

Zeos是一个常见的访问组件。我知道我们可以假设Integer字段的Int64类型。 实际上,我们使用BIGINT来假设TLongInt。最常用的RDBM。 这是一个公开的讨论。Internaly SQLite接受准备状态的两个整数绑定。做这个补丁没问题..。 所以其他人可以在这里张贴,如果我们应该改变或不改变。如果你有疑问的话,在7.2,而不是在7.0或7.1。想想看:这是一个长期存在的代码。如果用户确实更新了这些组件,这可能会带来很多麻烦。

[链接到线程]

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19254180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档