Страница 1 из 1

Blob поле из SqLite. Набор байтов

СообщениеДобавлено: 15.04.2016 19:04:17
Leonius_Bad
Привет.
Имеется необходимость считать поле типа Blob из базы SqLite.
SQLite Manager (Firefox-addon) и SQlite Viewer отображает размер поля равный 230 байтам.
Мне нужен именно набор байт, не нужного его во что-то преобразовывать (не в изображение или что-то подобное).

Испробовал несколько найденных в интернетах методов, не завелся не один. :?
Код: Выделить всё
var
arB:TBytes;
bf:TBlobField;
Stream:TStream;
//<...>
SQLite := TSqlite3Dataset.Create(nil);
//Задаем свойства FileName, TableName, SQL
SQLite.Open;
SQLite.First;  //Запрос выполняется. НЕблоб поля считываются нормально.

//Первый способ
arB:=SQLite.FieldByName('bytes').AsBytes;
//Length(arB); всегда будет 255, хотя по логике должен бы вернуть заветные 230?

//Второй способ
BF:=TBlobField.Create(nil);
BF:=SQLite.FieldByName('bytes') as TBlobField;
//BF.BlobSize - вообще выдает ошибку, но FSIZE опять 255

//Третий способ (ну а вдруг бы?)) )
st:=SQLite.FieldByName('bytes').AsString;
//Длина вовсе будет нулевой, а содержимое содержать что-то несусветное, но явно не исходные байты (выводил в файл TFileStream)

//Четвертый способ
    Stream:=SQLite.CreateBlobStream(SQLite.FieldByName('bytes'), bmRead);
    BF:=TBlobField.Create(nil);
    BF.LoadFromStream(Stream);
//На третьей строке ошибка, т.к. Stream.size имеет длину в 1-ку и вновь косой.


Как же в итоге читать эти грешные блобы?:(

Re: Blob поле из SqLite. Набор байтов

СообщениеДобавлено: 15.04.2016 19:17:55
Снег Север

Re: Blob поле из SqLite. Набор байтов

СообщениеДобавлено: 16.04.2016 09:53:52
Leonius_Bad
Снег Север писал(а):гляньте тут:
http://forums.indasoftware.com/topic/14/blob-example/

SQLite3Wrap и этот самый загадочный TSQLite3Statement не найдены.

Можно ли как-то обойтись тем, что уже имею? А именно TSqlite3Dataset..

К тому же, метод чтения в поток я вроде уже пробовал, хотя там и поток другого типа.

Re: Blob поле из SqLite. Набор байтов

СообщениеДобавлено: 16.04.2016 21:24:00
Снег Север
Leonius_Bad писал(а):SQLite3Wrap и этот самый загадочный TSQLite3Statement не найдены.

https://github.com/indasoftware/SQLite3-Delphi-FPC
Leonius_Bad писал(а):Можно ли как-то обойтись тем, что уже имею?

Вы читать, как по ссылке, в мемористрим пробовали? И разбирать уже его содержимое побайтно?

Re: Blob поле из SqLite. Набор байтов

СообщениеДобавлено: 17.04.2016 15:25:26
Leonius_Bad
Снег Север писал(а):Вы читать, как по ссылке, в мемористрим пробовали? И разбирать уже его содержимое побайтно?

Пробовал. Считывал из TField, затем писал в файл SaveToFile и сравнивал с импортируемым образцом (тем, с которого считывали).
Не то выходит..=\

Еще немного помучаюсь со стандартными средствами и перейду на Вами указанную плюшку.

Re: Blob поле из SqLite. Набор байтов

СообщениеДобавлено: 24.04.2016 10:32:11
Leonius_Bad
Снег Север писал(а):https://github.com/indasoftware/SQLite3-Delphi-FPC

Всё получилось. Спасибо за подсказку.
Сделал вот так.
Код: Выделить всё
uses SQLite3Wrap;
var
  DB: TSQLite3Database;
  Stmt: TSQLite3Statement;
  P:Pointer;
BEGIN
    DB := TSQLite3Database.Create;
    DB.Open('Login Data');
    Stmt:= DB.Prepare('SELECT name, bytes_set FROM tests;');
    Stmt.Step;
   
    MS:=TMemoryStream.Create;;
    MS.SetSize(Stmt.ColumnBytes(1));
    Ms.Write(Stmt.ColumnBlob(1)^, Stmt.ColumnBytes(1));
    MS.Position:=0;

    GetMem(P, Stmt.ColumnBytes(2));
    MS.Read(P^, Stmt.ColumnBytes(1));
    MS.Free;
    //<Действия с набором байт, на который указывает P>
    FreeMem(P);

END.