| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
Можно написать простой запрос вида:
где 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; |