Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Оптимизация работы с БД

462
03 февраля 2003 года
little brother
81 / / 18.10.2002
Кто подскажет как нужно грамотно осуществлять доступ к данным из БД. У меня конкретно DBASE III-IV, но это собственно не важно. Проблема в том, что при попытке считать большие объемы данных (более меллиона) компьютер работает очень медленно или вовсе виснет. FoxPro же открывает эту базу за секунды.
2.2K
03 февраля 2003 года
diablo_mgn
16 / / 31.01.2003
Цитата:
Originally posted by little brother
Кто подскажет как нужно грамотно осуществлять доступ к данным из БД. У меня конкретно DBASE III-IV, но это собственно не важно. Проблема в том, что при попытке считать большие объемы данных (более меллиона) компьютер работает очень медленно или вовсе виснет. FoxPro же открывает эту базу за секунды.



Напиши как ты открываешь базу?

462
04 февраля 2003 года
little brother
81 / / 18.10.2002
Цитата:
Originally posted by diablo_mgn


Напиши как ты открываешь базу?



Открываю как обычный файл в бинарном режиме:
char ch[256];
CMemFile bd;
bd.Open("bd.dbf", CFile::modeReadWrite|CFile::typeBinary);
дальше считываю данные:
..............
bd.Read(&ch, 256);
Вот, собственно, и все.

2.2K
04 февраля 2003 года
diablo_mgn
16 / / 31.01.2003
Цитата:
Originally posted by little brother


Открываю как обычный файл в бинарном режиме:
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 не быстрей.

462
04 февраля 2003 года
little brother
81 / / 18.10.2002
Цитата:
Originally posted by diablo_mgn

Попробуй открыть базу через ODBC в CRecordset или затолкай dbfник в акцессовую базу и открой через CDaoRecordset, открывай dynamic. Откроется моментально, зато по записям ходить долго (миллион же), но думаю что и FoxPro не быстрей.



Да то-то и оно, что я не знаю как это сделать! Буду благодарен за пример какой-нибудь, или ссылку на инфу в и-нете.

2.2K
04 февраля 2003 года
diablo_mgn
16 / / 31.01.2003
Цитата:
Originally posted by little brother


Да то-то и оно, что я не знаю как это сделать! Буду благодарен за пример какой-нибудь, или ссылку на инфу в и-нете.



Ссылка в инете - пожалуйста, firststeps.ru, там есть все и по шагам.

Посоветую. Засунь дбфник в акцессовую базу (в акцесс 97, если хочешь 2000 или 2002, то читай - я где-то в форуме написал как). Затем открываешь свой проект, тычешь add new class, пишешь наследовать от CDaoRecordset, дальше сам разберешься.

462
06 февраля 2003 года
little brother
81 / / 18.10.2002
Цитата:
Originally posted by diablo_mgn


Ссылка в инете - пожалуйста, firststeps.ru, там есть все и по шагам.

Посоветую. Засунь дбфник в акцессовую базу (в акцесс 97, если хочешь 2000 или 2002, то читай - я где-то в форуме написал как). Затем открываешь свой проект, тычешь add new class, пишешь наследовать от CDaoRecordset, дальше сам разберешься.



Линк толковый и совет дельный, но не все так прозрачно, как хотелось бы. Сделал я прогу с базой mdb(Access 2002) и все нормально работает, даже проблем, тобой описаных ранее, не встретил, а вот с dbf форматом не получается. Во первых не могу открыть файл (выдает ошибку, мол, не верно задано имя файла и путь к нему), а если файл открываю (оссоциирую в панели управления с источником), то не могу достать данные, точнее не знаю какое имя таблицы задавать??? (Это я пробовал select). Вот, собственно, два вопроса на повестке дня.
А вообще - спасибо за помощь!

2.2K
06 февраля 2003 года
diablo_mgn
16 / / 31.01.2003
Цитата:
Originally posted by little brother


