Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.01.2012, 13:33
MadFroG MadFroG вне форума
Прохожий
 
Регистрация: 19.01.2012
Сообщения: 4
Репутация: 10
По умолчанию Загрузка файла в Blob через OpenDialog

Всем Привет.
Помогите пожалуйста найти ошибку или недочёт в коде. Пытаюсь загрузить документ в blob ячейку в базе sql. Иногда первый раз загружается нормально, но иногда выдаёт ошибку "процесс не может получить доступ к файлу так как этот файл занят другим процессом".

В чем ошибка - никак не могу понять. То загружается, то нет.

Код:
//sdstemp2: TSimpleDataSet;

procedure TfmMain.btnCreateDocClick(Sender: TObject);  // кнопка добавляет новую запись
begin

sdstemp2.Insert;  
sdstemp2.Fields[0].Value:=1;

end;

procedure TfmMain.BitBtn2Click(Sender: TObject); // кнопка выбора документа
begin

     if OpenDialog2.Execute then
     begin
       if not FileExists(OpenDialog2.FileName) then
        begin
        ShowMessage('Файл не найден.');
       Exit;
      end
      else
       tblobfield(sdstemp2.FieldByName('document')).LoadFromFile(OpenDialog2.FileName);
     end;

end;


procedure TfmMain.BitBtn5Click(Sender: TObject);  // кнопка Post
begin

  sdstemp2.Post;
  sdstemp2.ApplyUpdates(0);
  sdstemp2.Refresh;

  statusbar1.Panels[0].Text:='документ загружен';
  opendialog2.Free;

end;

собственно ошибка
http://saveimg.ru/show-image.php?id=...2e7304121d870d

Так же есть кнопка открытия документа. Работает хорошо, до тех пор, пока не попробуешь загрузить документ. После этого опять вылезает та же самая ошибка.

Код:
//sdsopendoc: TSimpleDataSet;


procedure TfmMain.BitBtn1Click(Sender: TObject);
var
ptkwrd:Tmemorystream;
begin

sdsopendoc.Open;
ptkwrd:= Tmemorystream.Create;
tblobfield(sdsOpenDoc.FieldByName('document')).SaveToStream(ptkwrd);
ptkwrd.Position:=0;
ptkwrd.SaveToFile('tmp/temp_document.doc');
shellexecute(Handle, 'open','tmp/temp_document.doc',nil,nil,SW_SHOWNORMAL);
ptkwrd.Free;

end;

Последний раз редактировалось MadFroG, 19.01.2012 в 13:41.
Ответить с цитированием
  #2  
Старый 22.01.2012, 12:54
MadFroG MadFroG вне форума
Прохожий
 
Регистрация: 19.01.2012
Сообщения: 4
Репутация: 10
По умолчанию

проблемы решил, дело было как всегда в моей тупости и с БД не имело никакой связи.
Но теперь появилсь проблема, при нажатии на кнопку

Код:
procedure TfmMain.BitBtn5Click(Sender: TObject);
begin

 sdstemp2.Post;
 sdstemp2.ApplyUpdates(0);
 sdstemp2.Refresh;

  statusbar1.Panels[0].Text:='документ загружен';

end;

почему-то отказывается работать процедура открытия файла из BLOB-ячейки. Хотя до её нажатия работает прекрасно.
Код:
procedure TfmMain.BitBtn1Click(Sender: TObject);
var
ptkwrd:Tmemorystream;
begin

ptkwrd:= Tmemorystream.Create;
 try
tblobfield(sdstemp2.FieldByName('document')).SaveToStream(ptkwrd);
ptkwrd.Position:=0;
ptkwrd.SaveToFile('tmp/temp_document.doc');
shellexecute(Handle, 'open','tmp/temp_document.doc',nil,nil,SW_SHOWNORMAL);
finally
ptkwrd.Free;
end;

end;

вот ошибка

Ответить с цитированием
  #3  
Старый 22.01.2012, 12:57
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

на рабочем столе нет папки tmp?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 22.01.2012, 13:59
MadFroG MadFroG вне форума
Прохожий
 
Регистрация: 19.01.2012
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
на рабочем столе нет папки tmp?
есть. все есть. BitBtn1Click кнопка отлично всё открывает и выводит в Word. До тех пор, пока не добавляешь в базу новую запись (сначала нажимаю btnCreateDoc, потом BitBtn2, потом BitBtn5 из первого моего сообщения) и не загружаешь туда новый файл Word. Потом начинает вылезать ошибка.
Где собака зарыта, так и не понял.

опять же, дело явно не связано с БД, а скорее с TMemoryStream, но раз уж тут по тупости сосдал тему, то прошу помоч =)

Последний раз редактировалось MadFroG, 22.01.2012 в 14:03.
Ответить с цитированием
  #5  
Старый 26.01.2012, 14:45
MadFroG MadFroG вне форума
Прохожий
 
Регистрация: 19.01.2012
Сообщения: 4
Репутация: 10
По умолчанию

Понял таки в чём дело. Дело в ShellExecute.
Почему то в начале ему хватало неполного пути 'tmp/temp_document.doc'.
Добавил туда полный путь к файлу и всё стало работать нормально.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:43.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter