Я пытаюсь прочитать базу данных sqlite с компонентами ZeosLib и Delphi XE2. Все работает отлично, за исключением случаев, когда я пытаюсь прочитать три сохраненных значения метки времени, которые в основном представляют собой 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()
геттера до получения его как Variant
, затем приведения к Integer
/Int64
/String
и т. д. Во всех случаях я получал ноль в качестве возвращаемого значения. Я также пробовал разные версии ZeosLib, особенно 7.0.6-stable
и 7.1.1-rc
. Не удалось скомпилировать с 6.6.6-stable
из-за несовместимости с более новыми версиями Delphi.
Вот как выглядят данные, когда я открываю их с помощью SQLite Manager (надстройка Firefox):
И структура таблицы:
Я пробовал другой подход, читая данные с помощью DISqlite3
компонентов, и они работают, однако они являются условно-бесплатными, и я бы предпочел использовать бесплатные, если это возможно.
Любые идеи, что вызывает эту странную ошибку?