Линк толковый и совет дельный, но не все так прозрачно, как хотелось бы. Сделал я прогу с базой mdb(Access 2002) и все нормально работает,
//Значит пишешь на Visual.Net
даже проблем, тобой описаных ранее, не встретил, а вот с dbf форматом не получается. Во первых не могу открыть файл (выдает ошибку, мол, не верно задано имя файла и путь к нему),
//Где и как ты его открываешь?
а если файл открываю (оссоциирую в панели управления с источником), то не могу достать данные, точнее не знаю какое имя таблицы задавать???
//А в dbf нет таблиц :) это и есть одна таблица
(Это я пробовал select).
//А как ты его пробовал
Вот, собственно, два вопроса на повестке дня.
А вообще - спасибо за помощь!

462
07 февраля 2003 года
little brother
81 / / 18.10.2002
Во-первых пишу я на VC++ 6, открывать пытаюся так же, как и *.mdb - существует файл "C:/file.dbf", открываем:
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);

Открыть не удается!
462
10 февраля 2003 года
little brother
81 / / 18.10.2002
Цитата:
Originally posted by little brother
Открыть не удается!



Продолжил экспериментировать и обнаружил, что некоторые файлы открыть удается, а некоторые нет. Вот это мне вообще непонятно!!! Все мои файлы являются dBase III, но некоторые просто не открываются (ну и фиг ним:). Проблема есть еще и с теми, которые открыть удается! А именно: при использовании метода CRecordset cr; cr.GetFieldValue(1,str); я получаю значение не первого, а второго поля. Подскажите ПЛИЗ! как открыть первое поле и, почему, некоторые файлы не могут открыться.

2.2K
10 февраля 2003 года
diablo_mgn
16 / / 31.01.2003
Цитата:
Originally posted by little brother


Продолжил экспериментировать и обнаружил, что некоторые файлы открыть удается, а некоторые нет. Вот это мне вообще непонятно!!! Все мои файлы являются dBase III, но некоторые просто не открываются (ну и фиг ним:).
//////
Я сам не знаю в чем дело. У меня такое же было. Попробуй открыть их в какой-нибудь проге, где они нормально открываются (н-р DBFViewer), и снова сохранить/
//////
Проблема есть еще и с теми, которые открыть удается! А именно: при использовании метода CRecordset cr; cr.GetFieldValue(1,str); я получаю значение не первого, а второго поля. Подскажите ПЛИЗ! как открыть первое поле и, почему, некоторые файлы не могут открыться.
//////
А ты попробуй CRecordset cr; cr.GetFieldValue(0,str). У них счет с нуля.

462
10 февраля 2003 года
little brother
81 / / 18.10.2002
Неа - все равно не катит. Я сделал так: cr.Open(CRecordset::snapshot, "SELECT pole1, pole1 FROM file.dbf",CRecordset::readOnly).
То бишь два раза запрашиваю первое поле и, только тогда, все получается! Чушь полная - но работает :).
2.2K
10 февраля 2003 года
diablo_mgn
16 / / 31.01.2003
Цитата:
Originally posted by little brother
Неа - все равно не катит. Я сделал так: 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]

462
11 февраля 2003 года
little brother
81 / / 18.10.2002
А что он пишет и возвращает если поставить ноль в GetFieldValue? Если я запрашиваю нулевую запись или нулевое поле, то я получаю disconnect от базы. А пишет он то, что я ему указываю - обрабатываю исключительные ситуации. Ну это уже история, ведь все работает (мне поле и три раза указать не лень).
А вот что на счет печати, так я сам глубоко не копался. Но ходят слухи, что этим делом грешны функции-члены от CView. Ну, типа: OnPreparePrinting(), DoPreparePrinting(), OnBeginPrinting(), OnPrepareDC(), OnPrint(), OnEndPrintPreview(), OnEndPrinting() и т.д. и, как говорится, т.п. Информацию о состоянии хранит CPringInfo, остановка и отмена печати при помощи OnPrepareDC() и OnPring().
Наверное ты это уже знал, но большего я сказать сейчас не могу (сам не знаю)!
2.2K
11 февраля 2003 года
diablo_mgn
16 / / 31.01.2003
Рад был помочь :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог