Acerca de:

Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)

viernes, 11 de marzo de 2011

Obtener los nombres de las tablas y los nombres de sus esquemas de una BD en SQLServer desde VB6

Un día intentaba conectarme a AdventureWorks sample BD desde una app en Visual Basic 6.

Declaraba un recordset como sigue:

db.Open miConnectionString 'db es un objeto tipo Connection
Set rs = db.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "TABLE"))
para poder listar todas sus tablas, usando un bucle.
Mi problema era que al ejecutar un query en SQL:

Dim s as String

Do Until rs.EOF
s="Select * from " & rs!Table_Name
' Hacer muchas muchas cosas con la variable "s"
rs.MoveNext
Loop

Me botaba error, ya que sólo tenía el nombre de la tabla. Para que funcionara, el query dentro de la variable "s" necessitaba también el nombre del esquema (Schema Name) y contruirlo todo de la siguiente forma:
Select * from Schema_Name.Tabla

Luego de mucho rebuscar en Google, hallé esta web
http://www.techrepublic.com/article/much-ado-about-field-properties/1045310

Donde explican lo que hace OpenSchema. Para mi caso, utilizo el SchemaID "AdSchemaTables", el cual incluye un filtro llamado "TABLE_SCHEMA".

Finalmente mi query queda:
Dim s as String

Do Until rs.EOF
s="Select * from " & rs!Table_Schema & "." & rs!Table_Name
' Hacer muchas muchas cosas con la variable "s" 
rs.MoveNext
Loop

Update!
Cómo saber si una tabla tiene un nombre de esquema asignado:
Basta añadir este código en el bucle ("miTabla" es una variable tipo String):

miTabla = vbNullString
miTabla = rs!TABLE_SCHEMA
    
If miTabla <> vbNullString Then
      miTabla = rs!TABLE_SCHEMA & "." & rs!TABLE_NAME
Else
      miTabla = rs!TABLE_NAME
End If 

4 comentarios:

Anónimo dijo...

Cariño, te sugiero LINQ para todas tus necesidades SQL.

Saludos desde Cali, Colombia.

-DT

Broken_Window dijo...

Hola!

El problema es que Ling es sólo para .Net, y también estoy desarrollando en el viejo, vieeejo, VB6

Saludozz!

Anónimo dijo...

Wow, VB6 es nocivo para la salud bonita.

Broken_Window dijo...

Poz sí....

Es un lenguaje que, si no pones Option Explicit y como es CaSe iNseNsItiVe, te acostumbra a "malas prácticas" de programación.

Por ello siempre recurro al C# salvador, con sus lambdas, sus punteros unsafe y su intolerancia a una mayúscula mal puesta o a una variable no declarada...

Y cuando se enoja, cómo avienta excepciones el muy miserable...