Список DSN

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Список DSN

Сообщение sergey-911 » 26.04.2007 (Чт) 18:15

Доброго времени суток уважаемые.
Подскажите плиз, как програмно получить список DSN соединений?
Прошу прощения за беспокойство.
С уважением, Сергей.

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

Сообщение Konst_One » 27.04.2007 (Пт) 0:17

я уже раз 5 выкладывал пример, найди

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 27.04.2007 (Пт) 2:16

Спасибо Konst_One.
Нашёл http://bbs.vbstreets.ru/viewtopic.php?p=146962#146962, это не совсем то, что мне нужно. Возможно не всё просматрел.
Мне необходимо получить список DSN подключений.
Создавать DSN мне не нужно, т.к. я это уже реализовал.
И еще проблема. Из конкретного DSN мне необходимо получить имя БД (это я сделал) и имя сервера (с этим проблема)
Ничего умнее для этого я не придумал.
Код: Выделить всё

Option Explicit
    'Определение SQL сервера и названия БД
    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
    cn.Open ("PROVIDER=MSDASQL;dsn=???;uid=" & Connect.Log & ";pwd=" & Connect.Pas & ";")
    Dim sql As String   'Имя SQL сервера
    Dim bd As String    'Название БД
    sql = Trim(cn.ConnectionString)
    bd = Trim(cn.DefaultDatabase)
    cn.Close
    Set cn = Nothing
    'Поиск в строке
    i = Len(sql)
    sql = Trim(Right(sql, i - InStr(sql, ";WSID=") - 5))
    sql = Trim(Left(sql, InStr(sql, ";") - 1))

    oSqlServer.Connect sql, Connect.Log, Connect.Pas
    'SQL и БД, полученная из DSN
    Text1(0).Text = sql
    Text1(1).Text = bd
    cn.Close
    Set cn = Nothing

Подютожу. Нужно получить:
1) список DSN
2) имя MS SQL сервера из DSN
2) название БД из DSN
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 03.05.2007 (Чт) 23:50

Konst_One предоставил процедуру, выводящую в комбобокс список всех DSN соединений. Спасибо огромное. :D Может пригодится кому...
Код: Выделить всё

Public Sub GetAllDSNs(ByRef cmb As ComboBox)
    ' Fill a listbox control with the list of all available DSNs
    Dim ODBCTool As New ODBCTool.Dsn
    Dim Dsn() As String, i As Long
   
    If ODBCTool.GetDataSourceList(Dsn()) Then
        ' a True return value means success
        cmb.Clear
        For i = 0 To UBound(Dsn)
            cmb.AddItem Dsn(i)
        Next
    Else
        ' a False value means error
        MsgBox "Unable to read ODBC driver list", vbExclamation
    End If
End Sub
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 03.05.2007 (Чт) 23:51

Попутно ещё одна задача...
Нужно вывести DSN соединения только MS SQL сервера, если это возможно. И главное, по выбранному DSN, определить имя MS SQL сервера и имя БД!
С уважением, Сергей.

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 04.05.2007 (Пт) 12:16

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

Private Declare Function SQLAllocEnv Lib "odbc32.dll" (ByRef hEnv As Long) As Integer
Private Declare Function SQLFreeEnv Lib "odbc32.dll" (ByVal hEnv As Long) As Integer

Private Declare Function SQLDataSources Lib "odbc32.dll" _
                                                (ByVal hEnv As Long, _
                                                ByVal Direction As Integer, _
                                                ByVal DataSourceName As String, _
                                                ByVal BufferLength1 As Integer, _
                                                ByRef NameLength1Ptr As Integer, _
                                                ByVal Description As String, _
                                                ByVal BufferLength2 As Integer, _
                                                ByRef NameLength2Ptr As Integer) As Integer

Private Declare Function SQLSetEnvAttr Lib "odbc32.dll" _
                                                (ByVal hEnv As Long, _
                                                ByVal Attr As Integer, _
                                                ByVal ValuePtr As Long, _
                                                ByVal StringLength As Integer) As Integer
Private Const SQL_SUCCESS = 0
Private Const SQL_ERROR = -1
Private Const SQL_NO_DATA = 100

Private Const SQL_ATTR_ODBC_VERSION As Long = 200
Private Const SQL_OV_ODBC3 = 3
Private Const SQL_IS_INTEGER = -6

Private Const SQL_FETCH_NEXT = 1
Private Const SQL_FETCH_FIRST = 2
Private Const SQL_FETCH_LAST = 3
Private Const SQL_FETCH_PRIOR = 4
Private Const SQL_FETCH_ABSOLUTE = 5
Private Const SQL_FETCH_RELATIVE = 6

Private Const SQL_MAX_DSN_LENGTH = 32
Private Const SQL_MAX_DESC_LENGTH = 128

Private Declare Function SQLSetConfigMode Lib "odbccp32.dll" (ByVal wConfigMode As Integer) As Boolean

Private Declare Function SQLGetPrivateProfileString Lib "odbccp32.dll" _
                                                (ByVal Section As String, _
                                                ByVal Key As String, _
                                                ByVal Default As String, _
                                                ByVal Buffer As String, _
                                                ByVal BufSize As Integer, _
                                                ByVal Init As String) As Long

Private Const ODBC_USER_DSN = 1
Private Const ODBC_SYSTEM_DSN = 2
Private Const ODBC_BOTH_DSN = 0

Sub EnumerateDSN()
    Dim hEnv As Long
    Dim result As Integer
    Dim strDSNBuffer As String
    Dim strDSN As String
    Dim strDescription As String
    Dim NameLength1 As Integer
    Dim NameLength2 As Integer
   
    If SQLAllocEnv(hEnv) = SQL_SUCCESS Then
       
        If SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, SQL_IS_INTEGER) = SQL_SUCCESS Then
           
            strDSNBuffer = Space(SQL_MAX_DSN_LENGTH)
            strDescription = Space(SQL_MAX_DESC_LENGTH)
           
            Do
                result = SQLDataSources(hEnv, SQL_FETCH_NEXT, strDSNBuffer, SQL_MAX_DSN_LENGTH, NameLength1, strDescription, SQL_MAX_DESC_LENGTH, NameLength2)
                If Left(strDescription, NameLength2) = "SQL Server" Then
                    strDSN = Left(strDSNBuffer, NameLength1)
                    Debug.Print "DSN="; strDSN,
                    Debug.Print "Server="; GetSectionFromDSN(strDSN, "Server"),
                    Debug.Print "Database="; GetSectionFromDSN(strDSN, "Database")
                End If
            Loop Until result = SQL_NO_DATA
           
        End If
       
        SQLFreeEnv hEnv
    End If
End Sub

Private Function GetSectionFromDSN(ByVal DSN As String, ByVal Section As String) As String
    Dim strBuffer As String
    Dim BufferSize As Integer
   
    If SQLSetConfigMode(ODBC_BOTH_DSN) Then
        strBuffer = Space(512)
        BufferSize = SQLGetPrivateProfileString(DSN, Section, "", strBuffer, 511, "Odbc.ini")
        GetSectionFromDSN = Left(strBuffer, BufferSize)
    End If
End Function

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 05.05.2007 (Сб) 2:00

Спасибо Gloom.
Но я так и не догнал, как это должно работать. Можно пример...?


Вот пример програмки, работающей с MS SQL сервером через библиотеку SQL DMO. Позволяет пользователю работать с БД (создавать, удалять, сохранять и восстанавливать БД)
Не могу реализовать:
а) Восстановление БД из файла бэкапа в нужное место. Если БД или логфайл располагались физически на несуществующем диске (D:\...), то, следовательно, ошибка...
б) Выводить в комбобокс только DSN, относящиеся к MS SQL серверу.
в) При выборе DSN извлечь имя SQL сервера и имя БД.

Буду очень признателен за помощь...
Вложения
MS_SQL - Forum.rar
Пример работы с MS SQL посредством DMO.
(4.89 Кб) Скачиваний: 51
С уважением, Сергей.


Вернуться в Visual Basic 1–6

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

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

    TopList