|
Связь таблиц MSSQL с базой Access без использования "диспетчера связанных таблиц"
|
|||
---|---|---|---|
#18+
Доброго дня. Начну из далека. Есть проект accecc, которой я переделываю из *.adp под современный *.accdb. Формы, код, все уже перенес и адаптировал, таблицы с sql привязал через диспетчер связанных таблиц. Однако, есть такая практика, доработки программы отлаживать на тестовой базе sql, и для смены сервера приходится перелинковывать около сотни таблиц через диспетчер связанных таблиц. Из этого следует три проблемы: 1. Надо сделать минимум 100 кликов мышкой в процессе перелинковки (не проблема, но парит) 2. Вторая, вытекающая из первой, среди таблиц встречаются представления, которым требуется принудительно указать первичный ключ. И есть момент когда можно указать "не верный" ключ, просто по запарке (я даже представления не представлю на что это может повлиять) 3. В процессе перелинковки access сбрасывает значения первичных ключей для представлений. Тут я поясню для чего первичный. Львиная доля форм в качестве источника записей используют эти представления и сам access выдает Run-time error '3326': Объект Recordset не является обновляемым, попросту не получается править значения. А вот если назначить первичный ключ, то правки проходят. Перелинковать можно в ручном режиме и кодом vba поправив таблицу MSysObjects, по при этом первичные ключи "слетают". Перелинковываю таким образом Public Sub RefreshTablesLinks2 Dim tdf, cDB, strODBC Dim i As Integer Set cDB = CurrentDb Set tdf = cDB.TableDefs strODBC = "DSN=DSNname;Description=DSNname;Trusted_Connection=Yes;APP=Microsoft Office;DATABASE=testdb;" On Error GoTo Err_handler For i = 0 To tdf.Count - 1 If tdf(i).Connect <> "" Then tdf(i).Connect = strODBC tdf(i).RefreshLink End If Next Err_handler: 'MsgBox Err.Description Resume Next End Sub Собственно вопрос, есть ли способ командовать процессом линковки через vba, как диспетчер связанных таблиц, что бы можно было гибко управлять процессом и вообще достигнуть полной автоматизации? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2019, 12:25 |
|
Связь таблиц MSSQL с базой Access без использования "диспетчера связанных таблиц"
|
|||
---|---|---|---|
#18+
yoichi730, Ну во первых в диспетчере есть кнопка Выбрать все. Во вторых я лично рефрешлинк никогда не пользовал. Создай таблицу со всеме нужными тебе таблицами и таблицу с возможными серверами или базами. Отцепай сначала все в цикле, а затем снова прицыпай. Так ты избавишься от случая, что какая-то таблица сама собой отцепится, как ты ее тогда через рефреш востановишь. Пока проблем таким образом нисключами ни со связями не было. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2019, 13:39 |
|
Связь таблиц MSSQL с базой Access без использования "диспетчера связанных таблиц"
|
|||
---|---|---|---|
#18+
AlexDE Ну во первых в диспетчере есть кнопка Выбрать все. Видел, удобно). Не избавляет тот мазахизма тыкать по клавише "ОК" 100 с плюсом раз. И я же говорю от таких манипуляций у прилинкованных представлений "слетает" первичный ключ, и access переспрашивает где он есть в нем. А спрашивает как минимум потому, что у представления в принципе нету понятия "первичный ключ". И далее, после линкования не удается создать первичный ключ через конструктор таблицы, просто не сохраняет изменения. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2019, 14:01 |
|
Связь таблиц MSSQL с базой Access без использования "диспетчера связанных таблиц"
|
|||
---|---|---|---|
#18+
Объявляю благодарность товарищу AlexDE с занесением в личное дело за наводку на мысль с хранением имен таблиц с ключами в отдельной таблице. Прочтение статьи https://www.wiseowl.co.uk/blog/s285/linkviewsvba.htm натолкнуло на некий алгоритм действий. Хоть мне и не нравится использование DAO, но думаю заработает. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2019, 14:49 |
|
Связь таблиц MSSQL с базой Access без использования "диспетчера связанных таблиц"
|
|||
---|---|---|---|
#18+
yoichi730... Перелинковать можно в ручном режиме и кодом vba поправив таблицу MSysObjects, по при этом первичные ключи "слетают". Перелинковываю таким образом Public Sub RefreshTablesLinks2 Dim tdf, cDB, strODBC Dim i As Integer Set cDB = CurrentDb Set tdf = cDB.TableDefs strODBC = "DSN=DSNname;Description=DSNname;Trusted_Connection=Yes;APP=Microsoft Office;DATABASE=testdb;" On Error GoTo Err_handler For i = 0 To tdf.Count - 1 If tdf(i).Connect <> "" Then tdf(i).Connect = strODBC tdf(i).RefreshLink End If Next Err_handler: 'MsgBox Err.Description Resume Next End Sub Собственно вопрос, есть ли способ командовать процессом линковки через vba, как диспетчер связанных таблиц, что бы можно было гибко управлять процессом и вообще достигнуть полной автоматизации? Можно и такой вариант использовать. В строке подключения уберите "DATABASE=testdb", а в самом DSN (у Вас "DSNName" написано) указываете БД по умолчанию как "testdb". А когда надо переадресовать на другую базу, заходите DSN и указываете название боевой базы. И тогда ничего не надо перелинковать вообще, достаточно просто перезапусить Access и всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2019, 07:32 |
|
Связь таблиц MSSQL с базой Access без использования "диспетчера связанных таблиц"
|
|||
---|---|---|---|
#18+
Тут даже не так). Прямого взаимодействия с MSysObject не идет, эта таблица меняется системой в следствии манипуляций. DSN это файл, хранимый локально, у каждого пользователя базой его может и не быть. В идеале к нему лучше и не ссылаться, т.к. следить за этим файлом нету возможности. Подозреваю что это можно контролировать через политики, но лучше без него. Передумал алгоритм линковки тиблиц: 1.Создал локальную таблицу TableNames, где перечисляются все необходимые таблицы. Для необходимых представлений еще и запись присутствует указанием имени поля с "первичным ключем". 2.При перелинковки удаляю все-все залинкованные ранее таблицы, и по таблице TableNames линкую все таблицы по новой, меня только строку подкючения на необходимую. 2.5. Если есть указатель на первичный ключ для таблицы (а точнее для представления), то указываю его по полю, указанному в таблице TableNames 3.Профит. Код: vbnet 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.
строка strConnectionString определена заранее в константах, и соответственно меняя эту строку при перелинковке я "меня" сервер с ресурсами. Есть идея как отказаться от локальной таблицы. Если найду возможность считывать информацию прямо с сервера о всех объектах на сервере SQL, то пол дела уже сделано! Ну, на манер той же локальной системной таблицы MSysObject, где уже все указано что надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2019, 13:32 |
|
Связь таблиц MSSQL с базой Access без использования "диспетчера связанных таблиц"
|
|||
---|---|---|---|
#18+
yoichi730Есть идея как отказаться от локальной таблицы. Если найду возможность считывать информацию прямо с сервера о всех объектах на сервере SQL, то пол дела уже сделано! Ну, на манер той же локальной системной таблицы MSysObject, где уже все указано что надо. Так ? Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2019, 13:40 |
|
Связь таблиц MSSQL с базой Access без использования "диспетчера связанных таблиц"
|
|||
---|---|---|---|
#18+
4d_monster, вот так реализовал Код: vbnet 1.
Может и по ваше получится, но мне моего варианта хватает. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2019, 13:07 |
|
Связь таблиц MSSQL с базой Access без использования "диспетчера связанных таблиц"
|
|||
---|---|---|---|
#18+
Без уточнения Код: vbnet 1.
дополнительно пролетает таблица "dtproperties", и делаю вывод что ДА!Лучше уточнить выборку) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2019, 13:17 |
|
Связь таблиц MSSQL с базой Access без использования "диспетчера связанных таблиц"
|
|||
---|---|---|---|
#18+
yoichi730, Это конечно тоже вариант, но только если тебе все таблицы нужны, у меня база от стороннего проставщика с тысячами таблиц, а моя база просто надстройка которая не достающий функционал дополняет, так за чем мне тысячу таблиц перелинковывать, тут без локальной таблицы не обойтись, да и константы ты похоже в ручную переписываешь, у меня при старте окошко открывается где можно выбрать имя пользователя, пароль и базу. и соответственно, обычным работникам линкуется, то что надо, а разработчику возможность прыгать по базам и полный доступ. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2019, 15:30 |
|
Связь таблиц MSSQL с базой Access без использования "диспетчера связанных таблиц"
|
|||
---|---|---|---|
#18+
Не спорю, мне тоже не нравится что все - все подряд подвязывается, но локальную таблицу иметь мне запретили и придумать какой-то алгоритм для выборки только необходимого нету возможности (не хватает мозга), ну просто нету такого однозначного признака. Када таблиц овер 1000 с хвостиком, да и еще надо сортировать "по допуску", то да - локальная таблица это выход ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2019, 15:54 |
|
Связь таблиц MSSQL с базой Access без использования "диспетчера связанных таблиц"
|
|||
---|---|---|---|
#18+
yoichi730, Ну так загони их в тхт или csv файл, или в ексел табличку и читай от туда, я так понял таблиц не много, так что тормозов не будет, странно что разработчику одну системную таблицу создать не дают. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2019, 17:11 |
|
Связь таблиц MSSQL с базой Access без использования "диспетчера связанных таблиц"
|
|||
---|---|---|---|
#18+
AlexDE и все-все-все Попробую объяснить суть работы пользователей базы. С базой завязано две программы на access, данные таблиц теснено-плотненько так переплетены. Далее пойдет "на пальцах"...Если примерно, то каждая программа подгружает и изменяет до 70-90% данных из общей для них базы SQL. Если сложить оба множество используемых данных этих программ, то общих данных будет 50-60% от всех данных базы. И делить таблицы на "эти для этой", а "эти для другой" в принципе нет смысла. Хранить эти дела в отдельной таблице тоже смысла на самом то деле нету, ибо придется следить за этими записями, поддерживать, корректировать. Проекты до меня тут были на базе access2003 (adp) и после переноса их на mdb суть работы то в общем не поменяется. Как подгружалось все подряд, так и будет. А что касается, рекьюрностей, то права пользователей никто не отменял, вносить правки и читать позволено только тем кому это позволено. Вот такая у нас организация) И,кстати сказать, хранить локальную базу мне начальник запретил. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2019, 08:15 |
|
Связь таблиц MSSQL с базой Access без использования "диспетчера связанных таблиц"
|
|||
---|---|---|---|
#18+
yoichi730И,кстати сказать, хранить локальную базу мне начальник запретил. На фиг локальную - неужто с сервера считать трудно, например: SELECT * FROM INFORMATION_SCHEMA.TABLES SELECT * FROM INFORMATION_SCHEMA.VIEWS или SELECT * FROM sys.tables SELECT * FROM sys.views И своя функция, которая проверяет действующие линковки и изменяет их при необходимости... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2019, 13:00 |
|
Связь таблиц MSSQL с базой Access без использования "диспетчера связанных таблиц"
|
|||
---|---|---|---|
#18+
Набросал простенький примерчик, перелинковывающий при необходимости все таблицы SQL-сервера к MDB-шке. Как получить свою строку коннекта и добавить вьюшки - это уж сами - оно совсем не сложно... Код: sql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2019, 15:09 |
|
Связь таблиц MSSQL с базой Access без использования "диспетчера связанных таблиц"
|
|||
---|---|---|---|
#18+
Вверху ошибка - правильный вариант моего варианта строки подключения: Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2019, 15:13 |
|
|
start [/forum/topic.php?fid=45&msg=39762398&tid=1610876]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 315ms |
total: | 467ms |
0 / 0 |