Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
46 / 31 / 1
Регистрация: 28.09.2012
Сообщений: 991

Код VBA для линковки (установлении связи) по двум или более драйверам ODBC

21.04.2017, 12:03. Показов 6093. Ответов 60
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Форумчане, дорого времени суток!
Есть код VBA, который производит линковку Аксесс 2003 с таблицами SQL (в данном случае MySQL). Используется драйвер ODBC для 32 разрядной ОС.

Есть компьютеры и с 64 разрядной ОС, для них ДРУГОЙ драйвер ODBC.
Прошу помочь составить код VBA, который мог бы связывать с таблицами использую драйвер или для 32 или для 64 разрядной ОС в зависимости от разрядности ОС конкретной машины..
Исходный кусочек кода прилагаю
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Public Sub LinkTablesMySQL_ADOX()
'Создание общей строки подключения и подлинковка таблиц MySQL
'--------------------------------------------------------------------------
Dim sDriver As String
Dim sServerAdr As String
Dim sCharset As String
Dim sServPort As String
Dim sDbName As String
Dim sUser As String
Dim sPassWord As String
Dim sConnect As String
Dim l&
'--------------------------------------------------------------------------
On Error GoTo LinkTablesMySQL_ADOX_Err
'Внимание - проверь версию драйвера! - Может уже... 5.5 или даже 6.2!?
    'sDriver = "{MySQL ODBC 5.2 ANSI Driver}"    'ANSI Driver
    sDriver = "{MySQL ODBC 3.51 Driver}"  'UNICODE Driver
    
    'sServerAdr = "localhost"
    sServerAdr = "111.111.1.111"   ' Адрес (Имя) сервера
    sServPort = "3306"         ' Порт соединения = 3306 (Обычно так и есть)
    sDbName = "base" ' Название базы
    sUser = "sistema"             ' Имя пользователя
    sPassWord = "999999"    ' Пароль
 
 
'Создаю строку подключения:
 sConnect = "ODBC;DRIVER=" & sDriver & _
        ";SERVER=" & sServerAdr & _
        ";Port=" & sServPort & _
        ";DATABASE=" & sDbName & _
        ";USER=" & sUser & _
        ";PASSWORD=" & sPassWord & _
        ";OPTION=3" & _
        ";stmt=set names cp1251"
        'Debug.Print sConnect
 
'--------------------------------------------------------------------
'Подключаем несколько таблиц по ADOX
        
l = LinkTable_ADOX("Afigenno", sConnect)
    If l > 0 Then Err.Raise l


Добавлено через 29 минут
Драйвер ODBC для 64 разрядной ОС для простоты назовем "Драйвер_64_ОС"
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.04.2017, 12:03
Ответы с готовыми решениями:

Код html или php для формы обратной связи
форма обратной связи!! подскажите плиз код html или php для формы обратной связи в моём случае форма для заявки в интернет...

Как соединиться из VBA с Interbase через ADO или ODBC?
Подскажите плз как соединиться из VBA с Interbase через ADO или ODBC. Может еще варианты есть?

Сложение в столбце по двум или более условиям
Есть три столбца с цифрами, допустим А, C, E, нужно сложить все цифры столбца А, но только при условии, что в аналогичных ячейках столбцов...

60
46 / 31 / 1
Регистрация: 28.09.2012
Сообщений: 991
27.04.2017, 13:04  [ТС]
Студворк — интернет-сервис помощи студентам
Eugene-LS,
Цитата Сообщение от Eugene-LS Посмотреть сообщение
Разрядность MySQL ODBC драйвера - должна совпадать с разрядностью MSO (а не СИСТЕМЫ).
Т.Е. Если система x64,а MSO=x32 (что довольно обычно), то - ставим драйвер - x32.
А если МSO вообще не установлен? Будут ли работать драйвера ODBC ?
0
Эксперт MS Access
 Аватар для Eugene-LS
13272 / 5949 / 1529
Регистрация: 05.10.2016
Сообщений: 16,653
27.04.2017, 13:13
Цитата Сообщение от ankan Посмотреть сообщение
Будут ли работать драйвера ODBC ?
Должны ...
Но я не экспериментировал.
MySQL Connector/ODBC Developer Guide
1
46 / 31 / 1
Регистрация: 28.09.2012
Сообщений: 991
27.04.2017, 14:32  [ТС]
mobile, Поменял имя драйвера, линковка происходит.
Рабочий код:
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
On Error GoTo LinkTablesMySQL_ADOX_Err
 
If vers = 64 Then
sDriver = "{MySQL ODBC 5.3 Unicode Driver}" 'Драйвер для 64 разрядной операционной системы
ElseIf Dir("C:\Program Files\MySQL\Connector ODBC 3.51", vbDirectory) <> "" Then
sDriver = "{MySQL ODBC 3.51 Driver}" 'Папка Connector ODBC 3.51 существует. Драйвер для 32 разрядной операционной системы(для устаревших компьютеров- где дополниетльные программы (требующиеся для работы этого драйвера) плохо или не ставятся вовобще)
ElseIf Dir("C:\Program Files\MySQL\Connector ODBC 5.3", vbDirectory) <> "" Then
sDriver = "{MySQL ODBC 5.3 Unicode Driver}" ' Папка Connector ODBC 5.3 существует. Драйвер для 32 разрядной операционной системы (для более современных. Требует установки дополнительных программ)
Else
MsgBox "Нет драйвера ODBC для работы с  MySQL"
  Exit Sub
End If


т.е работает при использовании драйвера MySQL ODBC 3.51 Driver -для 32 разрядного MSO
и при использовании MySQL ODBC 5.3 Driver- для 32 разрядного MSO

для 64 разрядного MSO еще не пробовал.

Есть проблема: при 64 разрядной операционной системе (ОС) - не путать с MSO, при ОТСУТСТВИИ Ms Office -не работает "Приложение будет завершено..."
линковка происходит, а когда пользователь вводит пароль - приложение сворачивается, с ошибкой выполнения.
2
Эксперт MS Access
 Аватар для Eugene-LS
13272 / 5949 / 1529
Регистрация: 05.10.2016
Сообщений: 16,653
27.04.2017, 14:46
Цитата Сообщение от ankan Посмотреть сообщение
а когда пользователь вводит пароль - - приложение сворачивается, с ошибкой выполнения.
К сожалению, ничего подсказать не могу, я без MSO не тестировал.
... Не Боги проги (и драйвера) пишут!
Возможно где то ошибка., бывало что приходилось откатываться на предыдущую версию, т.к. свежая "глючила".

Добавлено через 3 минуты
Цитата Сообщение от ankan Посмотреть сообщение
Рабочий код:
За код спасибо - беру в "копилку" - может ещё кому сгодится ...
0
46 / 31 / 1
Регистрация: 28.09.2012
Сообщений: 991
27.04.2017, 17:42  [ТС]
т.к. разрядность драйвера, как выяснилось, не зависит от разрядности ОС, а зависит от разрядности MsO, то код изменил. Проверил- работает за исключением
Цитата Сообщение от ankan Посмотреть сообщение
при 64 разрядной операционной системе (ОС) - не путать с MSO, при ОТСУТСТВИИ Ms Office -не работает
Необходимое условие, что бы в
"C:\Program Files\MySQL" -была папка (даже пустая) с именем "Connector ODBC 3.51"
или
"C:\Program Files\MySQL" -была папка (даже пустая) с именем "Connector ODBC 5.3"

код прилагаю
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
'--------------------------------------------------------------------------
On Error GoTo LinkTablesMySQL_ADOX_Err
 
If Dir("C:\Program Files\MySQL\Connector ODBC 3.51", vbDirectory) <> "" Then
sDriver = "{MySQL ODBC 3.51 Driver}" 'Папка Connector ODBC 3.51 существует. Драйвер для 32 разрядной операционной системы(для устаревших компьютеров- где дополниетльные программы (требующиеся для работы этого драйвера) плохо или не ставятся вовобще)
ElseIf Dir("C:\Program Files\MySQL\Connector ODBC 5.3", vbDirectory) <> "" Then
sDriver = "{MySQL ODBC 5.3 Unicode Driver}" 'Драйвер для 32 или драйвер для 64 разрядного MS Office - в зависимости , что установлено. Имя папки одинаковое.
Else
MsgBox "Нет драйвера ODBC для работы с  MySQL"
  Exit Sub
End If
0
46 / 31 / 1
Регистрация: 28.09.2012
Сообщений: 991
19.06.2017, 17:20  [ТС]
Форумчане, пишу дополнение к данной теме, прошу помочь!
Во вложении- работающий код линковки, прошу:
1. помочь очистить его от лишнего (подозреваю, что часть, касающаяся подключения по DAO не нужна,но точно не уверен)
2.поделиться опытом линковки не всех таблиц сразу (что долго), а части таблиц, затем при переходе в другую часть БД, линкуется еще часть таблиц, при закрытии удаляется часть линковки и т.п.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
[SPOILER]'--------------------------------------------------------------------
' Module    : modLinkTablesMySQL
' Author    : es
' Date      : 21.08.2016
' Purpose   : Подлинковка таблиц MySQL с автоматическим созданием DSN (ADOX или DAO)
'--------------------------------------------------------------------------
'Требуются ссылки на:
'    Microsoft ADO Ext. for DDL and Security. (Version 2.1 or higher)
'    Microsoft ActiveX Data Objects Library. (Version 2.1 or higher)
'--------------------------------------------------------------------
 
Public Sub LinkTablesMySQL_ADOX()
'Создание общей строки подключения и подлинковка таблиц MySQL
'--------------------------------------------------------------------------
Dim sDriver As String
Dim sServerAdr As String
Dim sCharset As String
Dim sServPort As String
Dim sDbName As String
Dim sUser As String
Dim sPassWord As String
Dim sConnect As String
Dim l&
 
'--------------------------------------------------------------------------
On Error GoTo LinkTablesMySQL_ADOX_Err
 
If Dir("C:\Program Files\MySQL\Connector ODBC 3.51", vbDirectory) <> "" Then
sDriver = "{MySQL ODBC 3.51 Driver}" 'Папка Connector ODBC 3.51 существует. Драйвер для 32 разрядной операционной системы(для устаревших компьютеров- где дополниетльные программы (требующиеся для работы этого драйвера) плохо или не ставятся вовобще)
ElseIf Dir("C:\Program Files\MySQL\Connector ODBC 5.3", vbDirectory) <> "" Then
sDriver = "{MySQL ODBC 5.3 Unicode Driver}" 'Драйвер для 32 или драйвер для 64 разрядного MS Office - в зависимости , что установлено. Имя папки одинаковое.
Else
MsgBox "Нет драйвера ODBC для работы с  MySQL"
  Exit Sub
End If
 
'On Error GoTo LinkTablesMySQL_ADOX_Err
'Внимание - проверь версию драйвера! - Может уже... 5.5 или даже 6.2!?
    'sDriver = "{MySQL ODBC 5.2 ANSI Driver}"    'ANSI Driver
    'sDriver = "{MySQL ODBC 3.51 Driver}"  'UNICODE Driver
    
    'sServerAdr = "localhost"
    sServerAdr = "111.111.1.111"   ' Адрес (Имя) сервера
    sServPort = "3306"         ' Порт соединения = 3306 (Обычно так и есть)
    sDbName = "111" ' Название базы
    sUser = "m1256t"             ' Имя пользователя
    sPassWord = "111111"    ' Пароль
 
 
'Создаю строку подключения:
 sConnect = "ODBC;DRIVER=" & sDriver & _
        ";SERVER=" & sServerAdr & _
        ";Port=" & sServPort & _
        ";DATABASE=" & sDbName & _
        ";USER=" & sUser & _
        ";PASSWORD=" & sPassWord & _
        ";OPTION=3" & _
        ";stmt=set names cp1251"
        'Debug.Print sConnect
 
'--------------------------------------------------------------------
'Подключаем несколько таблиц по ADOX
  
l = LinkTable_ADOX("Amper", sConnect)
    If l > 0 Then Err.Raise l
 
l = LinkTable_ADOX("Progr", sConnect)
    If l > 0 Then Err.Raise l
    
l = LinkTable_ADOX("Proizvod", sConnect)
    If l > 0 Then Err.Raise l
 
l = LinkTable_ADOX("R_RA", sConnect)
    If l > 0 Then Err.Raise l
    
l = LinkTable_ADOX("Rabota_Robotov", sConnect)
    If l > 0 Then Err.Raise l
 
l = LinkTable_ADOX("Requ_For_Specialty", sConnect)
    If l > 0 Then Err.Raise l
    
l = LinkTable_ADOX("Site", sConnect)
    If l > 0 Then Err.Raise l
 
l = LinkTable_ADOX("Sites_1", sConnect)
    If l > 0 Then Err.Raise l
    
l = LinkTable_ADOX("Texprocecc", sConnect)
    If l > 0 Then Err.Raise l
 
l = LinkTable_ADOX("Tip_Dokym", sConnect)
    If l > 0 Then Err.Raise l
    
l = LinkTable_ADOX("Tip_Operaciy", sConnect)
    If l > 0 Then Err.Raise l
 
l = LinkTable_ADOX("To_I_R", sConnect)
    If l > 0 Then Err.Raise l
    
l = LinkTable_ADOX("To_I_R_Prichina", sConnect)
    If l > 0 Then Err.Raise l
 
l = LinkTable_ADOX("To_Izd", sConnect)
    If l > 0 Then Err.Raise l
    
l = LinkTable_ADOX("To_Izd_Cpicok_Rab", sConnect)
    If l > 0 Then Err.Raise l
 
l = LinkTable_ADOX("To_Obor_Cpicok_Rab", sConnect)
    If l > 0 Then Err.Raise l
    
l = LinkTable_ADOX("Verciy_PO", sConnect)
    If l > 0 Then Err.Raise l
 
l = LinkTable_ADOX("Verciy_Po_Aktualn", sConnect)
    If l > 0 Then Err.Raise l
    
l = LinkTable_ADOX("Vid_Rabot", sConnect)
    If l > 0 Then Err.Raise l
 
l = LinkTable_ADOX("Vid_Rabot_To", sConnect)
    If l > 0 Then Err.Raise l
    
l = LinkTable_ADOX("Vizm_Neicpr_Napominal", sConnect)
    If l > 0 Then Err.Raise l
 
l = LinkTable_ADOX("Volt", sConnect)
    If l > 0 Then Err.Raise l
    
l = LinkTable_ADOX("Vozvrat_Iz_Otk", sConnect)
    If l > 0 Then Err.Raise l
 
l = LinkTable_ADOX("Vxod_Kontrol", sConnect)
    If l > 0 Then Err.Raise l
    
l = LinkTable_ADOX("Zakaz", sConnect)
    If l > 0 Then Err.Raise l
 
l = LinkTable_ADOX("Zakazchik", sConnect)
    If l > 0 Then Err.Raise l
    
l = LinkTable_ADOX("Zip", sConnect)
    If l > 0 Then Err.Raise l
 
l = LinkTable_ADOX("Zip_Cklad", sConnect)
    If l > 0 Then Err.Raise l
    
l = LinkTable_ADOX("Zip_Cklad_Racxod", sConnect)
    If l > 0 Then Err.Raise l
 
l = LinkTable_ADOX("Zip_Dvigenie", sConnect)
    If l > 0 Then Err.Raise l
    
l = LinkTable_ADOX("Zip_Imia", sConnect)
    If l > 0 Then Err.Raise l
 
l = LinkTable_ADOX("Zip_Mex_Cbor", sConnect)
    If l > 0 Then Err.Raise l
 
l = LinkTable_ADOX("Zip_Partiy", sConnect)
    If l > 0 Then Err.Raise l
    
l = LinkTable_ADOX("Zip_Partiy_Brem_Nakleika", sConnect)
    If l > 0 Then Err.Raise l
 
l = LinkTable_ADOX("Zip_Poctavshik", sConnect)
    If l > 0 Then Err.Raise l
    
l = LinkTable_ADOX("Zip_Vid", sConnect)
    If l > 0 Then Err.Raise l
 
l = LinkTable_ADOX("Zip_Ynikaln", sConnect)
    If l > 0 Then Err.Raise l
    
l = LinkTable_ADOX("Izdelie_Verciy_PO", sConnect)
    If l > 0 Then Err.Raise l
 
 
 DoCmd.OpenForm "fEnter1"
  
 
'--------------------------------------------------------------------------
'Подключаем пару таблиц по DAO
    'l = LinkTable_DAO("Ablom", sConnect, "Volt_DAO")
    'If l > 0 Then Err.Raise l
    
    'l = LinkTable_DAO("Cklad", sConnect, "Cklad_DAO")
    'If l > 0 Then Err.Raise l
 
        
LinkTablesMySQL_ADOX_Bye:
    Exit Sub
 
LinkTablesMySQL_ADOX_Err:
    MsgBox "Ошибка " & Err.Number & vbCrLf & Err.Description & vbCrLf & "в процедуре: LinkTablesMySQL_ADOX", vbCritical, "Error in module modConnectMySQL_DAO"
    Resume LinkTablesMySQL_ADOX_Bye
End Sub
 
 
Private Function LinkTable_ADOX(stRemTName As String, strConnect As String, Optional sLocalTName As String = "") As Long
'es 21.08.2016
'Подключение к таблице MySQL Server с автоматическим созданием DSN (ADOX)
'При удачном подключениии возвращает = 0 (ноль), при неудачном = КОД ОШИБКИ (номер)
'-------------------------------------------------------------------------
'Аргументы:
'   stRemTName  = Имя таблицы на сервере
'   strConnect  = Строка подключения к серверу
'   sLocalTName = Локальное Имя Таблицы
'-------------------------------------------------------------------------
Dim cat As New ADOX.Catalog
Dim tbl As New ADOX.Table
    
On Err GoTo LinkTable_ADOX_Err
 
'Если локальное имя не указанно
    If sLocalTName = "" Then sLocalTName = stRemTName
    
'Открываем каталог текущей базы
    Set cat.ActiveConnection = CurrentProject.Connection
    
'Если таблица с таким названием уже существует - Удаляем
    For Each tbl In cat.Tables
        If tbl.Name = sLocalTName Then cat.Tables.Delete tbl.Name
    Next
    
'Установка параметров таблицы
    With tbl
        .Name = sLocalTName
        Set .ParentCatalog = cat
        .Properties("Jet OLEDB:Link Provider String") = strConnect
        .Properties("Jet OLEDB:Remote Table Name") = stRemTName
        .Properties("Jet OLEDB:Create Link") = True
    End With
    
'Создаём новый обьект
    cat.Tables.Append tbl
 
'Обновляем список таблиц
    cat.Tables.Refresh
    CurrentDb.TableDefs.Refresh
    DoEvents
 
LinkTable_ADOX_Bye:
    Set cat = Nothing
    Set tbl = Nothing
    Exit Function
 
LinkTable_ADOX_Err:
    LinkTable_ADOX = Err.Number
    Debug.Print "Error " & Err.Number & vbCrLf & Err.Description & vbCrLf & _
            "in Function: esLinkTable_ADOX"
    Resume LinkTable_ADOX_Bye
End Function
 
 
Private Function LinkTable_DAO(sSourceTblName As String, sConnectStr As String, Optional sLocalTblName As String = "") As Long
'es - 29.12.2012
'Создаёт подлинкованную таблицу по параметрам подключения с автоматическим созданием DSN (DAO)
'При удачном подключениии возвращает = 0 (ноль), при неудачном = КОД ОШИБКИ (номер)
'--------------------------------------------------------------------
'Аргументы:
'   sSourceTblName  = Имя Таблицы Исходное (на сервере)
'   sConnectStr     = Строка подключения к серверу:
'   sLocalTblTName  = Локальное Имя Таблицы (по умолчанию = sSourceTblName)
'--------------------------------------------------------------------
Dim tdf As New DAO.TableDef
    If sLocalTblName = "" Then sLocalTblName = sSourceTblName
'Удаляем старую подлинковку (если была)
    On Error Resume Next
    CurrentDb.TableDefs.Delete sLocalTblName
    Err.Clear
   
On Error GoTo LinkTable_DAO_Err
'Установка параметров создаваемой таблицы
    With tdf
        .Name = sLocalTblName
        .Connect = sConnectStr
        .SourceTableName = sSourceTblName
    End With
    
'Создаём новый обьект Таблица
    CurrentDb.TableDefs.Append tdf
    DoEvents
    CurrentDb.TableDefs.Refresh
    
LinkTable_DAO_Bye:
    On Error Resume Next
    Set tdf = Nothing
    Exit Function
 
LinkTable_DAO_Err:
    LinkTable_DAO = Err.Number
    Debug.Print "Error " & Err.Number & vbCrLf & Err.Description & vbCrLf & _
        "in procedure LinkTable_DAO", vbCritical, "Error!"
    Resume LinkTable_DAO_Bye
End Function[/SPOILER]
0
Эксперт MS Access
 Аватар для Eugene-LS
13272 / 5949 / 1529
Регистрация: 05.10.2016
Сообщений: 16,653
19.06.2017, 21:36
Цитата Сообщение от ankan Посмотреть сообщение
от лишнего (подозреваю, что часть, касающаяся подключения по DAO не нужна,но точно не уверен)
Если DAO не используется - то точно не нужно. И к тому же, DAO не приспособлена к работе с удалёнными данными, насколько мне известно.

Если нужны табличные представления данных можно линковать через ADOX (вместо DAO).

Цитата Сообщение от ankan Посмотреть сообщение
2.поделиться опытом линковки не всех таблиц сразу (что долго)
Я забиваю все таблички в массив - и вперёд! (тут возможны варианты)

Ну не так уж долго, а нужно ли их линовать? - ещё вопрос.
Работа с ADO не проста, тут многое от сервера данных зависит (как выяснилось).
И строка подключения может отличатся....

Тема сложная и длинная.

Добавлено через 15 минут
ankan, спасибо что используете мой (уже старенький) пример кода и сохранили авторство.
Пример универсален, и я пытался сделать его более понятным при подготовке к публикации.
А всё универсальное ... далеко от идеала под специальною задачу.

Например, строка подключения может быть и такой:
Visual Basic
1
2
3
4
Public Const AConnStr_ADO$ = "Provider=MSDASQL;DRIVER={MySQL ODBC 5.3 Unicode Driver};" & _
                            "SERVER=XXX.XXX.XX.XXX;DATABASE=db_name;" & _
                            "USER=User_Name;PASSWORD=XXXXXXXX;Interactive=1;" & _
                            "OPTION=3;"
Весьма полезно изучить: Table 5.1 Connector/ODBC DSN Configuration Options ...

Добавлено через 5 минут
Кстати! -ankan, Драйвер уже есть 5.3 - пашет стабильно (у меня, и у тройки клиентов во всяком случае)
1
46 / 31 / 1
Регистрация: 28.09.2012
Сообщений: 991
26.06.2017, 11:02  [ТС]
Eugene-LS,
Цитата Сообщение от Eugene-LS Посмотреть сообщение
Кстати! -ankan, Драйвер уже есть 5.3 - пашет стабильно (у меня, и у тройки клиентов во всяком случае)
У меня на ноутбук что- то не хочет устанавливаться ( Vista Xome Premium). Поэтому использую старый драйвер 3.51.
Повторю свою просьбу- помогите, пожалуйста, удалить лишнюю часть кода линковки , оставить только линковку по ADOX.

Про массивы- звучит красиво, но для меня не понятно. Можно подробнее? насколько я понял формируются несколько массивов и по какому-то условию, срабатывает линковка таблиц того или иного массива? Можно приложить подробное описание и код массивов + код линковки?
0
Эксперт MS Access
 Аватар для Eugene-LS
13272 / 5949 / 1529
Регистрация: 05.10.2016
Сообщений: 16,653
26.06.2017, 11:37
Цитата Сообщение от ankan Посмотреть сообщение
помогите, пожалуйста, удалить лишнюю часть кода линковки
Создайте резервную копию и удалите функцию: LinkTable_DAO
Это лишнее.

Добавлено через 27 минут
Цитата Сообщение от ankan Посмотреть сообщение
Про массивы- звучит красиво, но для меня не понятно. Можно подробнее?
Нечто такое:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim arrTables() As Variant
Dim i%, s$, l&
 
'Массив табличек:
    arrTables = Array("tbl01", "tbl02", "tbl03", "tbl04", "tbl05", "tbl06") ' и т.д. ...
 
'Обработка всех таблиц в массиве:
    For i = LBound(arrTables) To UBound(arrTables)
        s = arrTables(i) 'Имя таблицы
        l = LinkTable_ADOX(s, sConnect)
        If l > 0 Then 
            Err.Raise l
            Exit for
        end if
    Next i
так покороче получается
1
46 / 31 / 1
Регистрация: 28.09.2012
Сообщений: 991
26.06.2017, 11:48  [ТС]
Eugene-LS, Спасибо!!
А если несколько массивов, то так ?
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim arrTables() As Variant
Dim i%, s$, l&
 
'Массив табличек:
    arrTables = Array("tbl01", "tbl02", "tbl03", "tbl04", "tbl05", "tbl06") ' и т.д. ...
    arrTables_1 = Array("tbl11", "tbl12", "tbl13", "tbl14", "tbl15", "tbl16") ' и т.д. ...
    arrTables_2 = Array("tbl33", "tbl42", "tbl56", "tbl58", "tbl60", "tbl61") ' и т.д. ...
'Обработка всех таблиц в массиве:
    For i = LBound(arrTables) To UBound(arrTables)
        s = arrTables(i) 'Имя таблицы
        l = LinkTable_ADOX(s, sConnect)
        If l > 0 Then 
            Err.Raise l
            Exit for
        end if
    Next i
Возможно ли данный код вставить в модуль проекта, а при срабатывании события (ввода пароля пользователя из определенной группы; в других случаях- при нажатии кнопки) запускать линковку таблиц из выбранного массива?
А код удаления линковки таблиц выбранных массивов приложите?
0
Эксперт MS Access
26828 / 14509 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
26.06.2017, 12:10
Я бы сделал одну функцию, а массивы передавал через параметр
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub Main
    Dim arrTables() As Variant
'Массив табличек:
    arrTables = Array("tbl01", "tbl02", "tbl03", "tbl04", "tbl05", "tbl06") ' и т.д. ...
    Link_Tables arrTables
    arrTables = Array("tbl11", "tbl12", "tbl13", "tbl14", "tbl15", "tbl16") ' и т.д. ...
    Link_Tables arrTables
    arrTables = Array("tbl33", "tbl42", "tbl56", "tbl58", "tbl60", "tbl61") ' и т.д. ...
    Link_Tables arrTables
End Sub
 
Sub Link_Tables(arrTables())
'Обработка всех таблиц в массиве:
    For i = LBound(arrTables) To UBound(arrTables)
        s = arrTables(i) 'Имя таблицы
        l = LinkTable_ADOX(s, sConnect)
        If l > 0 Then 
            Err.Raise l
            Exit for
        end if
    Next i  
