Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.21;
Скачать: CL | DM;

Вниз

Как сделать выборку данных без удаленных записей?   Найти похожие ветки 

 
AlexVit ©   (2003-04-02 09:36) [0]

Я всех приветствую!
Искал в Help"e, FAQ"е и через поиск: ответа не нашел, наверное,
плохо искал... :-)
Проблема вот в чем.
Работаю с dbf-таблицами через ADO. При использовании TADOQuery выбираются все записи согласно запросу, в т.ч. и удаленные, так как они в dbf-ах физически не удаляются, а мне нужна выборка без этих удаленных записей. DbiPackTable применять после удаления каждой записи не могу, так как база очень большая и долго будет перестраиваться таблица. Ответ должен быть (наверное) простой, но я его, к сожалению, не нашел. Кто может подсказать, тому буду премного благодарен.


 
sniknik ©   (2003-04-02 10:43) [1]

смотри значение в реестре

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase
Deleted -> //по дефаулту 1 (выключено), у тебя видать сбилось
Двоичный индикатор, определяющий обработку ядром Microsoft Jet записей, отмеченных как удаленные. Значение 01 соответствует команде dBASE SET DELETED ON и отключает загрузку или позиционирование удаленных записей. Значение 00 соответствует команде dBASE SET DELETED OFF и указывает, что удаленные записи обрабатываются так же, как все остальные. По умолчанию задается значение 00. Значения имеют тип Binary в Windows 95 и Windows NT 4.0 или тип REG_BINARY в Windows NT 3.51.

(хотя я чего подумал, а если ты не Jet используеш? тогда иши сам, раз не указываеш.)


 
AlexVit ©   (2003-04-02 11:19) [2]


> (хотя я чего подумал, а если ты не Jet используеш? тогда
> иши сам, раз не указываеш.)


Не совсем понял, при чем тут Jet. Насколько я знаю (сам использовал) Jet применяется только для работы с mdb. А я пользую dbf через ODBC. По-моему, и ядро Jet также с dbf работает через ODBC.


 
Соловьев ©   (2003-04-02 11:27) [3]

тогда посмотри в настройках ODBC? там есть настройка чтобы не показывать кдаленные записи.


 
sniknik ©   (2003-04-02 11:35) [4]

AlexVit © (02.04.03 11:19)
глубоко заблуждаешся. Jet имеет свой маленький встроенный BDE.

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


 
sniknik ©   (2003-04-02 11:36) [5]

и самое главное забыл. у всех разные настройки!


 
AlexVit ©   (2003-04-02 11:49) [6]


> sniknik ©


Приведи, если не трудно, рабочий пример ConnectionString"а для работы c dbf-файлом через Jet (4.0, к примеру), тогда я буду убежден, что глубоко заблуждаюсь...


 
AlexVit ©   (2003-04-02 11:55) [7]


> глубоко заблуждаешся. Jet имеет свой маленький встроенный
> BDE.


Небольшая поправка. Jet не имеет BDE (Borland Database Engine), Jet - это сам по себе движок, аналог BDE от Microsoft (если можно так выразиться), насколько я знаю...


 
sniknik ©   (2003-04-02 12:07) [8]

AlexVit © (02.04.03 11:55)
не буду спорить (здесь на этом поприще уже немало копий было сломано), скажу скромно, я прав читай хелпы :о))

AlexVit © (02.04.03 11:49)
нет проблем
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\;Extended Properties=dBase IV;Persist Security Info=False
(посмотреть какую dll использует можно в реестре, приводилось)


 
Пубертанец   (2003-04-02 12:22) [9]

А как программно узнать, удалена ли запись в dbf?


 
Соловьев ©   (2003-04-02 12:27) [10]

есть функция в BDE:
dbiSetProp
с параметрами
Parameters

hObj Type: hDBIObj (Input)
Specifies the object handle to a system, client, session, driver, database, cursor, or statement object.
iProp Type: UINT32 (Input)
Specifies the property to set.
iPropValue Type: UINT32 (Input)
Specifies the value of the property.


 
Anatoly Podgoretsky ©   (2003-04-02 12:32) [11]

sniknik © (02.04.03 12:07)
Одназначно при такой строке подключения будет использовать BDE драйвер MSX BDE40.DLL
Там же в реестре для этого драйвере есть и настройки по Deleted


 
AlexVit ©   (2003-04-02 12:41) [12]

Проверил, работает. Признаю, что глубоко заблуждался. Ты прав, а я пошел читать хелпы :-)))


 
sniknik ©   (2003-04-02 13:01) [13]

ну за то что признаеш, подарок :о)). то что ты скорее всего использовал, делается так
Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=D:\;DefaultDir=D:\;DriverId=277;FIL=dBase 4.0;MaxBufferSize=2048;PageTimeout=5; DELETED=1"


 
AlexVit ©   (2003-04-02 14:31) [14]


> sniknik ©

Поковырял и вот чего наковырял: если использовать file DSN, то тогда изменение значения DELETED в ConnectionString работает без проблем, но если используешь system DSN или user DSN, то изменение значения DELETED в самой строке ConnectionString эффекта не дает. Для этих вариантов (system DSN или user DSN) работает только изменение значения DELETED напрямую в реестре (это можно сделать также и через BDE Administrator).
Вот такие пироги.



 
sniknik ©   (2003-04-02 14:52) [15]

где ты у меня видиш DSN в строке?
DRIVER={Microsoft dBase Driver (*.dbf)};
и не нужно никаких BDE Administrator-ов, и настройки через строку наиболее полные. (ну и хотя бы в ODBC правил ODBCшные алиасы (они как раз для того чтобы руками настройки задавать см. пример), а то смысл использовать ADO микрософтские драйвера ... и настраивать в BDE Administrator-е?)

строка с DNS включающая все что нужно
Provider=MSDASQL.1;Extended Properties="DSN=dBASE Files;"


 
AlexVit ©   (2003-04-02 15:15) [16]


> sniknik ©

Я не сказал, что видел у тебя DSN, я сказал "если использовать DSN". В твоем примере ConnectionString"а все работает нормально, но если использовать DSN, то начинается путаница с Deleted, см. выше...



Страницы: 1 вся ветка

Текущий архив: 2003.04.21;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
14-67477
Mike_Goblin
2003-04-02 16:17
2003.04.21
Конкурс


1-67359
OlegM
2003-04-09 10:03
2003.04.21
Объект в текст, текст в объект, как?


14-67529
Sodom
2003-04-04 13:08
2003.04.21
Подскажите где лежит Рихтер


14-67499
Sheng
2003-04-01 17:14
2003.04.21
А по делу... Может кто знает, как ставить sohoLib?


4-67640
Aleksey Girshovskiy
2003-02-19 12:43
2003.04.21
Как получить на что открыт файл (read write...) через сеть?