Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];

Вниз

СРОЧНО !! Компонент / Класс чтение DBF напрямую по номеру записи   Найти похожие ветки 

 
AlexRush   (2003-10-08 13:59) [0]

Мужики, помогите! Нужен компонент/класс, который сможет напрямую читаль записи из DBF, осуществляя навигацию по номеру записи

P.S. Очень важна скорость, т.к. нужно перебрать таблицу более чем из 130 000 записей в произвольном порядке. SQL с WHERE здесь на катит...


 
KSergey   (2003-10-08 14:01) [1]

Да возможно, что тут ничего не катит - мотыляться по базе туды-сюды... ;)
Рекомендую Halcion


 
AlexRush   (2003-10-08 14:04) [2]

2 KSergey © (08.10.03 14:01) [1] Спасибо, но что это и где взять ? (я в базах дубовый вообще)


 
zx   (2003-10-08 14:14) [3]

> SQL с WHERE здесь на катит...
куда на катит???


 
AlexRush   (2003-10-08 14:19) [4]

2zx © (08.10.03 14:14) [3] Как бы это вам сказать... измерbв среднюю скорость поиска одной записи (select * from DB WHERE ID = X) и проведя несложные математические расчеты получил приблизительное время обработки таблицы 80 часов (на P III 500/256/1024) не кажется ли Вам, что туговато...


 
y-soft   (2003-10-08 14:21) [5]

>AlexRush © (08.10.03 14:04) [2]

Структура DBF весьма проста( http://www.wotsit.org/download.asp?f=ti838d) - после заголовка расположен массив записей фиксированной длины. Это как раз тот случай, когда проще всего работать напрямую (если, конечно, не требуется блокировка записей)...


 
Val   (2003-10-08 14:34) [6]

>AlexRush © (08.10.03 14:19) [4]
угу, теоретики СУБД не додумались так скорости выборок измерять, а индексы от большого ума возникли в природе и ни у кого БД больше 10 строчек в одной таблице не бывает...


 
Vlad   (2003-10-08 14:34) [7]

>AlexRush © (08.10.03 14:19) [4]
80 часов ????
Батенька, вы индекс по ID не пробывали создавать ?


 
y-soft   (2003-10-08 14:40) [8]

Мужики, какой еще индекс по RecNo? :)))

Записи в таблице DBF и так физически раположены в порядке номеров записей. Ну, не является DBF нормальной SQL базой (для приличной таблицы SQL номер записи, как правило, не имеет смысла)... Зачем мудрить в таком простом случае?


 
Val   (2003-10-08 14:43) [9]

>y-soft © (08.10.03 14:40) [8]
автор говорит о номере записи, как о своем решении, по-моему...
задача-то неизвестна.


 
zx   (2003-10-08 14:45) [10]

select * from DB WHERE ID = X <- не так!
у ДатаСета есть метод Некст.


 
y-soft   (2003-10-08 14:49) [11]

>Val © (08.10.03 14:43) [9]

Судя по вопросу, автор имеет в виду именно доступ по физическому номеру записи в таблице DBF. Если осуществляется доступ только на чтение, то, учитывая структуру таблиц DBF, можно получить практически мгновенный доступ, работая с массивом записей...


 
zx   (2003-10-08 14:53) [12]

я думаю ему просто по записям нужно пробещаться.


 
y-soft   (2003-10-08 14:59) [13]

Вдогонку:

Сказанное, естественно, справедливо только для упакованных таблиц (без записей, помеченных на удаление)


 
Val   (2003-10-08 15:03) [14]

>y-soft © (08.10.03 14:49) [11]
Я понимаю. Но, т.к. автор говорит также, что не очень силен в БД, то можно предположить, что задачу, которую он собирается решать именно таким образом, можно решить иначе. Поэтому интересно услышать/прочитать о самой задаче, для предложения возможных других вариантов решения(если они существуют), кроме вашего, несомненно хорошего.


 
AlexRush   (2003-10-08 15:03) [15]

Видимо плохо сформулировал, проясняю ситуацию:
Абстрагируясь от моей конкретной ПРИКЛАДНОЙ задачи, можно сказать, что мне нужен доступ на чтение к записям из таблицы в формате DBF по их физическому номеру (порядку расположения в файле).

Если бы TDataSet.RecNo := X переводило бы курсор на запись с номером X, то проблема бы не возникала.

2zx © (08.10.03 14:45) [10]
Представьте себе:

for i:=1 to Count // Count<>MyTable.RecordCount
do begin
УстановитьКурсорНаЗаписьСномером(ФункцияПолученияНужногоНомера(i));
ДелатьПРИКЛАДНУЮработу;
end;


ФункцияПолученияНужногоНомера(i) <> i , и TDataSet.Next здесь на подходит.


 
Anatoly Podgoretsky   (2003-10-08 15:08) [16]

First, Last, MoveBy, Next, and Prior (индекс должен быть оключен)

y-soft © (08.10.03 14:59) [13]
Никто не мешает упаковать или включить показ удаленных записей.


 
AlexRush   (2003-10-08 15:15) [17]

2 All Учитывая AlexRush © (08.10.03 15:03) [15] снова поднимаю изначальный вопрос... Если есть компонент/класс, позволяющий осуществлять навигацию по физическому номеру в DBF файле (и чтение записей), то где его взять ?


 
sniknik   (2003-10-08 15:16) [18]

может просто заменить TDataSet.RecNo := X
на
TDataSet.First;
TDataSet.MoveBy(X);
?

поменять логику
?

или перейти на датасеты в памяти, ClientDataSet, ADODataSet
возможно самый быстрый вариант, на операции с диском только чтение, дальше от размера памяти.
?


 
KSergey   (2003-10-08 15:16) [19]

AlexRush © (08.10.03 13:59)
SQL с WHERE здесь на катит...


А к стати, каким образом можно при момощи WHERE переместиться на запись с указанным номером??!

> 13] y-soft © (08.10.03 14:59)
> Сказанное, естественно, справедливо только для упакованных
> таблиц (без записей, помеченных на удаление)

Да нет.
Для DBF нумерация записей включает в себя удаленные, даже если они не отображаются.

А вообще-то, Anatoly Podgoretsky прав: любым компонентом и описанными командами доступ должен получиться весьма с приличной скоростью.


 
AlexRush   (2003-10-08 15:21) [20]

2KSergey © (08.10.03 15:16) [19] А к стати, каким образом можно при момощи WHERE переместиться на запись с указанным номером??! я там поле ID добавил с номером записи....


 
zx   (2003-10-08 15:22) [21]

> AlexRush ©
можно узнать задачу для которой нужен доступ именно по физическому номеру в DBF файле?


 
sniknik   (2003-10-08 15:25) [22]

Представьте себе:

for i:=1 to Count // Count<>MyTable.RecordCount
do begin
УстановитьКурсорНаЗаписьСномером(ФункцияПолученияНужногоНомера(i));
ДелатьПРИКЛАДНУЮработу;
end;

если номера не зависят друг от друга (следуюший от предыдущего)
то представь так (изменение логики)
ВыборкаПоПолученнымНомерам(ПолучитьСписокНомеров(Count));
while not base.eof do
ДелатьПРИКЛАДНУЮработу;
base.next;
end;

(даже если нет своего ID, то в FoxPro и (ODBC VFP) можно в селекте обращатся к RecNo())


 
Val   (2003-10-08 15:25) [23]

>AlexRush © (08.10.03 15:21) [20]
ну и что? выборка и позиционирование вещи абсолютно разные.


 
y-soft   (2003-10-08 15:26) [24]

>Anatoly Podgoretsky © (08.10.03 15:08) [16]

Согласен - фактически реализация TDataSet для DBF и делает то, что я раньше предлагал...

KSergey © (08.10.03 15:16) [19]

Для DBF нумерация записей включает в себя удаленные, даже если они не отображаются.

Спасибо, давненько с DBF не работал... :)


 
AlexRush   (2003-10-08 15:26) [25]

Есть другая структура данных, организованная тоже записями, и соответствие ведется именно по номерам записей, но не однозначное, а по некоторым критериям...


 
AlexRush   (2003-10-08 15:29) [26]

