Форум: "Базы";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];
ВнизСжатие таблицы Найти похожие ветки
← →
Егоров А.Н. (2007-03-01 12:01) [0]Господа мастера, помогите разобраться. Не получается сжать таблицу WDOCM.DBF (Delphi 7, ADO, провайдер VFPOLEDB v.8, базы FoxPro 3.x), которая в одной процедуре была:
1. заполнена запросом (insert into wdocm select …);
2. затем обработана инструкцией (update wdocm set …);
3. затем были удалены некоторые записи (delete from wdocm where …);
4. затем пытаюсь сжать таблицу (pack table wdocm) и получаю ошибку <File is in use>.
Пытался разорвать Connection с таблицей и опять ее установить перед сжатием, но это не помогло. Что надо сделать?
← →
sniknik © (2007-03-01 15:48) [1]> пытаюсь сжать таблицу (pack table wdocm) и получаю ошибку <File is in use>.
у фокса изначально таблицы открывались в рабочих областях и не закрывались... пока не даш команду CLOSE (ALL/DATABASES/...), но вот в драйвере такого нет... (а может просто не получилось, и не продолжал разбираться потому как нет надобности)
потом раньше можно было пустой USE выполнить, тоже закрывало таблицу в текущей области. ... тоже не работает, надо обязательно указывать чтонибудь, поэтому можно решить переоткрытием в нужной области другой таблицы, тоже закроет ранее открытую (может есть и другое менее извратное решение но я его не знаю, и фокс в принципе давно забросил. т.что и не узнаю).
итого решение, пара комманд до выполнения "pack table wdocm"
USE wdocm IN 1 //переоткрываем таблицу чтобы гарантировать что она в области 1 (не знаем в которой ее открыли sql-ые команды)
USE table IN 1 //в той же области открываем другую таблицу, это закроет ранее открытую
после этого можно выполнять pack table wdocm
p.s. не будет работать для ODBC драйвера (был убран USE как класс... в OLEDB команду восстановили)
> Пытался разорвать Connection с таблицей и опять ее установить перед сжатием, но это не помогло.
не поможет даже кратковременное закрытие коннекта, т.к. COM обьекты не сразу освобождаются, на случай повторных обращений (экономят ресурс машины) только после таймаута (и весьма длительного...). а т.к. таблица открыта не в твоей проге, а в этом COM обьекте (ADO) то ты е получаеш в том же виде, без переинициализаций, как и было при отключении.
← →
sniknik © (2007-03-01 15:56) [2]хм... проверил то, что написал, и оказалось что второй USE table IN 1 уже не нужен... почему, х.з. может потому что pack table берет по умолчанию 1-ю область и сам закрывает, толи select открывает в такой области запредельной, куда pack table не добраться, а он должен по был автоматом закрыть, и перенесение в 1-ю чтото для него меняет...
не знаю, разбирайся, в общем. (а лучше поменяй на чтонибудь посовременнее)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.062 c