AXForum  
Вернуться   AXForum > Блоги > Gustav'ово бложище, или Записки DAX-дилетанта-III
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

Стараюсь писать про Аксапту, хотя частенько тянет в Офис
Рейтинг: 5.00. Голосов: 3.

Приятное управление источниками данных ODBC

Запись от Gustav размещена 19.02.2010 в 14:15
Обновил(-а) Gustav 16.03.2010 в 12:12 (16.03.10 - изменил способ хранения изображений сообщения)
Теги dsn, odbc, vba, windows

ВНИМАНИЕ! Материал ниже - не "узко"-аксаптовский, но "широко"-виндосовский! Поэтому "Добро пожаловать, ВСЕ!"

Приходилось ли вам скрежетать зубами при создании источника данных ODBC через стандартный интерфейс Windows: Старт \ Настройка \ Панель управления \ Администрирование \ Источники данных (ODBC) ? При создании одного источника, наверное, нет. А при создании пяти сразу? А при создании хоть и одного нового, но на десятках пользовательских компьютеров? Что и говорить, удовольствия от такого рутинного занятия не сильно много.



Лет восемь примерно назад мне пришлось решать задачу по прописыванию ODBC-источника на компьютерах свыше полсотни пользователей. Тогда наш IT-отдел, состоящий из 3 человек, каждому из которых было лень оббегать пользователей по кругу и тупо повторять одно и то же десятки раз, совместными усилиями нарыл в Сети пример на VBA по автоматическому созданию источника. Мы подрихтовали код и упаковали его в mdb-файл Access'а как в командный файл, с автозапуском процедуры при открытии этого файла и последующим закрытием после срабатывания. Получившийся "командник" разослали пользователям по почте с просьбой запустить этот файл на своих машинах самостоятельно. Источники красиво создались, а мы, IT-шники, получили глубокое удовлетворение от содеянного.

Воды с тех пор утекло много. Участники того давнего действа теперь работают в других и разных местах. Код, как это часто бывает в таких случаях, даже если и сохранился где-то в архивах, то в них же и безнадежно затерялся и, возможно, лучшим выходом является просто повторное его создание заново. Так и пришлось сделать, когда мне недавно захотелось возродить забытую процедуру и уж на этот раз поместить его в легкодоступное место, коим я и считаю данное сообщение.

После развернутого лирического вступления далее покажу получившийся код (Excel VBA), намекну на возможности получившегося инструментика и приложу Excel-файл с необходимой начинкой, которым каждый из вас сможет при желании самостоятельно воспользоваться. Думаю, что то, что именно Excel является контейнером для решения этой задачи, для моих постоянных читателей не является неожиданностью

Собственно, интерфейс "инструментика" - во всей его непосредственности - можно наблюдать уже на следующем рисунке - фрагменте рабочего листа Excel:



На приведенном рисунке мы видим таблицу с наборами данных о DSN (область между серыми полосами; назовем ее мини-таблица) и небольшую голубую "панель управления" в нижней правой части. Состав колонок таблицы - достаточный для источников, предназначенных для работы с Oracle. При необходимости список колонок легко "расширяется" вправо путем добавления специфических столбцов для других драйверов ODBC. При этом соответствующие несложные изменения надо будет внести и в приведенный ниже код VBA. Само собой, что строки между серыми полосами можно добавлять и удалять, следя за тем, чтобы не было разрывов (пустых ячеек) в колонке "Driver" между строкой заголовков и последней заполненной строкой этой мини-таблицы.

Как всё это работает, думаю, понятно. Выбор опции в группе переключателей "DSN" эквивалентен выбору соответствующей вкладки на первом рисунке - User DSN или System DSN. Выбор во второй группе "Operation" имитирует одну из кнопок первого рисунка. Наконец по нажатию единственной кнопки "Do The Operation" выбранная операция для выбранного типа DSN выполняется в цикле для каждой строки (набора параметров) мини-таблицы.

Информация об успехе или неудаче операции для каждой строки выводится в окно отладки редактора Visual Basic. Вывод о результате делается на основании значения, возвращаемого функцией SQLConfigDataSource (см. в коде). Насколько я понимаю, изначально разработчиками этой функции предполагался возврат либо значения 1 (успех), либо 0 (неудача), что и проверяется в моей процедурке. Однако, в процессе тестирования драйверов для Oracle выяснилось, что для них возвращаются какие-то довольно большие целые числа - и в случае успеха, и в случае неудачи. Поэтому, если такой драйвер имеется в системе, то для него все операции, выполняемые с помощью моей процедуры считаются "успешными". Для таких драйверов убедиться в реальном положении вещей можно с помощью стандартной формы "ODBC Data Source Administrator".

Хотя код процедуры можно посмотреть в прилагаемом Excel-файле, продублирую его здесь - в основном, для гостей форума, не имеющих доступа к вложениям:

Код:
Option Explicit

'--- Excel VBA ---

'Constant Declaration
'User DSN
Private Const ODBC_ADD_DSN = 1          ' Add data source
Private Const ODBC_CONFIG_DSN = 2       ' Configure (edit) data source
Private Const ODBC_REMOVE_DSN = 3       ' Remove data source

'System DSN
Private Const ODBC_ADD_SYS_DSN = 4      ' Add data source
Private Const ODBC_CONFIG_SYS_DSN = 5   ' Configure (edit) data source
Private Const ODBC_REMOVE_SYS_DSN = 6   ' Remove data source

Private Const vbAPINull As Long = 0     ' NULL Pointer

'Function Declare
#If Win32 Then
    Private Declare Function SQLConfigDataSource Lib "ODBCCP32.DLL" _
    (ByVal hwndParent As Long, ByVal fRequest As Long, _
    ByVal lpszDriver As String, ByVal lpszAttributes As String) _
    As Long
#Else
    Private Declare Function SQLConfigDataSource Lib "ODBCINST.DLL" _
    (ByVal hwndParent As Integer, ByVal fRequest As Integer, ByVal _
    lpszDriver As String, ByVal lpszAttributes As String) As Integer
#End If

Sub doSomethingWithDSNs()

    #If Win32 Then
        Dim intRet As Long
    #Else
        Dim intRet As Integer
    #End If
    
    Dim strDriver As String
    Dim strAttributes As String
    Dim rng As Range
    Dim i As Integer
    Dim fRequest As Long
    
    Select Case ThisWorkbook.Worksheets("List_of_DSNs").Range("DSNCell")
        Case 1
            Select Case ThisWorkbook.Worksheets("List_of_DSNs").Range("OperationCell")
                Case 1: fRequest = ODBC_ADD_DSN
                Case 2: fRequest = ODBC_REMOVE_DSN
                Case 3: fRequest = ODBC_CONFIG_DSN
            End Select
        Case 2
            Select Case ThisWorkbook.Worksheets("List_of_DSNs").Range("OperationCell")
                Case 1: fRequest = ODBC_ADD_SYS_DSN
                Case 2: fRequest = ODBC_REMOVE_SYS_DSN
                Case 3: fRequest = ODBC_CONFIG_SYS_DSN
            End Select
    End Select
    
    Set rng = ThisWorkbook.Worksheets("List_of_DSNs").Range("TableUpLeft").CurrentRegion
    
    For i = 2 To rng.Rows.Count
    
        strDriver = rng(i, 1)
        
        'Set the attributes delimited by null.
        'See driver documentation for a complete list of attributes.
        strAttributes = "DSN=" & rng(i, 2) & Chr(0)
        strAttributes = strAttributes & "DESCRIPTION=" & rng(i, 3) & Chr(0)
        strAttributes = strAttributes & "SERVER=" & rng(i, 4) & Chr(0)
        strAttributes = strAttributes & "UID=" & rng(i, 5) & Chr(0)
        strAttributes = strAttributes & "PWD=" & rng(i, 6) & Chr(0)
        
        'To show dialog, use Form1.Hwnd instead of vbAPINull.
        intRet = SQLConfigDataSource(vbAPINull, fRequest, strDriver, strAttributes)
        
        If intRet Then
            Debug.Print i - 1 & " -- Successful operation for " & rng(i, 2) & " with " & rng(i, 1)
        Else
            Debug.Print i - 1 & " -- Failed operation for " & rng(i, 2) & " with " & rng(i, 1)
        End If
        
    Next i
    
    MsgBox "You can see log in Immediate window (Alt+F11, Ctrl+G)", vbInformation, "FINISHED!"
            
End Sub
Несколько слов об открывшихся возможностях, которые нравятся лично мне:
  • Хранение информации о всех DSN в одном месте - табличке Excel, со всеми ее вытекающими прелестями типа дублирования значений копированием и т.п.
    .
  • Можно указать пароли. При помощи стандартного "Администратора" я не помню, чтобы такое было возможно. Обычно, когда это было нужно, я прописывал их напрямую в реестре Windows. А нужно это бывает, например, при открытии присоединенной таблички в Access - если пароль не прописан в реестре, то он раздражающе запрашивается; если же прописан, то легко открывается сразу как родная табличка Access. Плюс, в этом случае пароль совсем не обязательно сообщать конечному пользователю.
    .
  • Возможность автоматически выбрать нужный драйвер из нескольких возможных. В моем конкретном случае для Oracle это хорошо видно. У нас у некоторых пользователей уже установлены новые версии - "Oracle in VER10_HOME", в то время как у многих - еще старые "Oracle in OraHome92". Так вот, при прогоне процедуры ненужный драйвер просто не установится (если в системе имеются оба драйвера, то понятно, что установится первый встретившийся в мини-таблице).
    .
  • Конечно, эстетическая мелочь, но все равно приятно - можно неспешно указать "Description". Обычно это поле впопыхах админской жизни либо не заполняется вообще, либо туда дублируется строка из поля DSN. А уж о такой роскоши, как как-нибудь сесть за чашкой чая и привести в порядок эти описания и говорить не приходится - какой идиот захочет этим заниматься через "Administrator"?! А теперь - выставил всё в мини-табличке, запустил "Configure" - и вот оно, счастье!
В целом, мне кажется, вся рассмотренная выше задачка из серии тех, на которые при всей их простоте сам время найдёшь с трудом (и ведь будешь продолжать скрежетать зубами!), но если кто-то предлагает готовое решение, то почему бы не воспользоваться. В общем, приятного вам юзанья моей скромной тулзы!

"СПИСОК ЛИТЕРАТУРЫ":
  1. http://forum.sources.ru/index.php?sh...2&view=showall
  2. http://support.microsoft.com/kb/171146/EN-US/
  3. http://www.pcreview.co.uk/forums/thread-1632783.php
  4. http://support.microsoft.com/kb/287668
(Ура! Почти на грани, но уложился в разрешенные 10 тыщ символов )
Вложения
Тип файла: xls ComfortODBC.xls (51.0 Кб, 1656 просмотров)
Размещено в Без категории
Просмотров 59884 Комментарии 0
Всего комментариев 0

Комментарии

 


Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 03:52.