Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2010, 14:19   #1
Drugnir
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 262
По умолчанию Delphi+FireBird из DBGrid в ...

у меня есть DBGrid мне надо с текущей строки передать одно поле в Edit другое это BLOB поле и его надо сохранить на диск.

Так же есть вопрос. Как можно зная имя юзера, передать все его заявки в DBGrid, если в переменной хранится его имя, заявка состоит из темы, которая берется из справочника, поля описания проблемы, имя юзера и BLOB поле с файлом который он загрузил.
Я думал хранимой процедурой, но с синтаксисом не справился, может кто помочь?
Не надо меня направлять в темы с BLOB, там такого нет. Как пользоваться именно текущей строкой в DBGride?

Последний раз редактировалось Drugnir; 04.12.2010 в 14:22.
Drugnir вне форума Ответить с цитированием
Старый 04.12.2010, 15:37   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

текущая строка DBGrid это текущая запись в наборе данных DBgrid.DataSource.dataSet.
Далле смотрим(ищем) поле fieldByName('youblobfield')
Далее как раз имеем то что вм не нужно
Цитата:
Не надо меня направлять в темы с BLOB
и после этого получаем
Edit1.Text:=
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 04.12.2010, 16:08   #3
Drugnir
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 262
По умолчанию

Спасибо, сейчас посмотрю

Вот только с BLOB что делать как его на диск сохранить
пробую вот так и не соответствие выходит

Код:
var f:file;
     bufi: array [1..2048] of Char;
begin
 bufi:=DBGrd1.DataSource.DataSet.FieldByName('File_Name').AsBlob;
 if SaveFile.Execute
  then
  begin
    AssignFile(f, SaveFile.Name);
    Rewrite(f, 1);
    repeat
    BlockWrite(f,Bufi, SizeOf(Bufi), NumWrite);
    until NumWrite<>SizeOf(Bufi);
  end;
Такой способ написан в help delphi, только вот как представить Blob поле непонятно
и как потом использовать SaveDialog?

А как быть с юзером?

Последний раз редактировалось Stilet; 04.12.2010 в 18:12.
Drugnir вне форума Ответить с цитированием
Старый 04.12.2010, 19:30   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Сохранение и чтение файлов в BLOB-полях

Код:
// Сохраняем
procedure TForm1.Button1Click(Sender: TObject); 
var 
blob: TBlobStream; 
begin 
blob := yourDataset.CreateBlobStream(yourDataset.FieldByName('YOUR_BLOB'), bmWrite); 
try 
blob.Seek(0, soFromBeginning); 
fs := TFileStream.Create('c:\your_name.doc', fmOpenRead or 
fmShareDenyWrite); 
try 
blob.CopyFrom(fs, fs.Size) 
finally 
fs.Free 
end; 
finally 
blob.Free 
end;

// Загружаем
procedure TForm1.Button1Click(Sender: TObject); 
var 
blob: TBlobStream; 
begin 
blob := yourDataset.CreateBlobStream(yourDataset.FieldByName('YOUR_BLOB'), bmRead); 
try 
blob.Seek(0, soFromBeginning); 

with TFileStream.Create('c:\your_name.doc', fmCreate) do 
try 
CopyFrom(blob, blob.Size) 
finally 
Free 
end; 
finally 
blob.Free 
end;
mihali4 вне форума Ответить с цитированием
Старый 05.12.2010, 02:36   #5
Drugnir
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 262
По умолчанию

Спасибо, только у меня чет нету TBlobStream, по-этому написал просто TStream и заработало

Пишу как вы и говорили, выдает ошибку canmodify read-only dataset
уже и добавил в код
DataModule1.ds2(мой датасет).CanModify:=True;
DataModule1.ds2.Edit;
при сохранении, т.к. до этого сохранял через BlockRead, а выгрузил как вы посоветовали, в итоге файл оказался пустым

И еще таким способом будет выбрана текущая запись или первая, не понятно.
Если не сложно, то объясните.

Последний раз редактировалось mihali4; 05.12.2010 в 17:08.
Drugnir вне форума Ответить с цитированием
Старый 05.12.2010, 23:44   #6
Drugnir
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 262
По умолчанию

Было мало буфера с этим справился, вот только теперь с кодировками проблемы какие-то, везде win1251 стоит, а в файл одни квадратики закидываются. Может это быть из-за разных способов загрузки и выгрузки файла?
загружаю так


var f:file;
bufi: array [1..2048] of Char;
NumRead:integer;
if OpenFile.Execute
then
begin
AssignFile(f, OpenFile.Name);
Rewrite(f, 1);
repeat
BlockRead(f,Bufi, SizeOf(Bufi), NumRead);
until NumRead=0;
end;
Query1.ParamByName('MyFile').AsBlob :=Bufi


И вот что получается либо загрузить не могу через потоки, так как выдает ошибку not in edit mode
либо выгрузить файл через BlockWrite не могу
А два разных метода загрузки и выгрузки ломают кодировку и в файл выгружаются квадратики

Последний раз редактировалось Drugnir; 06.12.2010 в 00:42.
Drugnir вне форума Ответить с цитированием
Старый 07.12.2010, 01:07   #7
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Писал, писал, потом всё стёр
вот ссылка там в общем понятно.
vovk вне форума Ответить с цитированием
Старый 07.12.2010, 14:01   #8
Drugnir
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 262
По умолчанию

Спасибо. Очень много интересного нашел. Пишу вот такой несложный запрос, но выбрасывает ошибки типа не могу считать кусок памяти может это где-то в настройках компонент доступа в базу надо или в коде есть, можете посмотреть?

try
DataModule1.tr3.StartTransaction;
DataModule1.q1.SQL.Text:=('INSERT INTO ZAYAVKA (ID_ZAYAVKI, ID_NAME, UTOCHNENIE, OPISANIE, DATA, USER_NAME, FILE_NAME) VALUES (:ID_ZAYAVKI, :ID_NAME, :UTOCHNENIE, :OPISANIE, :DATA, :USER_NAME, :FILE_NAME)');
DataModule1.q1.Prepare;
DataModule1.q1.ParamByName('ID_ZAYA VKI').Value:= null;
DataModule1.q1.ParamByName('UTOCHNE NIE').AsString:=Edt1.Text;
DataModule1.q1.ParamByName('OPISANI E').AsString:=mmo1.Text;
DataModule1.q1.ParamByName('DATA'). AsDateTime:=Date;
DataModule1.q1.ParamByName('USER_NA ME').AsString:=Nick;
DataModule1.q1.ParamByName('ID_NAME ').Value:=DataModule1.ds1.FieldByNa me('ID_NAME').Value;
TBlobField(DataModule1.q1.ParamByNa me('FILE_NAME')).LoadFromFile(sPath +'\1.txt');
DataModule1.q1.ExecSQL;
DataModule1.tr3.Commit;
ShowMessage('Заявка отправлена');
except
DataModule1.tr2.Rollback;
end;
Drugnir вне форума Ответить с цитированием
Старый 07.12.2010, 14:21   #9
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

А какие компоненты для доступа к базе используете?
vovk вне форума Ответить с цитированием
Старый 07.12.2010, 23:38   #10
Drugnir
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 262
По умолчанию

IBDataBase, DataSource, IBTransaction, IBDataSet, IBQuery, IBStoredProc
Даже поставил кэш везде на 20кб
Drugnir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Firebird vs Delphi HELP! paSHIZ БД в Delphi 4 13.01.2009 12:19
Как поле FireBird.домен.Numeric(7,2) увидеть в DBGrid с добной частью? Vladimir Trufanov БД в Delphi 2 07.01.2009 10:00