End Sub
Удаление линкованных таблиц вполне уместно делать запросом. Удалится только линк. Сама таблица конечно же останется в мастер-базе
Visual Basic
1
2
3
4
5
6
Sub DeleteLinks(arrTables())
   Dim i
   For i=LBound(arrTables) To UBound(arrTables)
       currentdb.execute "drop table [" & arrTables(i) & "]"
   next
End Sub
1
46 / 31 / 1
Регистрация: 28.09.2012
Сообщений: 991
26.06.2017, 12:16  [ТС]
mobile, Массивы названы одинаково, это так и задумано? Ведь запускать линковку таблиц разных массивов нужно по возникновению разных событий. Как тогда массивы отличить?
0
Эксперт MS Access
 Аватар для Eugene-LS
13272 / 5949 / 1529
Регистрация: 05.10.2016
Сообщений: 16,653
26.06.2017, 12:20
Цитата Сообщение от ankan Посмотреть сообщение
Возможно ли данный код вставить в модуль проекта, а при срабатывании события (ввода пароля пользователя из определенной группы; в других случаях- при нажатии кнопки) запускать линковку таблиц из выбранного массива?
Конечно возможно!
0
46 / 31 / 1
Регистрация: 28.09.2012
Сообщений: 991
26.06.2017, 12:23  [ТС]
мыслю, что:
При открытии формы1 происходит линковка таблиц "массив_1"
При переходе из формы1 в форму2 происходит дополнительная линковка таблиц "массив2"
При закрытии формы2 (и перехода обратно, в форму1) происходит удаление линковки "масива2"
При закрытии формы1 происходит удаление линковки "массив1"
0
Эксперт MS Access
26828 / 14509 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
26.06.2017, 12:26
Входные массивы Вы можете назвать любыми подходящими именами. И конечно имена могут различаться. Внутри же функций Link_Tables и DeleteLinks переменная массива устанавливается по адресу входного массива, т.е. внутренний массив просто обращается к тому же месту в памяти, что и входной. Но с другим именем. Таким образом, называя входные массивы разными именами, никак не скажется на работе функции.
0
Эксперт MS Access
 Аватар для Eugene-LS
13272 / 5949 / 1529
Регистрация: 05.10.2016
Сообщений: 16,653
26.06.2017, 12:30
Цитата Сообщение от ankan Посмотреть сообщение
А код удаления линковки таблиц выбранных массивов приложите?
Можно использовать такое:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Public Sub DelConnectedTables()
' Удаляет из базы все подлинкованные таблицы
'--------------------------------------------------------------------
Dim cat As ADOX.Catalog
Dim tbl As ADOX.Table
Dim i As Integer
On Error GoTo DelConnectedTablesErr
 
    Set cat = New ADOX.Catalog
    cat.ActiveConnection = CurrentProject.Connection
    
    For Each tbl In cat.Tables
        If tbl.Properties("Jet OLEDB:Create Link") = True Then
            'Debug.Print tbl.Name
            'CurrentDb.Execute "drop table [" & tbl.Name & "]" 'как вариант
            CurrentDb.TableDefs.Delete tbl.Name
        End If
    Next
   
DelConnectedTablesBye:
    Set cat = Nothing
    Set tbl = Nothing
    Exit Sub
 
DelConnectedTablesErr:
    MsgBox "Произошла ошибка при удалении подключенных таблиц:" & vbCrLf & _
    Err.Description, vbCritical
    Resume DelConnectedTablesBye
End Sub
1
46 / 31 / 1
Регистрация: 28.09.2012
Сообщений: 991
26.06.2017, 12:58  [ТС]
Eugene-LS,
Цитата Сообщение от Eugene-LS Посмотреть сообщение
Удаляет из базы все подлинкованные таблицы
А как удалять из БД линки не всех таблиц а только таблиц из выбранного массива?

т.е.в модуле проекта должны быть заявлены функции:
линковки таблиц "массив1"
и
линковки таблиц "массив2"
и
т.д

также в модуле проекта должны быть заявлены:
удаление линковки таблиц "массив1"
и
удаление линковки таблиц "массив2"
и
т.д
_____________
При открытии формы1
Private Sub Form_Open(Cancel As Integer)
запуск линковки таблиц "массив1"
End Sub
_________________
При закрытии формы1
Private Sub Form_Close(Cancel As Integer)
запуск удаления линковки таблиц "массив1"
End Sub

