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

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

Как сжать dbf с помощью TADOTable? [D6, dBase, FoxPro]


Страницы:   1 2 3

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]

на сколько я знаю работа с дбф вообще очень долгая штука :) и возможно только так ну или создать шаблон и брать его пустой


Страницы:   1 2 3

Наверх

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