Кот
Гость
|
|
« : 04-12-2003 03:50 » |
|
Народ может у кого есть описание как скрестить сабж. На многих форумах задавал этот вопрос в основном приводят небольшой кусок и все. Может у кого есть почитать по подробнее на русском.
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #1 : 04-12-2003 04:16 » |
|
Кот, нету ничего такого. Пользовался MSDN и описанием от Дельфи. Спроси чего по конкретней отвечу максимально развёрнуто.
|
|
|
Записан
|
Странно всё это....
|
|
|
Serega
Гость
|
|
« Ответ #2 : 04-12-2003 08:39 » |
|
Никогда не работал с Builder'ом, но там наверняка есть аналог #import
|
|
|
Записан
|
|
|
|
WW
Гость
|
|
« Ответ #3 : 04-12-2003 09:43 » |
|
А TADOConnection, TADODataSet и еже с ними чем не подходят? Вкладка ADO. Инкапсулируют ADO от MS/
|
|
|
Записан
|
|
|
|
Gunman
Гость
|
|
« Ответ #4 : 04-12-2003 10:29 » |
|
1) Полнстью присоединяюсь к WW 2) bcbdev.ru
|
|
|
Записан
|
|
|
|
Kern
Гость
|
|
« Ответ #5 : 04-12-2003 12:38 » |
|
А меня вот какие вопросы интересуют при работе ADO vs CBiulder Мне нравится работать в SQL запросах. Так как запросы очень разнообразные и часто приходится делать различные командные запросы к БД. Как следствие на форме только одна компонента TADOConnection. в run-time создаю TADOCommand и через нее получаю TADOTable БД на основе Access - *.mdb Так вот как поменять в run-time путь к БД? при любых попытках сделать компонент говорит неверные параметры. Как работать с БД более эффективно? то есть я делаю SELECT id1,id2,id3 FROM t а чтобы обратиться к полям я должен каждый раз использовать функцию GetFieldByName()... но ведь я-то знаю порядок возвращаемых элементов а поиск по строке IMHO существенно менее эффективен (особенно когда нада пробежаться по десятку-тысяч элементов ) И еще вопрос про ADO - поддерживают ли они multi-thread - т.е. обращение к БД одновременно несколькими нитями из одной программы и в каких пределах?
|
|
|
Записан
|
|
|
|
SOS
Гость
|
|
« Ответ #6 : 04-12-2003 13:48 » |
|
И еще вопрос про ADO - поддерживают ли они multi-thread - т.е. обращение к БД одновременно несколькими нитями из одной программы и в каких пределах?
Eshe kak, a)|( pyx letit .
|
|
|
Записан
|
|
|
|
Strannik
Гость
|
|
« Ответ #7 : 04-12-2003 14:06 » |
|
У меня была только одна проблема с ADO в BCB5.
При попытке выполнить такой код: ADODataSet1->Recordset = Command1.Execute() программа вылетала с системной ошибкой в ADO, если процедура(в Command1) не возвращала рекордсет. Причем после этого любое обращение к методам ADO вызывало разные ошибки и призодилось перезапускать программу.
|
|
|
Записан
|
|
|
|
Kern
Гость
|
|
« Ответ #8 : 05-12-2003 06:32 » |
|
Eshe kak, a)|( pyx letit .
а на каком уровне нада разделять нити? например для каждой нити создать по одному TADOConnection или достаточно не обращаться разными нитями к одной TADOTable? или нада все обращения к БД - делать через критическую секцию? - правда при этом теряется приемущество нитей... Для примера в документации к Postgress (БД под unix) ясно написанно что он безопасен в пределах одного PGconn (аналог TADOConnection) т.е. каждой нити по PGconn - и делай все что душе угодно. А возвращаемый результат вообще как угодно можно использовать (по аналогии - TADOTable) - т.е. обрабатывать сразу разными нитями... С проблемами типа ADODataSet1->Recordset = Command1.Execute() программа вылетала с системной ошибкой в ADO, если процедура(в Command1) не возвращала рекордсет.
Можно даже и не столкнуться - ведь на этапе проектирвания проги ты наверняка знаешь будет ли результат или не будет по поводу смены пути к БД: AnsiString PathDB="DB.mdb"; for(int i=0;i<ADOConnection->Properties->Count;i++){ if(AnsiString(ADOConnection->Properties->Item->Name)=="Data Source"){ ADOConnection->Properties->Item->Value=PathDB; break; } }
при компиляции выдается ошибка: [Linker Error] Unresolved external 'System::__linkproc__ __fastcall CheckAutoResult()' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\RELEASE\VCLE.LIB|syssupp при удалении этих строчек из проги, но при присутствии обращений к БД, чтения результатов и т.п. проблем нет. В Дельфи аналогичный код работает :?
|
|
|
Записан
|
|
|
|
FoxVID
Гость
|
|
« Ответ #9 : 05-12-2003 08:05 » |
|
по поводу смены пути к БД: А не проще ли будет создать файл линка данных (расширение .udl) и сослаться на него. При смене пути к базе данных меняется только этот файл, без перекомпилляции проекта.
|
|
|
Записан
|
|
|
|
FoxVID
Гость
|
|
« Ответ #10 : 05-12-2003 08:37 » |
|
При попытке выполнить такой код: ADODataSet1->Recordset = Command1.Execute() программа вылетала с системной ошибкой в ADO, если процедура(в Command1) не возвращала рекордсет. Так это и должно быть. Для выполнения команд, не возвращающих рекордсет, используй компонент ADOQuery или ADOStoredProc
|
|
|
Записан
|
|
|
|
Kern
Гость
|
|
« Ответ #11 : 05-12-2003 11:57 » |
|
FoxVID, А не проще ли будет создать файл линка данных (расширение .udl) и сослаться на него.
хм... не знаю как это делать (.udl). При чем здесь перекомпиляция? Я программно могу менять PathDB! (здесь привел код где PathDB как константа для простоты) фишка в том что код не хочет компилироваться как таковой
|
|
|
Записан
|
|
|
|
FoxVID
Гость
|
|
« Ответ #12 : 06-12-2003 10:19 » |
|
Kern, есть небольшая статейка по адресу http://bcbsql.narod.ru/pub/ispado.htmТам, на мой взгляд, достаточно полно описано создание файлов линка. Кстати, объясни мне, пожалуйста, для чего программно менять путь к базе данных? Они что, мигрируют?
|
|
|
Записан
|
|
|
|
Kern
Гость
|
|
« Ответ #13 : 06-12-2003 11:43 » |
|
FoxVID, За линк спасибо. С линкованием БД разобрался, теперь даже полу программно получается менять путь к БД - типа если задать несколько готовых .udl файлов между ними можно переключаться таким образом: ADOConnection1->Close(); ADOConnection1->ConnectionString="FILE NAME=E:\\proba 8.udl"; ADOConnection1->Open(); ADOTable1->Open();
В принципе проблема в моем контексте разрешена для чего программно менять путь к базе данных?
Например есть демонстрационная БД и рабочая БД. Или чтение пути к БД из конфигурационного файла... Или большая БД разбита на несколько кусков одной структуры но с разными данными - на ходу надо уметь придумать название текущего куска БД, потом к нему подконнектится или даже создать если таковой отсутсвтует. Теперь встает другой вопрос - как программно менять/создавать .udl файлы?
|
|
|
Записан
|
|
|
|
FoxVID
Гость
|
|
« Ответ #14 : 08-12-2003 07:38 » |
|
Kern, Например есть демонстрационная БД и рабочая БД.
Не вижу смысла здесь программно менять путь к базе данных. После успешного тестирования приложения раз и навсегда переходишь на рабочую. как программно менять/создавать .udl файлы?
не знаю. Кстати, вопрос интересный... :idea:
|
|
|
Записан
|
|
|
|
Kern
Гость
|
|
« Ответ #15 : 08-12-2003 13:19 » |
|
FoxVID, Не вижу смысла здесь программно менять путь к базе данных. После успешного тестирования приложения раз и навсегда переходишь на рабочую. А такой вариант: пользователь клацает кнопку в приложении "режим безболезненной демонстрации" - прога переключается в демо-БД и пользователь творит все что душе угодно Но все же если БД бьется на куски программным методом - то все равно нада переключаться между базами... А если заранее нельзя сказать на какие и сколько кусков бьется - то и нельзя заранее сделать файлы .UDL. про multi-thread - так ничего вразумительного и не сказанно...
|
|
|
Записан
|
|
|
|
FoxVID
Гость
|
|
« Ответ #16 : 11-12-2003 11:32 » |
|
А такой вариант: пользователь клацает кнопку в приложении "режим безболезненной демонстрации" - прога переключается в демо-БД и пользователь творит все что душе угодно Интересная мысль :!: Попробую и у себя что-нибудь подобное реализовать для новых бухгалтеров
|
|
|
Записан
|
|
|
|
Дикий
Гость
|
|
« Ответ #17 : 16-12-2003 08:21 » |
|
А такой вариант: пользователь клацает кнопку в приложении "режим безболезненной демонстрации" - прога переключается в демо-БД и пользователь творит все что душе угодно
А если попробовать Terminate, а потом опять креате? не пробовал, но почему бы нет?
|
|
|
Записан
|
|
|
|
Kern
Гость
|
|
« Ответ #18 : 16-12-2003 08:41 » |
|
Дикий, А если попробовать Terminate Это SQL-комманда или метод ADO компоненты или еще что? Или это нечто вроде отмененной транзакции (а ведь многие БД не поддерживают вложенных транзакций)? а потом опять креате это SQL комманда CREATE или опять нечто иное? З.Ы. В общем я не понял тебя
|
|
|
Записан
|
|
|
|
Дикий
Гость
|
|
« Ответ #19 : 16-12-2003 11:32 » |
|
Kern, фигню написал, но судя по методам можно сделать Close() АДОконнекшену и Open(), но уже с новыми параметрами кому есть с чем попробовать - пробуйте
|
|
|
Записан
|
|
|
|
FoxVID
Гость
|
|
« Ответ #20 : 13-01-2004 11:04 » |
|
А такой вариант: пользователь клацает кнопку в приложении "режим безболезненной демонстрации" - прога переключается в демо-БД и пользователь творит все что душе угодно
Попробовал. Лучше бы не пробовал. Только user-ов запутал. Забывают выйти из "режима безболезненной демонстрации", заносят документы, а ты их потом ищи.
|
|
|
Записан
|
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #21 : 13-01-2004 11:31 » |
|
Может в демо-режиме при занесениии документа в базу постоянно предупреждать об этом (демо-режим) )пользователей? Тогда не должны забыть
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
FoxVID
Гость
|
|
« Ответ #22 : 13-01-2004 12:59 » |
|
Может в демо-режиме при занесениии документа в базу постоянно предупреждать об этом (демо-режим) )пользователей?
Тоже верно, но как представлю, сколько надо вносить изменений в код программы Проще убрать демо-режим.
|
|
|
Записан
|
|
|
|
|