Хочется как-то так. Возможно вся необходимая информация для самостоятельного составления такого кода уже есть, но мне сложнова-то это сделать.
Прошу Вашей помощи- написать полный код для модуля проекта и для запуска линковки и удаления линковки при открытии и закрытии формы.
0
Эксперт MS Access
 Аватар для Eugene-LS
13272 / 5949 / 1529
Регистрация: 05.10.2016
Сообщений: 16,653
26.06.2017, 13:17
Цитата Сообщение от ankan Посмотреть сообщение
А как удалять из БД линки не всех таблиц а только таблиц из выбранного массива?
Так mobile, вам дал готовый код уже! (несколькими постами выше)
Повторяю:
Visual Basic
1
2
3
4
5
6
Sub DeleteLinks(arrTables())
   Dim i
   For i=LBound(arrTables) To UBound(arrTables)
       currentdb.execute "drop table [" & arrTables(i) & "]"
   next
End Sub
Добавлено через 4 минуты
Цитата Сообщение от ankan Посмотреть сообщение
т.е.в модуле проекта должны быть заявлены функции:
линковки таблиц "массив1"
и
линковки таблиц "массив2"
и
т.д
Нет!
mobile вам написал уже готовый УНИВЕРСАЛЬНЫЙ вариант!
Повторяю:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub Link_Tables(arrTables())
'Обработка всех таблиц в массиве:
    For i = LBound(arrTables) To UBound(arrTables)
        s = arrTables(i) 'Имя таблицы
        l = LinkTable_ADOX(s, sConnect)
        If l > 0 Then 
            Err.Raise l
            Exit for
        end if
    Next i  
End Sub
Как при линковке, так и при удалении, - вы просто передаёте нужный массив как аргумент процедуре

Добавлено через 8 минут
ankan, - смотрите код будет примерно таким:
Visual Basic
1
2
3
4
    Dim arrTables01() As Variant
'Массив табличек:
    arrTables01 = Array("tbl01", "tbl02", "tbl03", "tbl04", "tbl05", "tbl06") ' и т.д. ...
    Link_Tables arrTables01 'Подлинковка по массиву в аргументе
аналогично с arrTables02 ... arrTables99
2
46 / 31 / 1
Регистрация: 28.09.2012
Сообщений: 991
26.06.2017, 13:41  [ТС]
Eugene-LS, правильно ли я понял, что если у меня Кнопка "Извещения" запускает линковку массива arrTables01, и кнопка "Извещения" находится в общей сложности с различными именами 50 раз в проекте, то я должен 50 раз написать на событие "нажатие кнопки" код
Visual Basic
1
2
3
4
Dim arrTables01() As Variant
'Массив табличек:
    arrTables01 = Array("tbl01", "tbl02", "tbl03", "tbl04", "tbl05", "tbl06") ' и т.д. ...
    Link_Tables arrTables01 'Подлинковка по массиву в аргументе
А если в списке таблиц массива arrTables01 произойдут какие -то изменения, то я 50 раз должен буду вносить корректировки
??
0
Эксперт MS Access
 Аватар для Eugene-LS
13272 / 5949 / 1529
Регистрация: 05.10.2016
Сообщений: 16,653
26.06.2017, 13:49
ankan, а позвольте спросить, зачем вы линкуете MySQL таблички?
И что вы будете делать когда между вами и хостером "искорка проскочит" и связь с сервером будет разорвана?
(Это волне жизненная ситуёвина)
Не проще ли на голом ADO работать и перепроверять состояние соединения перед каждым обращением к серверу. Так и быстрее работать с данными и надёжнее.

Ну это моё мнение.

Добавлено через 5 минут
Цитата Сообщение от ankan Посмотреть сообщение
А если в списке таблиц массива arrTables01 произойдут какие -то изменения, то я 50 раз должен буду вносить корректировки
??
Это значит что у вас что то не так с приложением, обычно линковка проводится один раз за сессию работы пользователя.

Ещё один ЖИРНЫЙ плюс в сторону ADO - там линковка не нужна совсем.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.06.2017, 13:49

Как происходит авторизация при установлении связи с сайтом?
Мне ранее не доводилось делать авторизацию на сайте - может быть, по этой причине и непонимание. А суть дела такова. Протокол...

Регулярка по двум буквам подряд, но не трем или более
Не могу создать регулярку которая найдет только двойные буквы wworld - 1 worrld - 1 worldd - 1 wwworld - 0 worrrld - 0 ...

Поиск по определенному или двум и более параметрам в List.Find
Есть структура public struct Note { //из списка группы public string firstName; //имя public...

OLE BD или ODBC для MS Access?
Что лучше использоваться для подключения к базе access?

Написать код для решение по двум формулам


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru