Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как из Delphi программно создать связь между двумя базами Access? [D7, Access]


Dmitriy_info ©   (2007-01-10 13:44:00) 

Сам Access позволяет создать связь с таблицей из другой базы.
Как сделать это программно из Delphi?


Dmitriy_info   (2007-01-17 10:21:00) [1]

to Savek
Вы привели пример SQL с явным указанием пути к БД.
А как быть, если нужно ввести пароль?


sniknik   (2007-01-11 12:54:00) [2]

jro немного не то, там фактически одна уже используемая тобой функция да репликация.
см. хелп (JETSQL40.CHM).

> Или "access.application".
а это зачем?
> Может с его помощью можно связь установить?
наверняка можно тк. это сам access (программа) и есть, но вот делать этого я бы не стал, какой смысл вообще притягивать прогу ms offise-а для работы с базой. она тогда должна распространятся с твоей программой... тк. как бы частью ее становится.


Dmitriy_info   (2007-01-11 11:53:00) [3]

Я сжимаю базу при помощи "jro.JetEngine".
...
var
 V: Variant;
begin
V:=CreateOleObject('jro.JetEngine');
V.CompactDatabase("...", "..."); // сжимаем
...

Или "access.application".
Может с его помощью можно связь установить?


sniknik   (2007-01-11 11:39:00) [4]

> наверняка есть и в jet, если поискать...
ага, есть, тот же TableDef Object (счас посмотрел). вот примера в нем нет (но должен быть аналогичным)


sniknik   (2007-01-11 11:33:00) [5]

> Но минус в том, что все базы запаролены.
с паролем на базу
select * from table in "" [MS Access;DATABASE=c:\...OtherBase.mdb;PWD=111]

> для этого явно есть некий SQL, который можно выполнить самому
если и есть то я его не видел, т.е. именно для создания аналогичного линка как описано, встречал только через обьекты dao (наверняка есть и в jet, если поискать...)
пример их хелпа (бейсик)
   ...
   Dim dbsCurrent As Database
   Dim tdfLinked As TableDef

   ' Open a database to which a linked table can be
   ' appended.
   Set dbsCurrent = OpenDatabase("DB1.mdb")

   ' Create a linked table that points to a Microsoft
   ' SQL Server database.
   Set tdfLinked = _
       dbsCurrent.CreateTableDef("AuthorsTable")
   tdfLinked.Connect = _
       "ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers"
   tdfLinked.SourceTableName = "authors"
   dbsCurrent.TableDefs.Append tdfLinked
...


Savek   (2007-01-11 11:24:00) [6]

Мой предшественник так и делал, в результате получилось янв1998.mdb ... дек2004.mdb куча баз. О какой то статистике не могло быть и речи (перебор занимал полдня). Пришлось слить все это творчество в одну базу Архив.mdb с двумя таблицами Master и Detail. На запрос уходит десятки секунд(!) при количестве записей подчиненной таблице порядка 1млн.

Советую задуматься над структурой


Dmitriy_info   (2007-01-11 11:18:00) [7]

to Правильный Вася

> для этого явно есть некий SQL, который можно выполнить самому

Какой именно. Можно по конкретнее?

to ЮЮ

> Остановись хотябы, на  текущая  архив за год  более старые
> архимы

Я привел пример подчеркивающий работу с некоторым количеством файлов.
Не стоит обсуждать идеалогию примера. Она выдумана для уточнения моего вопроса.
Мне нужен механизм связывающий две или более БД программно.

Надеюсь на получение ответов подкрепленных примерами.


ЮЮ   (2007-01-11 11:05:00) [8]

На каждый месяц по файлу.

Остановись хотябы, на
 текущая
 архив за год
 более старые архимы


Правильный Вася   (2007-01-11 10:47:00) [9]


> Правым кликом вызываем меню.Выбираем пункт "Связь с таблицами.
> .."Указываем путь к файлу *.mdb, с которым хотим установить
> связь.Выбираем таблицу, с которой хотим установить связь.

для этого явно есть некий SQL, который можно выполнить самому


Dmitriy_info   (2007-01-11 09:44:00) [10]

to Savek

Интересно! Я не знал про возможность указывать путь напрямую.
Но минус в том, что все базы запаролены.

to Правильный Вася

Все не так просто.
Есть БД, в ней хранятся быстро устаревающие данные.
Старые данные замедляют работу.
Стирать их нельзя. Они (редко) нужны для построения отчетов.

Я предполагаю работать с основной БД, а устаревшую информацию сливать в другие *.mdb файлы. На каждый месяц по файлу.

При построении отчета, я просто хочу подключать нужный *.mdb файл к основному. Вот тогда я и сделаю:
       SELECT Таблица1.Num, Таблица2.RAsmer
       FROM Таблица1 INNER JOIN Таблица2 ON Таблица1.Num = Таблица2.Num;

Руками можно подключить базу следующим образом:
Открываем Access.
Правым кликом вызываем меню.
Выбираем пункт "Связь с таблицами..."
Указываем путь к файлу *.mdb, с которым хотим установить связь.
Выбираем таблицу, с которой хотим установить связь.
Готово.

Но это слишком сложно для пользователей.
Мне нужен программный способ установления связей между базами.


Savek   (2007-01-10 16:01:00) [11]

Если нет паролей можно гетерогенный запрос отослать...

select * from table
union
select * from table in "c:\...OtherBase.mdb"


Правильный Вася   (2007-01-10 13:45:00) [12]

выполнить соответствующую SQL-команду?


Наверх

Титульная страница Поиск, карта сайта Написать письмо