Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ADO,FOX: файл уже используется??? [D6, dBase, FoxPro]


Алексей ©   (2004-09-09 16:40:00) 

Сообщение "Файл уже используется" при повторном обращении к таблице.
Получаю данные из таблицы:
MyQuery.Close;
MyQuery.SQL.Close;
MyQuery.SQL.Add('select a.поле1,b.поле2 from таблица1 а, таблица 2');
MyQuery.Open;
...
Обработка данных
...
MyQuery.Close;

Далее по ходу работы программы делаю:
  if FileExists('таблица2.dbf') then begin
     if not DeleteFile('таблица2.dbf') then begin
        MessageDlg('Не смог удалить таблица2.dbf',mtInformation,mbOkCancel,0);
        Exit;
     end;
  end;
  qTemp.Close;  qTemp.SQL.Clear;
  qTemp.SQL.Add('create table таблица2.dbf" (');
  qTemp.SQL.Add('поле1 numeric (6,0),поле2 numeric (10,2))');
  qMagTemp.ExecSQL;

В результате файл не могет удалится....И соответственно, создаться....

Больше ни один запрос к этой таблице не обращается. Специально проверял.

P.S. Сия "хитрая" операция (прибить, а потом создать) делаю для получения чистой фоксовой таблицы, т.к. аналога команды zap в фоксе не нашел :-(


sniknik   (2004-09-15 17:15:00) [1]

> Вот кусок кода после которого эта бодяга случается....
так и не углядел в нем "drop table имятейбла", это секрет?

убери все Repaint;, проверь. (смутные сомнения) вообще все лишнее убери, весь код, просто открой таблицу закрой и удали. удаляется? после с этим кодом, тогда как? убери часть, так? и т.д. ... раз уж все нужное показать нельзя, разбирайся.

и зачем тебе VFP Driver? простой insert into ... from select сделать нельзя.

> то винкоммандер все равно не могет переименовать этот файл.
про это уже говорили. делай удаление средствами движка.


Алексей   (2004-09-15 17:00:00) [2]

причем, даже если делаю простой селект, потом клозе этого запроса,и не выхожу из программы, то винкоммандер все равно не могет переименовать этот файл.Т.е.
procedure TfrmMain.Button2Click(Sender: TObject);
  qMTemp.Close; qMTemp.SQL.Clear;
  qMTemp.SQL.Add('select * from vtp');
  qMTemp.Open;
  qMTemp.Close;
end;


Алексей   (2004-09-15 16:21:00) [3]

Вот кусок кода после которого эта бодяга случается....
  qMTemp.Close;  qMTemp.SQL.Clear;
  qMTemp.SQL.Add('select kod,kol_vo from reg where nm=:nm order by kod');
  Screen.Cursor:=crSQLWait;
  qMTemp.Parameters.ParamByName('nm').Value:=7;
  qMTemp.Open;
  Screen.Cursor:=crDefault;
  lbOperachiya.Caption:='';Repaint;
  lbOperachiya.Caption:='Çàïîëíÿåì VTP';
  WriteLog ('Çàïîëíÿåì VTP');Repaint;
  qMTemp2.Close; qMTemp2.SQL.Clear;
  qMTemp2.SQL.Add('insert into vtp (kod,kol_vo) values (:kod,:kol)');
  Kol_voZap:=qMTemp.RecordCount;
  while not qMTemp.Eof do begin
     qMTemp2.Close;
     qMTemp2.Parameters.ParamByName('kod').Value:=
        qMTemp.FieldByName('kod').AsInteger;
     qMTemp2.Parameters.ParamByName('kol').Value:=
        qMTemp.FieldByName('kol_vo').AsFloat;
     qMTemp2.ExecSQL;
     qMTemp.Next;
     if (qMTemp.RecNo mod 25)=0 then begin
        lbSost.Caption:='Îáðàáîòàííà çàïèñü '+IntToStr(qMTemp.RecNo)+
                         ' èç '+IntToStr(Kol_voZap);
        Repaint;
     end;
     {$IFDEF __DEB__}
        if (qMTemp.RecNo=5) then break;
     {$endif}
  end;
  qMTemp.Close;
  qMTemp2.Parameters.Clear;
  qMTemp2.Close;


sniknik   (2004-09-15 15:41:00) [4]

> А про дропп табле я же говорил : нет доступа :-(
странно, я пробовал нормально удаляет.

> P.S. Самое интересеное, что такая бодяга только с этим файлом. с другими таблицами все пучком.

?
точное имя файла/директории, строка подключения-(к какой директории), последовательность действий (как и после чего дроп делаеш). в общем сообщи все что не секретно и относится к делу.
старайся избегать таких данных
MyQuery.Open;
...
Обработка данных
...
MyQuery.Close;
именно в них глюки и живут.


Алексей   (2004-09-15 15:10:00) [5]

Прошу прощения за то что не уточнил: именно отдельные файлы....
А про дропп табле я же говорил : нет доступа :-(


sniknik   (2004-09-13 11:54:00) [6]

ну а запросом то пробовал?
(при закрытии конекта ADO тоже может не сразу сбрасывать выделенную память и т.д. по тойже причине, может понадобится. он и "надобится" при повторном тут же подключении, не учел.)
запросом должно сработать однозначно.

кстати это и единственно правильный путь, это же база а не разрозненные файлы (у них уже есть ограничения если не используется файл базы *.dbc, и старое снимается с поддержки), а если база есть простое удаление файла это путь к глюкам (радуйся что тебе этого не дали сделать), в базе то ссылка останется.
неиспользование базы не есть оправдание, т.к. разработчики вряд ли будут делать отдельную обработку для устаревшей схемы.


Алексей   (2004-09-13 11:35:00) [7]

Все закрыл!!!


sniknik   (2004-09-10 13:12:00) [8]

> Пишу MyADOConnection.Connected:=false;
> И все равно :-(
значит открыт не там. у тебя конект один? и все на него завязано?


Алексей   (2004-09-10 13:03:00) [9]

Пишу MyADOConnection.Connected:=false;
И все равно :-(


sniknik   (2004-09-10 12:55:00) [10]

> А есть ли возможность принудительно закрыть хендл файла?
наверняка закроется если сделаеш реконект. или просто его (коннект) закроеш.


Алексей   (2004-09-10 12:48:00) [11]

Не выходит каменный цветок :-(
Нет доступа, говорит.
В обработке данных я записываю данные из запроса MyQuery в другую таблицу вторым запросом.
И потом этот второй запрос тоже пишу QueryInsert.Close;
Еще я делаю отчет, каторый привязываю к MyQuery.
Но эту форму я делаю FormOtchet.Free;
И больше я нигде к этой таблице не обращаюсь.

А есть ли возможность принудительно закрыть хендл файла?

P.S. Самое интересеное, что такая бодяга только с этим файлом. с другими таблицами все пучком.


sniknik   (2004-09-10 12:01:00) [12]

> delete from таблица2
да не записи а таблицу удалей запросом.
drop table таблица2


Алексей   (2004-09-10 11:35:00) [13]

Проблема в том, что при выполнении запроса
delete from таблица2

записи физически не удаляются, а помечаются как удаленные, и через неделю я буду иметь файл размером за мегабайт и далее:-(
Конечно, при тех винтах, что сейчас стоят на клиентских машинах - это копейки, но нехорошо.....


sniknik   (2004-09-09 17:38:00) [14]

вполне возможно в движке остается коннект (не закрывается хендл файла, т.к. это длительная операция а файл может еще понадобится).

попробуй удалять запросом.


Алексей   (2004-09-09 17:22:00) [15]

Вопрос в догону:
использование QuickReport как нибудь "завешивает" файл?


Наверх

Титульная страница Поиск, карта сайта Написать письмо