как програмно подключаться к разным _be.mdb ?

стас1
Дата: 25.05.2004 17:07:55
работаю в Access 2000.
подскажите пожалуйста как програмно подключаться к разным _be.mdb
т.е. на стартовой форме давать юзеру выбирать, к какой _be.mdb он хочет подключиться.
час искал поиском, не нашёл
спасибо
АлексейК
Дата: 25.05.2004 17:11:47
все зависит от типа подключения:

если у тебя таблицы приликкованы то ищи как перелинковать все таблицы, обновить линки

если используешь ado то сохраняй в настройке /в переменной / в параметре
строку подключения к базе
фыыф
Дата: 25.05.2004 17:23:27
по разному

если перецепить только то, что прицеплено (и только с выбранного пути)

я пользую:
Function newPathAuto(PString As String, OldPString As String) As Integer
On Error GoTo err_newPathAuto
    newPathAuto = -1
    DoCmd.Hourglass True
    Dim MyWork As Workspace, BD As Database ', OldPString
    'Dim i_Table As String 'TableDef
    Dim dfTable As TableDef
    Dim rst As Recordset
    Set MyWork = DBEngine.Workspaces(0)
    Set BD = MyWork.Databases(0)
    BD.TableDefs.Refresh
    Set rst = BD.OpenRecordset("_Connected_Tables", DB_OPEN_DYNASET)
    rst.MoveLast
    rst.MoveFirst
    Dim imax As Integer, i As Integer
    Dim tdfName As String
        imax = rst.RecordCount
        For i = 1 To imax
            If rst("Database") & "" <> "" Then
                tdfName = rst.Fields("Name")
                Set dfTable = BD.TableDefs(tdfName)
                'If dfTable.Connect = IIf((rst.Fields("connect") & "") <> "", rst.Fields("connect"), ";") & "DATABASE=" & OldPString Then
                If rst.Fields("DATABASE") = OldPString Then
                    dfTable.Connect = IIf((rst.Fields("connect") & "") <> "", rst.Fields("connect"), ";") & "DATABASE=" & PString
                    dfTable.RefreshLink
                End If
            End If
            rst.MoveNext
        Next i
        
exit_newPathAuto:
    'logPrint "Подключение " & PString & " " & (newPathAuto <> 0)
    Set MyWork = Nothing
    Set BD = Nothing
    Set dfTable = Nothing
    DoCmd.Hourglass False
    Exit Function
err_newPathAuto:
    newPathAuto = 0
    If Not dfTable Is Nothing Then
        tdfName = dfTable.Name
    Else
        tdfName = ""
    End If
    MsgBox "Ошибка подключения " & err & " in " & tdfName
    'Debug.Print "Ошибка подключения " & Err & " in " & tdfName
    'logPrint "Ошибка подключения " & Err & " in " & tdfName
    Resume exit_newPathAuto: 'Next '
End Function
где
_Connected_Tables
SELECT DISTINCTROW MSysObjects.Database, MSysObjects.Connect, MSysObjects.ForeignName, MSysObjects.Name
FROM MSysObjects
WHERE (((MSysObjects.Database) Is Not Null)) OR (((MSysObjects.Connect) Is Not Null));
(можно и через Connect, но смотреть глазом в грид запроса удобнее, чем запущать процедуру с выводом).

подключаем только то, что было и только из тех таблиц, которые были подключены по OldPString (другие не трогаем).

при новом подключении (всех, или по выбору) кажется TransferDatabase acLink предпочтительнее, чем CreateTableDef, поскоку последний у меня нормально цеплял только как dbAttachExclusive (при создании), потом только сбрасывался в нормальный. Что неприятно при наличии паралельного подключения.
стас1
Дата: 25.05.2004 17:52:55
вот так вроде получилось (нашёл на форуме):
Call Prilinkovka("E:\233_DB.mdb")
Function Prilinkovka(sBase)

Dim dbs As Database
Dim tdf As TableDef
Dim lngX As Long

Set dbs = CurrentDb
SysCmd acSysCmdInitMeter, "Otkryvaem... " & sBase, dbs.TableDefs.Count
lngX = 0
For Each tdf In dbs.TableDefs
    If Len(tdf.Connect) > 0 Then
        tbl_name = tdf.SourceTableName
        If Not (InStr(1, tbl_name, "$", 1) > 0) Then
            tdf.Connect = ";DATABASE=" & sBase
            tdf.RefreshLink
        End If
    End If
    SysCmd acSysCmdUpdateMeter, lngX
Next tdf
SysCmd acSysCmdUpdateMeter, dbs.TableDefs.Count
SysCmd (acSysCmdClearStatus)
dbs.Close

End Function
только я пока не понимаю, что делают команды:
SysCmd acSysCmdInitMeter, "Otkryvaem... " & sBase, dbs.TableDefs.Count
SysCmd acSysCmdUpdateMeter, dbs.TableDefs.Count
SysCmd (acSysCmdClearStatus)
?
Владимир Саныч
Дата: 25.05.2004 18:03:12
Эти команды показывают на экране ProgressBar.
стас1
Дата: 25.05.2004 18:20:03
понял