recuperar DSN System (ODBC)
Publicado por Guillermo (72 intervenciones) el 07/12/2006 15:05:39
Este es el codigo en Visual Basic que hace lo que yo quiero hacer con Power Builder (mostrar la lista de conexiones DSN conectados a una PC), me gustaria saber si alguien de Uds. sabe como recuperar en Power Builder el Manipulador de entorno que en Visual Basic es henv .
Muchas gracias y Saludos,
Option Explicit
' Tipo de enumeración para los DSN
Private Enum EnumDSNTypes
DSN_User = 31 ' Para los DSN de usuario
DSN_System = 32 ' Para los DSN de sistema
End Enum
Private Declare Function SQLAllocEnv Lib "ODBC32.DLL" (ByRef phenv As Long) As Long
Private Declare Function SQLDataSources Lib "ODBC32.DLL" ( _
ByVal hEnv As Long, _
ByVal fDirection As Integer, _
ByVal szDSN As String, _
ByVal cbDSNMax As Integer, _
ByRef pcbDSN As Integer, _
ByVal szDescription As String, _
ByVal cbDescriptionMax As Integer, _
ByRef pcbDescription As Integer) As Long
Private Declare Function SQLFreeEnv Lib "ODBC32.DLL" (ByVal hEnv As Long) As Long
Private Sub Form_Load()
' Declaración de variables
Dim colDSN As Collection
Dim vItemDSN As Variant
' Creamos un nuevo objeto Collection para
' mostrar los DSN de sistema
Set colDSN = EnumDSN()
' Rellenamos la lista con los datos
' incluidos en la colección
If Not colDSN Is Nothing Then
For Each vItemDSN In colDSN
List1.AddItem vItemDSN
Next
End If
' Creamos de nuevo el objeto Collection para
' mostrar ahora los DSN de usuario
Set colDSN = EnumDSN(DSN_User)
' Rellenamos la lista con los datos
' incluidos en la colección
If Not colDSN Is Nothing Then
For Each vItemDSN In colDSN
List1.AddItem vItemDSN
Next
End If
' Liberamos la referencia al objeto Collection
Set colDSN = Nothing
End Sub
' La función devolverá una colección con los orígenes de datos
' con nombre (DSN) solicitados. Por defecto, leerá los DSN
' de sistema.
'
Private Function EnumDSN(Optional TypeDSN As EnumDSNTypes = DSN_System) As Collection
' Declaración de variables
Dim dl As Long ' Valor devuelto por la función API
Dim hEnv As Long ' Manipulador de entorno
Dim sDsnName As String ' El nombre del DSN
Dim iLenDsnName As Integer ' Longitud en caracteres del buffer del nombre
Dim sDescDriver As String ' Descripción del driver
Dim iLenDescDriver As Integer ' Longitud en caracteres del buffer de la descripción
Dim bContinue As Boolean ' True = Continúa la búsqueda de DSN
Dim oColDSN As Collection ' Objeto Collection
Const SQL_FETCH_NEXT As Long = 1 ' Indica que deberá leer el siguiente DSN
' Creamos un nuevo objeto Collection
Set oColDSN = New Collection
' Obtenemos un manipulador de entorno
SQLAllocEnv hEnv
' El bucle se ejecutará hasta que el valor devuelto por
' la función API sea distinto de cero.
Do
' Inicializamos las cadenas con una
' longitud adecuada
sDsnName = Space(1024)
sDescDriver = Space(1024)
' Si no es la primera vez que se ejecuta la rutina,
' obtenemos el siguiente DSN
If bContinue Then
dl = SQLDataSources(hEnv, SQL_FETCH_NEXT, sDsnName, _
1024, iLenDsnName, sDescDriver, 1024, iLenDescDriver)
Else
' Sólo se ejecutará la primera vez que llamemos
' a la función API, para obtener el primer DSN
dl = SQLDataSources(hEnv, TypeDSN, sDsnName, 1024, _
iLenDsnName, sDescDriver, 1024, iLenDescDriver)
' Indicamos que se desea continuar
' la búsqueda de DSN
bContinue = True
End If
' Si no ha habido error, añadimos el DSN a la colección
If dl = 0 Then
oColDSN.Add Mid(sDsnName, 1, iLenDsnName)
End If
Loop While dl = 0
' Liberamos los recursos asociados con el
' manipulador de entorno obtenido
SQLFreeEnv hEnv
' Devolvemos la colección creada
Set EnumDSN = oColDSN
' Liberamos la referencia al objeto
Set oColDSN = Nothing
' Si no ha habido error, añadimos la descripción del driver a la colección
If dl = 0 Then
oColDSN.Add Mid(sDescDriver, 1, iLenDescDriver)
End If
End Function
Muchas gracias y Saludos,
Option Explicit
' Tipo de enumeración para los DSN
Private Enum EnumDSNTypes
DSN_User = 31 ' Para los DSN de usuario
DSN_System = 32 ' Para los DSN de sistema
End Enum
Private Declare Function SQLAllocEnv Lib "ODBC32.DLL" (ByRef phenv As Long) As Long
Private Declare Function SQLDataSources Lib "ODBC32.DLL" ( _
ByVal hEnv As Long, _
ByVal fDirection As Integer, _
ByVal szDSN As String, _
ByVal cbDSNMax As Integer, _
ByRef pcbDSN As Integer, _
ByVal szDescription As String, _
ByVal cbDescriptionMax As Integer, _
ByRef pcbDescription As Integer) As Long
Private Declare Function SQLFreeEnv Lib "ODBC32.DLL" (ByVal hEnv As Long) As Long
Private Sub Form_Load()
' Declaración de variables
Dim colDSN As Collection
Dim vItemDSN As Variant
' Creamos un nuevo objeto Collection para
' mostrar los DSN de sistema
Set colDSN = EnumDSN()
' Rellenamos la lista con los datos
' incluidos en la colección
If Not colDSN Is Nothing Then
For Each vItemDSN In colDSN
List1.AddItem vItemDSN
Next
End If
' Creamos de nuevo el objeto Collection para
' mostrar ahora los DSN de usuario
Set colDSN = EnumDSN(DSN_User)
' Rellenamos la lista con los datos
' incluidos en la colección
If Not colDSN Is Nothing Then
For Each vItemDSN In colDSN
List1.AddItem vItemDSN
Next
End If
' Liberamos la referencia al objeto Collection
Set colDSN = Nothing
End Sub
' La función devolverá una colección con los orígenes de datos
' con nombre (DSN) solicitados. Por defecto, leerá los DSN
' de sistema.
'
Private Function EnumDSN(Optional TypeDSN As EnumDSNTypes = DSN_System) As Collection
' Declaración de variables
Dim dl As Long ' Valor devuelto por la función API
Dim hEnv As Long ' Manipulador de entorno
Dim sDsnName As String ' El nombre del DSN
Dim iLenDsnName As Integer ' Longitud en caracteres del buffer del nombre
Dim sDescDriver As String ' Descripción del driver
Dim iLenDescDriver As Integer ' Longitud en caracteres del buffer de la descripción
Dim bContinue As Boolean ' True = Continúa la búsqueda de DSN
Dim oColDSN As Collection ' Objeto Collection
Const SQL_FETCH_NEXT As Long = 1 ' Indica que deberá leer el siguiente DSN
' Creamos un nuevo objeto Collection
Set oColDSN = New Collection
' Obtenemos un manipulador de entorno
SQLAllocEnv hEnv
' El bucle se ejecutará hasta que el valor devuelto por
' la función API sea distinto de cero.
Do
' Inicializamos las cadenas con una
' longitud adecuada
sDsnName = Space(1024)
sDescDriver = Space(1024)
' Si no es la primera vez que se ejecuta la rutina,
' obtenemos el siguiente DSN
If bContinue Then
dl = SQLDataSources(hEnv, SQL_FETCH_NEXT, sDsnName, _
1024, iLenDsnName, sDescDriver, 1024, iLenDescDriver)
Else
' Sólo se ejecutará la primera vez que llamemos
' a la función API, para obtener el primer DSN
dl = SQLDataSources(hEnv, TypeDSN, sDsnName, 1024, _
iLenDsnName, sDescDriver, 1024, iLenDescDriver)
' Indicamos que se desea continuar
' la búsqueda de DSN
bContinue = True
End If
' Si no ha habido error, añadimos el DSN a la colección
If dl = 0 Then
oColDSN.Add Mid(sDsnName, 1, iLenDsnName)
End If
Loop While dl = 0
' Liberamos los recursos asociados con el
' manipulador de entorno obtenido
SQLFreeEnv hEnv
' Devolvemos la colección creada
Set EnumDSN = oColDSN
' Liberamos la referencia al objeto
Set oColDSN = Nothing
' Si no ha habido error, añadimos la descripción del driver a la colección
If dl = 0 Then
oColDSN.Add Mid(sDescDriver, 1, iLenDescDriver)
End If
End Function
Valora esta pregunta
0