Оптимизация работы с БД
Кто подскажет как нужно грамотно осуществлять доступ к данным из БД. У меня конкретно DBASE III-IV, но это собственно не важно. Проблема в том, что при попытке считать большие объемы данных (более меллиона) компьютер работает очень медленно или вовсе виснет. FoxPro же открывает эту базу за секунды.
Напиши как ты открываешь базу?
Напиши как ты открываешь базу?
Открываю как обычный файл в бинарном режиме:
char ch[256];
CMemFile bd;
bd.Open("bd.dbf", CFile::modeReadWrite|CFile::typeBinary);
дальше считываю данные:
..............
bd.Read(&ch, 256);
Вот, собственно, и все.
Открываю как обычный файл в бинарном режиме:
char ch[256];
CMemFile bd;
bd.Open("bd.dbf", CFile::modeReadWrite|CFile::typeBinary);
дальше считываю данные:
..............
bd.Read(&ch, 256);
Вот, собственно, и все.
А вот это ты делаешь миллион раз в цикле?
bd.Read(&ch, 256);
Поэтому наверное и тормозит.
Попробуй открыть базу через ODBC в CRecordset или затолкай dbfник в акцессовую базу и открой через CDaoRecordset, открывай dynamic. Откроется моментально, зато по записям ходить долго (миллион же), но думаю что и FoxPro не быстрей.
Попробуй открыть базу через ODBC в CRecordset или затолкай dbfник в акцессовую базу и открой через CDaoRecordset, открывай dynamic. Откроется моментально, зато по записям ходить долго (миллион же), но думаю что и FoxPro не быстрей.
Да то-то и оно, что я не знаю как это сделать! Буду благодарен за пример какой-нибудь, или ссылку на инфу в и-нете.
Да то-то и оно, что я не знаю как это сделать! Буду благодарен за пример какой-нибудь, или ссылку на инфу в и-нете.
Ссылка в инете - пожалуйста, firststeps.ru, там есть все и по шагам.
Посоветую. Засунь дбфник в акцессовую базу (в акцесс 97, если хочешь 2000 или 2002, то читай - я где-то в форуме написал как). Затем открываешь свой проект, тычешь add new class, пишешь наследовать от CDaoRecordset, дальше сам разберешься.
Ссылка в инете - пожалуйста, firststeps.ru, там есть все и по шагам.
Посоветую. Засунь дбфник в акцессовую базу (в акцесс 97, если хочешь 2000 или 2002, то читай - я где-то в форуме написал как). Затем открываешь свой проект, тычешь add new class, пишешь наследовать от CDaoRecordset, дальше сам разберешься.
Линк толковый и совет дельный, но не все так прозрачно, как хотелось бы. Сделал я прогу с базой mdb(Access 2002) и все нормально работает, даже проблем, тобой описаных ранее, не встретил, а вот с dbf форматом не получается. Во первых не могу открыть файл (выдает ошибку, мол, не верно задано имя файла и путь к нему), а если файл открываю (оссоциирую в панели управления с источником), то не могу достать данные, точнее не знаю какое имя таблицы задавать??? (Это я пробовал select). Вот, собственно, два вопроса на повестке дня.
А вообще - спасибо за помощь!
Линк толковый и совет дельный, но не все так прозрачно, как хотелось бы. Сделал я прогу с базой mdb(Access 2002) и все нормально работает,
//Значит пишешь на Visual.Net
даже проблем, тобой описаных ранее, не встретил, а вот с dbf форматом не получается. Во первых не могу открыть файл (выдает ошибку, мол, не верно задано имя файла и путь к нему),
//Где и как ты его открываешь?
а если файл открываю (оссоциирую в панели управления с источником), то не могу достать данные, точнее не знаю какое имя таблицы задавать???
//А в dbf нет таблиц :) это и есть одна таблица
(Это я пробовал select).
//А как ты его пробовал
Вот, собственно, два вопроса на повестке дня.
А вообще - спасибо за помощь!
CString connect;
connect = connect="DSN=Файлы dBASE;DBQ=C:/;DRIVER={Microsoft dBASE Driver(*.dbf)};";
cdb.OpenEx(connect);
cr.Open(CRecordset::forwardOnly, "SELECT * FROM file.dbf",CRecordset::readOnly);
Открыть не удается!
Открыть не удается!
Продолжил экспериментировать и обнаружил, что некоторые файлы открыть удается, а некоторые нет. Вот это мне вообще непонятно!!! Все мои файлы являются dBase III, но некоторые просто не открываются (ну и фиг ним:). Проблема есть еще и с теми, которые открыть удается! А именно: при использовании метода CRecordset cr; cr.GetFieldValue(1,str); я получаю значение не первого, а второго поля. Подскажите ПЛИЗ! как открыть первое поле и, почему, некоторые файлы не могут открыться.
Продолжил экспериментировать и обнаружил, что некоторые файлы открыть удается, а некоторые нет. Вот это мне вообще непонятно!!! Все мои файлы являются dBase III, но некоторые просто не открываются (ну и фиг ним:).
//////
Я сам не знаю в чем дело. У меня такое же было. Попробуй открыть их в какой-нибудь проге, где они нормально открываются (н-р DBFViewer), и снова сохранить/
//////
Проблема есть еще и с теми, которые открыть удается! А именно: при использовании метода CRecordset cr; cr.GetFieldValue(1,str); я получаю значение не первого, а второго поля. Подскажите ПЛИЗ! как открыть первое поле и, почему, некоторые файлы не могут открыться.
//////
А ты попробуй CRecordset cr; cr.GetFieldValue(0,str). У них счет с нуля.
То бишь два раза запрашиваю первое поле и, только тогда, все получается! Чушь полная - но работает :).
Неа - все равно не катит. Я сделал так: cr.Open(CRecordset::snapshot, "SELECT pole1, pole1 FROM file.dbf",CRecordset::readOnly).
То бишь два раза запрашиваю первое поле и, только тогда, все получается! Чушь полная - но работает :).
Че-то чушь действительно.
А что он пишет и возвращает если поставить ноль в GetFieldValue?
Или открыть "SELECT pole1 FROM file.dbf" и поставить 0 ноль в GetFieldValue.
Я счас на работе, а проги пишу дома, поэтому на память точно не помню. Посмотри в MSDN точно как идет счет полей?
Еще попробуй засунь dbfник в акцесс (или SQL базу на сервак, если есть) и выполни этот запрос и посмотри, что возвратит. Если все нормально, то глюк у тебя в проге где-то. Мож ты потом еще раз селект делаешь?
Попробуй с чистого проекта, на другой базе.
Я же тебе советовал унаследовать класс от CRecordset (если не знаешь, ткни правой кнопкой на панельку где у тебя список классов, обычно слева, нажми add new class..., от которого наследовать - выбери CRecordset. Дальше сиха сама все спросит, сделает тебе переменные, сама! для обмена и ты будешь только Move Nextы, да MoveFirstы делать и считывать значения из этих переменных). Тебе останется объявить переменную унаследованного класса. Типа там CMyRecordset.
Ну давай, пиши. Если не сможешь я тебе пример дома накатаю, и скину попозже.
Просьба, ОГРОМНАЯ от себя! Если знаешь, или есть хорошие доки по тому, как сделать поддержку печати в MFC прогах или как вообще печатать? скинь или напиши. А то тема висит уже недели две. Неужели никто не делал?
Мыло: [email]diablo_mgn@mail.ru[/email]
А вот что на счет печати, так я сам глубоко не копался. Но ходят слухи, что этим делом грешны функции-члены от CView. Ну, типа: OnPreparePrinting(), DoPreparePrinting(), OnBeginPrinting(), OnPrepareDC(), OnPrint(), OnEndPrintPreview(), OnEndPrinting() и т.д. и, как говорится, т.п. Информацию о состоянии хранит CPringInfo, остановка и отмена печати при помощи OnPrepareDC() и OnPring().
Наверное ты это уже знал, но большего я сказать сейчас не могу (сам не знаю)!