Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Запись собственного типа данных в BLOB поле Firebird / 24 сообщений из 24, страница 1 из 1
25.04.2018, 14:11
    #39636042
FIL23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
Здравствуйте.

Есть ли возможность записать и считать собственный типа данных в/из BLOB поля БД Firebird?

Если, да есть у кого ни будь простой пример этих операций.

Спасибо.
...
Рейтинг: 0 / 0
25.04.2018, 14:17
    #39636044
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
FIL23Есть ли возможность записать и считать собственный типа данных в/из BLOB поля БД Firebird?

BLOB-у сугубо всё равно как и что ты в него записываешь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.04.2018, 14:18
    #39636045
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
FIL23,

Обычный binary blob. И пиши/читай что хочешь (хинт - MemoryStream тебе в помощь).
...
Рейтинг: 0 / 0
25.04.2018, 14:19
    #39636047
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
FIL23,

TBlobField.LoadFromFile
TBlobField.LoadFromStream
TBlobField.SaveToFile
TBlobField.SaveToStream
...
Рейтинг: 0 / 0
25.04.2018, 14:41
    #39636058
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
Да что же вы все фигню советуете? Какой MemoryStream, какой SaveToStream?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure ParseBlob(AField: TField);
var
  Strm: TStream;
begin
  Strm := AField.DataSet.CreateBlobStream(AField, bmRead);
  try
    ...........
  finally
    Strm.Free;
  end;
end;
...
Рейтинг: 0 / 0
25.04.2018, 14:44
    #39636063
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
FIL23> Если, да есть у кого ни будь простой пример этих операций.

О чём речь? Просто записать/прочитать BLOB из БД умеешь?
А-то тебе щас скажешь про BLOB-фильтры, и ты уйдешь не в
том направлении, время зря потратишь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.04.2018, 15:11
    #39636085
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
_Vasilisk_,

Ну вот не надо - к моей либе как раз то, что YuRock показал, ближе. И вообще, чего все решили, что там Дельфи, которую тут никто не знает?
...
Рейтинг: 0 / 0
25.04.2018, 15:16
    #39636092
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
DarkMaster...чего все решили, что там Дельфи, которую тут никто не знает?
Тогда бы ТС здесь не побирался.
...
Рейтинг: 0 / 0
25.04.2018, 15:23
    #39636099
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
DarkMasterНу вот не надо - к моей либе как раз то, что YuRock показал, ближе.Зачем данные туда-сюда гонять по памяти? Чтобы процессор не остывал?
...
Рейтинг: 0 / 0
25.04.2018, 15:25
    #39636101
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
DarkMasterИ вообще, чего все решили, что там Дельфи, которую тут никто не знает?
Да, действительно. Особенно учитывая, что указан именно Firebird, надо было сразу советовать:

isc_open_blob2
isc_blob_info
isc_get_segment/isc_put_segment
isc_close_blob
...
Рейтинг: 0 / 0
25.04.2018, 15:29
    #39636104
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
_Vasilisk_DarkMasterНу вот не надо - к моей либе как раз то, что YuRock показал, ближе.Зачем данные туда-сюда гонять по памяти? Чтобы процессор не остывал?
Да, лучше CreateBlobStream, конечно.
...
Рейтинг: 0 / 0
25.04.2018, 15:34
    #39636110
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
YuRockДа, действительно. Особенно учитывая, что указан именно Firebird, надо было сразу советовать:

isc_open_blob2
isc_blob_info
isc_get_segment/isc_put_segment
isc_close_blobДля конкретно IBX CreateBlobStream создает экземпляр класса TIBBlobStream, который оперирует именно этими функциями.

Еще раз вопрос. Назовите хоть одну причину по которой TBlobField.SaveToStream(MemoryStream) лучше чем TDataSet.CreateBlobStream?

А в особенности с учетом этого
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TBlobField.SaveToStream(Stream: TStream);
var
  BlobStream: TStream;
begin
  BlobStream := DataSet.CreateBlobStream(Self, bmRead);
  try
    Stream.CopyFrom(BlobStream, 0);
  finally
    BlobStream.Free;
  end;
end;
...
Рейтинг: 0 / 0
25.04.2018, 15:45
    #39636126
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
_Vasilisk_Еще раз вопрос. Назовите хоть одну причину
Та нету никакой причины. Если удобно использовать CreateBlobStream - конечно, лучше так.
А если уже есть какой-то Stream, уже созданный, то не важно (по скорости и памяти), как писать:

Код: pascal
1.
2.
3.
4.
5.
6.
BlobStream := DataSet.CreateBlobStream(Self, bmWrite);
try
  BlobStream.CopyFrom(Stream, 0);
finally
  BlobStream.Free;
end;


или
Код: pascal
1.
LoadFromStream(Stream);


Но 2-й вариант короче.
...
Рейтинг: 0 / 0
25.04.2018, 16:07
    #39636149
FIL23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
Поразбираюсь в теме еще... пойду читать...

Я то думал что в BLOB можно так же заносить данные через параметры запроса.
...
Рейтинг: 0 / 0
25.04.2018, 16:27
    #39636178
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
_Vasilisk_Для конкретно IBX CreateBlobStream создает экземпляр класса TIBBlobStream, который
оперирует именно этими функциями.

Он-то, конечно, оперирует, но при этом кэширует всё содержимое блоба в ОЗУ. Оно кому-то
надо?..

FILЯ то думал что в BLOB можно так же заносить данные через параметры запроса.
Ты не поверишь, но параметры запроса - единственный корректный способ занесения данных в BLOB.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.04.2018, 16:30
    #39636182
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
FIL23...Я то думал что в BLOB можно так же заносить данные через параметры запроса.
А теперь выяснил, что нельзя? А каким образом (выяснил)?

Я вот "через параметр" делаю, и ни жу-жу:
Код: sql
1.
2.
3.
4.
 insert into MYTABLE
  (ID, BLOB_FIELD)
values
  (:ID, :BLOB_FIELD)



Код: pascal
1.
2.
3.
4.
5.
...
fQuery.ParamByName('BLOB_FIELD').LoadFromFile('C:\Text.txt');
fQuery.ParamByName('BLOB_FIELD').LoadFromStream(fMyStream);
fQuery.ParamByName('BLOB_FIELD').AsString := 'Привет';
fQuery.ParamByName('BLOB_FIELD').AsInteger := 123;



FIBPlus.

Можешь, конечно, TBlobStream ручками создавать, если не лень. Мне - лень.
...
Рейтинг: 0 / 0
25.04.2018, 17:18
    #39636243
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
_Vasilisk_DarkMasterНу вот не надо - к моей либе как раз то, что YuRock показал, ближе.Зачем данные туда-сюда гонять по памяти? Чтобы процессор не остывал?

Гм... Ну вот если я назову метод LoadFromBlob() - я буду гонять по памяти или нет?
...
Рейтинг: 0 / 0
25.04.2018, 17:57
    #39636281
FIL23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
Почитал немного, нашел еще примеров.

Напишу ответ сюда , возможно кому то пригодится.

Код: pascal
1.
2.
3.
4.
5.
type
      type_ParametersOfEvents =record
      UserID                              :integer;   
      Path                                :string;     
      end;



Записываем.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
function insertData(perParametersOfEvents:type_ParametersOfEvents):boolean;
var
  per_IBQuery:TIBQuery;
  Stm: TMemoryStream;
begin
      per_IBQuery.Active := False;
      per_IBQuery.SQL.Clear;
      per_IBQuery.SQL.Add('insert into LOGS '
                          + '(PARAMETERS '                  

                          + ')'
                          + ' values ('
                          + ':perID_USER '
                          + ')');


    Stm := TMemoryStream.Create( );
    try

       Stm.Write( perParametersOfEvents, sizeof(perParametersOfEvents) );


       Stm.Position := 0;
       per_IBQuery.ParamByName('perID_USER').LoadFromStream( Stm, ftBlob);
 
    finally
       FreeAndNil(Stm)
    end; // finally


      per_IBQuery.ExecSQL;
      fmConnectToBase.IBTransaction2.Commit;
      FreeAndNil(per_IBQuery); 
end;



Читаем
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
function GetData(perID:integer):type_ParametersOfEvents;
var
  per_IBQuery:TIBQuery;
  stm: TStream;
begin
per_IBQuery.Active:=false;
per_IBQuery.SQL.Clear;
per_IBQuery.SQL.Add('select * from LOGS WHERE ID = :perID');  
if  perID=0 then per_IBQuery.ParamByName('perID').IsNull else  per_IBQuery.ParamByName('perID').AsInteger:=perID;
per_IBQuery.Active:=true;
per_IBQuery.Last;

stm := per_IBQuery.CreateBlobStream( per_IBQuery.FieldByName('PARAMETERS'), bmRead);
   try // finally
      stm.Position := 0;
      stm.Read( result, sizeof(result) );
   finally
      stm.Free;
   end;
end;
...
Рейтинг: 0 / 0
25.04.2018, 18:02
    #39636284
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
FIL23Напишу ответ сюда

Зря. Это надо к Pcrepair, на его сайт валидного говнокода.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.04.2018, 18:26
    #39636298
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
Dimitry SibiryakovFIL23Напишу ответ сюда

Зря. Это надо к Pcrepair, на его сайт валидного говнокода.
Не страшно. Оно не взлетит всё равно.
...
Рейтинг: 0 / 0
25.04.2018, 18:30
    #39636300
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
FIL23,
строки таким образом писать нельзя. Для строки SizeOf() даст размер указателя, т.е. для 32-битной программы - 4. И то, что вы запишете в блоб, там не будет содержимого строки.
Можно использовать в Record тип ShortString или писать как-то по-другому.
...
Рейтинг: 0 / 0
27.04.2018, 04:57
    #39637084
FIL23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
Мдааа.... при испытательном полёте произошёл взрыв, пришлось переписывать данный код.

Короче нашел в интернете годную статью http://gunsmoker.ru/2011/11/blog-post_12.html
опираясь на которую я смог написать код и понять что такое потоки.

Я знаю что автор сей статьи частенько бывает тут на форуме. Я довольно часто натыкаюсь на его блог при решении какого либо вопроса, поэтому ему респект за довольно качественный материал.
...
Рейтинг: 0 / 0
27.04.2018, 08:09
    #39637110
Любезный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
Тебе бы сначала изучить, как вообще различные переменные хранятся в памяти, чтобы научиться формировать блоки, способные записаться в блоб. Формируешь набор и заполняешь параметр. Универсального способа тут не существует от слова совсем.
...
Рейтинг: 0 / 0
27.04.2018, 10:53
    #39637210
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись собственного типа данных в BLOB поле Firebird
FIL23> Мдааа.... при испытательном полёте произошёл взрыв, пришлось переписывать данный код.

Это что за ещё полёт мысли? И как статья по ссылке относится к сабжу и БЛОБам?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Запись собственного типа данных в BLOB поле Firebird / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]