miércoles, 17 de noviembre de 2010

Cómo listar las vistas de una base de datos mediante un nombre DSN en VB6

Hice esta pregunta originalmente en StackOverflow. Acá la traducción al español, con una mejor explicación:

Este es el código original:

Dim db as Connection
Dim rs as Recordset
Dim rs1 as Recordset

db.Open "DSN=Oracle 10g; Uid=myUser; Pwd=myPassword;" 'También probé SQLServer2005

'Me conecto con éxito

Set rs = db.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "TABLE"))

' Todo bien aquí. Puedo listar las tablas de la base de datos.

Do Until rs.EOF
      List.AddItem rs!TABLE_NAME
      rs.MoveNext
Loop

Set rs1 = db.OpenSchema(adSchemaViews)  'Esta es la línea que me da problemas

Aunque los motores de las bases de datos tienen habilitadas las opciones de aceptar conexiones remotas y locales, y a pesar de que la autenticación del usuario y el password se realiza con éxito, la línea problemática da el error "El Proveedor no puede ejecutar la operación requerida".
Cuando, en lugar de usar un nombre DSN, utilizo una cadena de conexión, el código funciona perfectamente.

La solución la hallé luego de probar un poco con el VB6. Desde una conexión con un nombre DSN tanto vistas y tablas, son consideradas como tablas. El código que funciona es éste:

Set rs1 = db.OpenSchema(adSchemaTables) 
Do Until rs1.EOF
     If rs1("TABLE_TYPE").Value = "VIEW" Then
           List.AddItem rs1!TABLE_NAME
     End If

     rs1.MoveNext
Loop