JOIN с таблицей из другой (не текущей) базы Access

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

JOIN с таблицей из другой (не текущей) базы Access

Сообщение VVitafresh » 13.05.2005 (Пт) 0:57

Есть SQL запрос, который к таблице T1 в текущей базе добавляет записи из таблицы T2, находящейся в другой базе Access ('C:\DB2.mdb') - этот запрос работает нормально:
Код: Выделить всё
INSERT INTO T1
SELECT *
FROM T2 IN 'C:\DB2.mdb'
WHERE ...


Есть SQL запрос, кот. обновляет поле Field2 таблицы T1 соответствующими значениями из связанной таблицы T2 и этот запрос работает нормально:

Код: Выделить всё

UPDATE T1 INNER JOIN T2 ON T1.Field1 = T2.Field1
SET T1.Field2 = T2.Field2


Внимание вопрос:
Как можно проапдейтить поля в таблице T1, если T2 находится в другой базе. Куда ни пытаюсь прилепить IN 'C:\DB2.mdb' - вылазит ошибка синтаксиса.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 14.05.2005 (Сб) 11:09

Может не четко сформулировал вопрос.
Как аналогично запросу:
Код: Выделить всё

UPDATE T1 INNER JOIN T2 ON T1.Field1 = T2.Field1
SET T1.Field2 = T2.Field2


Составить запрос, если таблица T2 находится в другой базе, напр., 'C:\DB2.mdb'

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 14.05.2005 (Сб) 11:40

приатач нужную тебе таблицу и работай с ней как со своей

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Правильный ответ

Сообщение VVitafresh » 18.05.2005 (Ср) 11:33

Кому интересно, вот правильный ответ на поставленный мной вопрос (помогли знающие люди):

Код: Выделить всё

UPDATE t1 INNER JOIN [SELECT t2.Field1, t2.Field2
FROM t2 IN 'С:\db2.mdb']. as t3 ON t1.Field1=t3.Field1 SET t1.Field2 = t3.Field2;


Тему можно считать закрытой.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.05.2005 (Ср) 11:54

А чем не подошло приаттачивание таблицы?
Lasciate ogni speranza, voi ch'entrate.

PLA
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 08.04.2005 (Пт) 16:09
Откуда: Москва

Сообщение PLA » 18.05.2005 (Ср) 16:21

Не тема не закрыта! А как в SQL запросе приатачить другую базу Access, если она под кодом (требуется пароль для открытия).

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 18.05.2005 (Ср) 17:08

Согласен, еще не закрыта. Мне тоже интересен вопрос.

alibek писал(а):А чем не подошло приаттачивание таблицы?


Может и такой вариант подойдет, но я не знаю как программно приаттачить таблицу в VB (не VBA) через DAO или ADO.
Ведь я так понимаю
Код: Выделить всё

DoCmd.TransferDatabase acLink, "Microsoft Access", "C:\base.mdb", acTable, "Table1", "Table1"

работает только если создать объект Access и использовать его объектную модель, что мне не хочется делать (чтобы не плодить Reference на подключаемые библ.).

Если есть фрагмент кода для ADO или DAO прошу поделиться. Желательно с учетом вопроса PLA (если база под паролем).
Последний раз редактировалось VVitafresh 18.05.2005 (Ср) 20:50, всего редактировалось 1 раз.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 18.05.2005 (Ср) 18:10

надо через TableDefs:

Код: Выделить всё
Dim cName as String
Dim connectstr  as String
Dim db As DAO.Database
Dim Tbl As DAO.TableDef
Dim wks As DAO.Workspace

141     Set wks = DAO.CreateWorkspace("my", , , DAO.dbUseJet)
142     Set db = wks.OpenDatabase("c:\temp\mydb.mdb")

                  cName="SCOTT.Orders"
                  connectstr = "ODBC;Driver={" & mDSN.ODBC_DriverOracle & "};Server=" & ServerName & ";UID=" & UID & ";PWD=" & pwd

146             Set Tbl = db.CreateTableDef(cName)
147             Tbl.SourceTableName = cName
148             Tbl.Connect = connectstr
149             db.TableDefs.Append Tbl
150             db.TableDefs.Refresh

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 22.05.2005 (Вс) 12:16

Извиняюсь, что так долго не отвечал: был в отпуске, ездил в Киев.

Попробовал способ приаттачивания в базу db1.mdb таблицы из db2.mdb, кот. предложил Konst_One (изменил Connect String под Access):
Код: Выделить всё

    Dim daoWrk As DAO.Workspace
    Dim daoDB As DAO.Database
    Dim Tbl As DAO.TableDef

    Dim sName As String
    Dim sCn As String

    sCn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\db2.mdb;User Id=admin;Password=;"

    sName = "TableName"

    Set daoWrk = DAO.CreateWorkspace("my", "admin", "", DAO.dbUseJet)
    Set daoDB = daoWrk.OpenDatabase("c:\db1.mdb")
    Set Tbl = daoDB.CreateTableDef(sName)
    Tbl.SourceTableName = sName
    Tbl.Connect = sCn

    daoDB.TableDefs.Append Tbl
    daoDB.TableDefs.Refresh
   
    daoDB.Close


На строке daoDB.TableDefs.Append Tbl бъет ошибку 3170: Could not find installeble ISAM.

В Reference библиотека DAO 3.6 у меня подключена. Пробовал строку подключения
Код: Выделить всё

    sCn = "Driver={Microsoft Access Driver (*.mdb)};" & _
        "Dbq=c:\db2.mdb;Uid=Admin;Pwd=;"


Это ничего не дает. В чем еще может быть проблема?

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 02.06.2005 (Чт) 20:16

Неужели ни у кого не возникло идеи, почему бьет ошибку приведенный выше код?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 03.06.2005 (Пт) 10:06

VVitafresh писал(а):Неужели ни у кого не возникло идеи, почему бьет ошибку приведенный выше код?


Какие могут быть идеи, если строка подключения для ADO, а ты используешь DAO...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 05.06.2005 (Вс) 17:30

Andrey Fedorov, спасибо за подсказку. Главное показать путь решения проблемы.
А для таких как я начинающих привожу получившуюся у меня функцию прилинковки:
Код: Выделить всё

Public Function LinkTable(sPath1 As String, sPWD1 As String, sLinkTblAs As String, sPath2 As String, sPWD2 As String, sLinkTbl As String) As Boolean
    'Прилинковка таблицы из другой базы Access
    'sPath1, sPWD1 - путь и пароль к базе, в которую нужно прилинковать табл.
    'sLinkTblAs - под каким именем прилинковывать таблицу
    'sPath2, sPWD2 - путь и пароль к базе, в которой находится подсоединяемая табл.
    'sLinkTbl - имя таблицы в этой базе
   
    Dim daoDB As DAO.Database
    Dim daoEng As DAO.DBEngine
    Dim daoWrk As DAO.Workspace
    Dim Tbl As DAO.TableDef

    On Error Resume Next
   
    If Dir(sPath1) = "" Then Exit Function
    If Dir(sPath2) = "" Then Exit Function
   
    Set daoWrk = DAO.CreateWorkspace("my", "admin", "", DAO.dbUseJet)
    Set daoDB = daoWrk.OpenDatabase(sPath1, , , ";UID=sa;PWD=" & sPWD1 & ";")
    If Err.Number <> 0 Then Exit Function
   
    Set Tbl = daoDB.CreateTableDef(sLinkTblAs)
    Tbl.SourceTableName = sLinkTbl
    Tbl.Connect = ";DATABASE=" & sPath2 & ";UID=sa;PWD=" & sPWD2 & ";"
    daoDB.TableDefs.Append Tbl
    If Err.Number <> 0 Then Exit Function
    daoDB.TableDefs.Refresh
   
    LinkTable = Err.Number = 0
    daoDB.Close
End Function


Вызов функции (если базы без пароля):
Код: Выделить всё

Result = LinkTable("c:\db1.mdb", "", "Tbl1", "c:\db2.mdb", "", "Tbl2")
If Result=True Then MsgBox "Всё ОК."



Если что упустил, пусть гуру меня поправят.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList