Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Подключение к БД SQLite, FireDAC и Delphi RAD XE5


Автор: typearray 19.3.2014, 16:44
Здравствуйте!

Решил потренироваться и сделать небольшое приложение на последней версии Embarcadero® Delphi® XE5. Так как я ранее изучал Delphi 7, то ... хм ... в общем нововведений так много, что глаза на лбу...

Помогите, пожалуйста разобраться с:

0) Как корректно подключатся к БД SQLite? При выполнении запроса к БД нужно подключиться со своими параметрами, выполнить запрос, а потом отключиться, освободив БД? Или же можно один раз подлючиться вначале и отключаться при событии закрытия формы? Повлияет ли это на скорость работы приложения?

1) SQLite. Настроил, с горем пополам, соединение с помощью: FDConnection1: TFDConnection; FDPhysSQLiteDriverLink1: TFDPhysSQLiteDriverLink; FireDAC коннект и драйвер SQLite.
Вопрос: как сделать правильный SELECT BLOB?

Таблица blocks:
id (int)
bname (text)
bfile (blob)

Пробую так:
var BlobStream: TStream;
...
DataModule1.FDConnection1.Connected := True;
...
DataModule1.FDQuery1.Open('SELECT * FROM blocks WHERE id = 1');
BlobStream := DataModule1.FDQuery1.CreateBlobStream(DataModule1.FDQuery1.FieldByName('bfile'), ??????); - тут ошибка, не знаю что нужно...
RichEdit1.Lines.LoadFromStream(BlobStream);

2) Как сделать корректный INSERT в БД с помощью FireDAC?

Автор: Antimol 19.3.2014, 19:36
0) Если подключаться через FDConnection тогда открывать подключение при старте приложения.
При уничтожении приложения закрывайте подключение.

1) А почему бы не вывести данные с помощью DBMemo

Автор: typearray 19.3.2014, 20:46
Antimol, Спасибо за отклик! Можно подробнее про DBMemo? Есть какой-нибудь простой путь выбрать SELECT'ом BLOB-текст из БД в DBMemo?

Автор: Antimol 19.3.2014, 22:43
Можно написать простой запрос вида:


Код

Select ID, BLOB_FIELD_NAME FROM SOME_TABLE

где BLOB_FIELD_NAME - blob поле

дальше в Delphi на форму переносим компонент (FDConnection - предполагаем что уже настроен) FDQuery, DataSource, DBMemo

Настраиваем компоненты:

FDQuery.Connection := FDConnection;
FDQuery.SQL = 'вышеописанный  запрос'

DataSource.DataSet = FDQuery

DBMemo.DataSource =  DataSource
DBMemo.DataField (кажется так называется) = BLOB_FIELD_NAME 





Автор: typearray 20.3.2014, 08:06
Antimol, Благодарю за внимание! Сделал всё-таки через Stream...

Надеюсь кому-нибудь пригодится:

0) Подключаться к базе можно 1 раз "вначале" и отключаться в "конце".

1) Выбрать BLOB получилось так:

uses ... Data.DB (нбх для TBlobStreamMode.bmRead)

var BlobStream: TStream;

// Выборка блока данных
with DataModule1.FDQuery1 do begin
Active := False;
SQL.Clear;
SQL.Add('SELECT *');
SQL.Add('FROM blocks');
SQL.Add('WHERE id = "'+UTF8Encode(id)+'"');
Active := True;

BlobStream := CreateBlobStream(FieldByName('bfile'), TBlobStreamMode.bmRead); !!!
end;

RichEdit1.Lines.LoadFromStream(BlobStream);

2) Можно использовать следующее
function GetFileAsBytesValue(AFileName: TFileName): TArray<Byte>;
var
Len: Integer;
LStream: TMemoryStream;
begin
LStream := TMemoryStream.Create;
try
LStream.LoadFromFile(AFileName);
Len := LStream.Size;

SetLength(Result, Len);
Move(LStream.Memory^, Result[0], Len);
finally
LStream.Free;
end;
end;

procedure dmDB.InsertPicture;
const
QRY = 'INSERT INTO Memo(Picture) VALUES(?)';
var
LTransaction: TDBXTransaction;
LDBXCmd: TSQLQuery;
LParam: TParam;
begin
LTransaction := FDBCon.BeginTransaction;
LDBXCmd := TSQLQuery.Create(FDBCon);
try
try
LDBXCmd.SQLConnection := FDBCon;
LDBXCmd.SQL.Text := QRY;
LParam := LDBXCmd.Params.CreateParam(ftBlob, 'Picture', ptInput);
LParam.AsBlob := GetFileAsBytesValue('d:\sample.bmp');
LDBXCmd.ExecSQL;
except
on E: Exception do
FDBCon.RollbackFreeAndNil(LTransaction);
end;
FDBCon.CommitFreeAndNil(LTransaction);
finally
LDBXCmd.Free;
end;
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)