Доступ к таблице MS ACCESS из кода Delphi
Мне нужно решить следующую задачу.
Существует сетевая бд, откуда нужно брать информацию, а затем писать все в локальную - MS Access.
Не придумал ничего лучше, как полученные запросом данные писать в двумерный массив (строка, столбец). Предполагаю открыть Access как com-объект, получить доступ к таблице и внести последовательно данные в каждое поле.
Создаю экземпляр Access-а, открываю файл, получаю ссылку на таблицу:
oAccessApplication := CreateObject("Access.Application");
oAccessApplication.OpenCurrentDatabase(strConPath);
oCurrentData := oAccessApplication.CurrentData;
oCurrentTable := oCurrentData.AllTables('View_M');
А как теперь получить доступ к строкам/столбцам и вставить данные?
Нигде не могу толкового описания найти.
А может есть способ проще? Как сделать нечто подобное "малой кровью"?
Может быть можно как-то обращаться к полученным данным как к представлению (View), и выбирать данные обычным запросом?
Вообще говоря, нужно двумя запросами получить нужные данные из двух разных сетевых БД, а затем собрать все в кучу третьим запросом. Если бы можно было с полученным набором данных обращаться как с таблицей/представлением и производить SQL-запросом выборку оттуда, то никакой access, и вообще любые промежуточные звенья, не нужны были бы.
Либо, как вариант объеденить в одном запросе данные из двух баз (организовал два объекта TADOConnection, два TQuery)...
Может кто-нибудь сталкивался? Как реализовать подобное?
Не знаю, можно ли это сделать в ADO, но когда-то можно было сделать в BDE. Почитай в справке BDE - есть специальный синтаксис, позволяющий задать alias непосредственно в тексте запроса и сделать запрос между разными alias-ами. Как точно - уже не помню.
Можно ещё сделать в Oracle, даже синтаксис навскидку могу подсказать, но не уверен, что оно тебе надо. ;)
Можно ещё сделать в Oracle, даже синтаксис навскидку могу подсказать, но не уверен, что оно тебе надо. ;)
Сетевые бд оракловые. использую адо.
Подскажи;)
я тут пришел к мысли (если уж не сделать такого в одном запросе), что проще всего разрешить эту задачу созданием временного экселевского файла, в разные листы которого помещать результат запросов. После того, как все данные будут получены, подцепляться к нему, и выбирать то, что нужно...
Делаеш два ADO соединения для сетевой базы и для Access.
Два ADOQuery по одному для каждого соединения, в первом запрос на выборку, во втором запрос на савку с параметрами... и вперёд ADOQuery1.Parameters.ParamByName('...').Value:=ADOQuery2.FieldByName('...').Value;
Единственно с BLOB полями придётся подумать, но это решаемо... через потоки
Извращение, конечно. Посмотри в справке Oracle оператор create link, а если непонятно, теорию по ним.
Считаю, что ты владеешь терминологией Oracle и не будешь называть базой другую схему в экземпляре - её достаточно указать через точку.
Делаеш два ADO соединения для сетевой базы и для Access.
Два ADOQuery по одному для каждого соединения, в первом запрос на выборку, во втором запрос на савку с параметрами... и вперёд ADOQuery1.Parameters.ParamByName('...').Value:=ADOQuery2.FieldByName('...').Value;
Единственно с BLOB полями придётся подумать, но это решаемо... через потоки
Спасибо, это действительно проще:)
Спасибо за ответ. Пожалуй, придется разбираться уже после того, как я предоставлю "быстрое решение", поскольку, как обычно, сейчас времени разбираться нет:(