2 sniknik © (08.10.03 15:25) [22] нет, так не катит, это точно


 
zx   (2003-10-08 15:30) [27]

> AlexRush ©
Често говоря, хочется по советовать почитать какую-нибудь книжку по работе с базами данных. Любо ты вопрос не можешь сформулировать, либо не понимаешь о чем говоришь.


 
AlexRush   (2003-10-08 15:32) [28]

2zx © (08.10.03 15:30) [27] - при всём уважении, не исключайте и третий вариант...


 
Anatoly Podgoretsky   (2003-10-08 15:34) [29]

Для реализации вышеуказанных методов достаточно переписать виртуальный метод SetRecNo


 
KSergey   (2003-10-08 15:41) [30]

2 AlexRush

Я все же не пойму: совет [18] sniknik © (08.10.03 15:16) (он же [16] Anatoly Podgoretsky © (08.10.03 15:08)) - не канает?? Почему на них нет реакции?


 
Anatoly Podgoretsky   (2003-10-08 15:44) [31]

Ты хочешь сказать, что эти методы у тебя не работают, на самом деле нужны только First и MoveBy, да и первый не особо нужен, можно текущий находу получать и делать вычитание?


 
Vick   (2003-10-08 15:45) [32]

Люди, на сколько я помню в ДатаСетах есть такая "загадочная" операция как Locate, может вопрошающему почитать про ее возможности???


 
y-soft   (2003-10-08 15:52) [33]

Для реализации вышеуказанных методов достаточно переписать виртуальный метод SetRecNo

А вообще для полноценного потомка TDataSet достаточно всего-то переписать 23 виртуальных метода :)))

IMHO, был хороший совет (KSergey © [1]) - если требуется нормальная поддержка нативного XBase - использовать уже готовые Helcyon, Apollo, Topaz etc ( http://www.kylecordes.com/bag/listbytype.html)...


 
Anatoly Podgoretsky   (2003-10-08 15:59) [34]

y-soft © (08.10.03 15:52) [33]
Неужели сложно написать пару строчек


 
y-soft   (2003-10-08 16:04) [35]

>Anatoly Podgoretsky © (08.10.03 15:59) [34]

В subj стоит пометка "Срочно", значит приспичило и со временем у вопрошающего туговато :))


 
KSergey   (2003-10-08 16:05) [36]

> [34] Anatoly Podgoretsky © (08.10.03 15:59)

Это не прикольно.

[33] y-soft © (08.10.03 15:52)
А вообще для полноценного потомка TDataSet достаточно всего-то переписать 23 виртуальных метода :)))


А не может ли кто ткнуть носом в конкретное место, где бы об этом почитать: какие именно методы и что с ними делать (ну в смысле зачем они испольуются).


 
y-soft   (2003-10-08 16:08) [37]

>KSergey © (08.10.03 16:05) [36]

А не может ли кто ткнуть носом в конкретное место, где бы об этом почитать: какие именно методы и что с ними делать (ну в смысле зачем они испольуются).

Марко Канту, Тим Гуч, Джон Ф. Лэм "Delphi. Руководство разработчика" Москва "ДЕСС" 1999


 
y-soft   (2003-10-08 16:11) [38]

>KSergey © (08.10.03 16:05) [36]

Еще кое что есть в

Тодд Миллер, Дэвид Пауэлл "Специальное издание. Использование Delphi 3" "Диалектика" 1997


 
AlexRush   (2003-10-08 16:14) [39]

2All
Всем спасибо за участие. Проблема решена.

P.S. Ветку можно закрывать.


 
KSergey   (2003-10-08 16:16) [40]

2 y-soft

Спасибо, попробую найти.



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

Форум: "Базы";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.015 c
1-98589
DimaK
2003-10-19 16:03
2003.10.30
RichEdit


3-98447
IBNovice
2003-10-10 09:50
2003.10.30
Autoinc


1-98583
ИМГусак
2003-10-20 09:40
2003.10.30
Параметры запуска MicrosoftOutlook


1-98609
kukuikar
2003-10-14 18:08
2003.10.30
Как WinAmp


1-98588
gs
2003-10-20 01:21
2003.10.30
Отчеты-крик души (FastReport D7...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский