![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сжать dbf с помощью TADOTable? [D6, dBase, FoxPro]
danja12 © (2006-08-16 17:32:00)Надо перейти с BDE в ADO. В BDE было
Table.EmptyTable. В ADO, вроде надо:ADOTable.DeleteRecords(arAll)но приводит к ошибке "Операция невозможна в данном контексте", при этом
ADOTable.Supports([coDelete])покаывает True. Удалять каждую запись в цикле очень долго, да и записи только помечаются на удаление, а надо получить пустую таблицу. Подскажите, кто знает. Спасибо.
term1t (2006-08-17 16:23:00) [41]скорее всего я глупость написал.. :) но с бде работает 100%
term1t (2006-08-17 16:21:00) [42]>А я не вижу на закладке ADO аналога DataBase, может не туда смотрю? :)
я работал с БДЕ. попробуй ADOConnection1.connected:=false ....
sniknik (2006-08-17 16:17:00) [43]> Да, как следует из вышесказанного, клиент-серверными подходами тут и не пахнет.
не пахнет, правда. воняет!!! ;)
ADO разрабатывался для такого подхода... и работать локально (открывать таблицы как файл... т.д.) он попросту не может. (потому то TADOTable это фикция, обманка для ленивых... типа тоже самое что в BDE...)
работает всегда по принципу клиент сервера, для локальных баз таким является COM обьект, ядро как будто sql сервер... а открытие в TTable (BDE) заменяется тупым запросом с выбором всего в TADOTable (ADO), перекачивание данных все одно идет несмотря на то что таблица локальная... (единственным исключением является jet, у него есть настройки/методы для локальной работы, но даже в этом случае ты не открываеш таблиц сам/или через dll, а просиш COM обьект чтобы он открыл ее так (т.е. некоторое "дистанцирование" от данных есть всегда)) ну, а по умолчанию и он работает как все, т.е. "клиентсерверно".
danja12 (2006-08-17 16:12:00) [44]> term1t:
а ты внимательно посмотри то, что я писал... перед паком надо закрыть датабейс. так пробовал? мне помогло.
А я не вижу на закладке ADO аналога DataBase, может не туда смотрю? :)
Кстати !!!, а может кто-то знает такую вещь: где-то здесь я слышал, что BDE можно не устанавливать, а писать в каталог запуска какие-то dll-ки из его состава. Проблема то не в том чтобы не использовать BDE, а в том, чтобы не ставить. Ибо разработчиков до праха развелось, и каждый ставит на комп свою. В результате работает только последняя. Других то претензий к BDE у меня с моей мелкой задачкой нет. Никто не слышал, а?
term1t (2006-08-17 16:02:00) [45]>Блин! Ну, не поддерживает локальный SQL команду "pack", только delete, insert, procedure, select и update.
а ты внимательно посмотри то, что я писал... перед паком надо закрыть датабейс. так пробовал? мне помогло.
danja12 (2006-08-17 15:53:00) [46]> term1t:
Query1.SQL.TExt:='pack TableName';
Query1.ExecSQL;
...................
И все
Блин! Ну, не поддерживает локальный SQL команду "pack", только delete, insert, procedure, select и update.
> Lexiy:
дроп криат ... чем тебе не подходит ?
Drop ? Это не BDE, да? Приведи, плиз, пример синтаксиса. Мне и нужно то, одно поле всего в таблице.
term1t (2006-08-17 15:10:00) [47]>Удалять каждую запись в цикле очень долго, да и записи только помечаются на удаление, а надо получить пустую таблицу.
...................
database.Open;
Query1.SQL.Clear;
Query1.SQL.Text:='delete from TableName';
Query1.ExecSQL;
database.close;
Query1.SQL.Clear;
Query1.SQL.TExt:='pack TableName';
Query1.ExecSQL;
...................
И все
MsGuns (2006-08-17 14:37:00) [48]>Lexiy (16.08.06 17:34) [1]
>на сколько я знаю работа с дбф вообще очень долгая штука :)
За знания - двойка с минусом
>danja12
>Удалять каждую запись в цикле очень долго, да и записи только помечаются на удаление, а надо получить пустую таблицу.
А никто так и не делает. Для этого существуют запросы.
Если не полениться и почитать борландовску справку, то там ясно написано, что эта функция предназначена только для локальных таблиц, которые представляют из себя совокупность отдельных файлов ОС, хранящихся автономно от других. Поэтому реализация сводится к тому, что старый файл (точнее, файл данных и файл индексов) просто уничтожается физически, а вместо него создается новый точно такой же, но без данных. Ессно, его размер будет "нулевой".
В серверных БД (к коим относится акцес, например) все базовая "требуха", включая описания таблиц (метаданные) и хранимую информацию (собственно данные) хранится в едином физическом файле. Поэтому было бы весьма проблематично "эмптить" всю базу с последующим ее пересозданием и перезагрузкой только потому, что кому-то вздумалось почистить физичекси одну таблицу
Lexiy (2006-08-17 14:19:00) [49]danja12 как сказал это не значит что не правильно ... дроп криат ... чем тебе не подходит ?
danja12 (2006-08-17 11:11:00) [50]> Lexiy: +7 вах как сказал!!!
Точно :) Аж, завидно стало :)
> sniknik: начни с изучения основ...
Учится, оно, конечно, всегда надо. Но проясню ситуацию: я не пишу базы, я пишу графику. Ну, надо мне, на объекты из карты выдать на просмотр соответствующие строки из базы. Соответствие обеспечивается идентификаторами объектов. Когда можно было пользоваться BDE, я слепил это за пару дней без всяких специальных знаний и не лазая вглубь. И надо бы лезть, да некогда. Теперь начальство сказало: чтоб BDE убрать и ставить больше ничего нельзя. Пошел и тупо заменил TQuery на TADOQuery, а TTable на TADOTable и теперь правлю вылезшие различия в свойствах и методах. С Query все прошло гладко, c Table - нет. Вот такая песня. Да, как следует из вышесказанного, клиент-серверными подходами тут и не пахнет. База - dbf, файл - один. Идентификаторы каждый раз загонялись в промежуточный dbf, а потом запрос на соединение таблиц. Этот промежуточный dbf и хотелось бы чистить. DELETE FROM - естественно работает, а PACK TABLE пока не пробовал. Попробовал передать строкой в запросе "Id In (...)", но 10000 обрабатываются 8 минут - медленно.
Lexiy (2006-08-17 10:19:00) [51]+7 вах как сказал!!!
sniknik (2006-08-17 10:10:00) [52]> С этого места по-подробней, пожалуйста.
начни с изучения основ... файл серверного/клиент серверного подхода, и их различия. но только учить основы надо не сдесь (будет долго, нудно, безрезультатно... и вообще флуд). купи книжку.
потому что ты пытаешся методы одного подхода "притянуть" к другому (чему борланд кстати поспособствовал, сделав эти свои "переходники").
> Как еще это можно сделать? Удалить все и сжать - раз.
это делается командами движка (VFP в твоем случае) посредством sql, а ADOTable ... ну он "немного" не для этого...
команды движка/sql сервера, описания ищутся в мануалах по движку/серверу, ADO это только посредник между вами.
удалить все - DELETE FROM Table1
сжать - PACK TABLE Table1
это если нужный провайдер используется... но в большинстве случаев быстрее работает "дроп" табле, и создание ее заново. у других движков даже команд таких "упаковочных" нет (наверное для того чтобы делали все сразу правильно ;), у фокса есть, но только потому что были всегда... исторически так сложилось.
> А его отдельно надо ставить? Причина перехода с BDE в ADO именно в этом.
если его нет обязательно! а его нет, в новых виндах точно. (ODBC уже не ставятся OLEDB еще ... ;о))), в старых включался ODBC драйвер в поставку виндов, ну и по моему мсофис их доставлял, ежели что. т.что. закладываться на то что они там обязательно есть нельзя...
danja12 (2006-08-17 09:16:00) [53]> Anatoly Podgoretsky
Удаление записей это не очистка таблицы, оно ничего общего с операцией EmptyTable не имеет.
С этого места по-подробней, пожалуйста. В табличку, которую надо очистить, пишутся промежуточные результаты. EmptyTable делает, как раз то, что надо - пустую таблицу. Как еще это можно сделать? Удалить все и сжать - раз. Написать новую пустую таблицу - два.
Из моего первого сообщения, по-моему, понятно, что именно это мне инужно. Так что, что удаление, что очистка - мне все едино (в данном случае).
> Использовать OLE DB провайдера для Визуал ФоксПро и его команды.
А его отдельно надо ставить? Причина перехода с BDE в ADO именно в этом.
Anatoly Podgoretsky (2006-08-16 19:07:00) [54]Использовать OLE DB провайдера для Визуал ФоксПро и его команды. По списку команд в документацию по ФоксПро.
Альтернативным вариантом является создание таблицы с нуля, тоже занимает миллисекунды.
Удаление записей это не очистка таблицы, оно ничего общего с операцией EmptyTable не имеет.
clickmaker (2006-08-16 18:40:00) [55]
> Напоминаю, в BDE EmptyTable работала со свистом
дык борландеры изначально затачивали БДЕ под дбф-парадокс. А ADO - это MS, это "совсем другая тема"
Lexiy (2006-08-16 17:38:00) [56]тьфу пардон не так прочитал :) а если дроп и криат заново ?
danja12 (2006-08-16 17:37:00) [57]> возможно только так ну или создать шаблон и брать его пустой
Это для ADO?
Напоминаю, в BDE EmptyTable работала со свистом.
???
Lexiy (2006-08-16 17:34:00) [58]на сколько я знаю работа с дбф вообще очень долгая штука :) и возможно только так ну или создать шаблон и брать его пустой