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

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

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

Сообщение Leonius_Bad » 15.04.2016 19:04:17

Привет.
Имеется необходимость считать поле типа 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-ку и вновь косой.


Как же в итоге читать эти грешные блобы?:(
Leonius_Bad
новенький
 
Сообщения: 51
Зарегистрирован: 29.11.2012 19:18:07

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

Сообщение Снег Север » 15.04.2016 19:17:55

Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2995
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение Leonius_Bad » 16.04.2016 09:53:52

Снег Север писал(а):гляньте тут:
http://forums.indasoftware.com/topic/14/blob-example/

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

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

К тому же, метод чтения в поток я вроде уже пробовал, хотя там и поток другого типа.
Leonius_Bad
новенький
 
Сообщения: 51
Зарегистрирован: 29.11.2012 19:18:07

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

Сообщение Снег Север » 16.04.2016 21:24:00

Leonius_Bad писал(а):SQLite3Wrap и этот самый загадочный TSQLite3Statement не найдены.

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

Вы читать, как по ссылке, в мемористрим пробовали? И разбирать уже его содержимое побайтно?
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2995
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение Leonius_Bad » 17.04.2016 15:25:26

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

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

Еще немного помучаюсь со стандартными средствами и перейду на Вами указанную плюшку.
Leonius_Bad
новенький
 
Сообщения: 51
Зарегистрирован: 29.11.2012 19:18:07

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

Сообщение Leonius_Bad » 24.04.2016 10:32:11

Снег Север писал(а):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.
Leonius_Bad
новенький
 
Сообщения: 51
Зарегистрирован: 29.11.2012 19:18:07


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru