Visual Basic - Obtener la estructura de una base de datos

Life is soft - evento anual de software empresarial
 
Vista:

Obtener la estructura de una base de datos

Publicado por Alvaro Mouat V. (2 intervenciones) el 15/02/2002 17:52:30
Hola.
Necesito encontrar la forma de, a través de una conexión ODBC a una base de datos (cualquiera), obtener la cantidad de tablas de esta, la cantidad de columnas de cada tabla, los tipos de datos de cada columna, y, lo más importante, si la columna es o no un campo clave.
En Visual Basic, con el objeto DataBase de DAO esto es fácil de lograr si se trata de una base de datos access, pero esto cambia si la base de datos (de cualquier tipo, incluso access) es llamada a través de su DSN de sistema.
Con un poco de paciencia fui capaz de obtener lo anterior utilizando RDO, pero no puedo saber si un campo es clave o no.
El código para esto fue el suguiente:

Dim rdoEnv As rdoEnvironment
Dim rdoCon As rdoConnection
Dim rdoTab As rdoTable
Dim rdoCol As rdoColumn

Dim i As Integer, j As Integer, Str As String, EsClave As Boolean

rdoEngine.rdoDefaultCursorDriver = rdUseClientBatch
rdoEngine.rdoLocaleID = rdLocaleSpanish
Set rdoEnv = rdoEngine.rdoCreateEnvironment("BaseDeDatos", "Admin", "")
Set rdoCon = rdoEnv.OpenConnection("BaseDeDatos ", , False, "", "")

For i = 0 To rdoCon.rdoTables.Count - 1
Set rdoTab = rdoCon.rdoTables(i)
Str = Str & rdoTab.Name & vbCrLf
For j = 0 To rdoCon.rdoTables(i).rdoColumns.Count - 1
Set rdoCol = rdoTab.rdoColumns(j)
EsClave = rdoCol.KeyColumn
Str = Str & " - " & rdoCol.Name & "; " & vbTab _
& "Atributo: " & rdoCol.Attributes & "; " & vbTab _
& "Tamaño: %
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Obtener la estructura de una base de datos

Publicado por bla (230 intervenciones) el 19/02/2002 18:20:34
Revísate el método OpenSchema del objeto Connection de ADO (ActiveX Data Objects). El siguiente ejemplo te devuelve el nombre de los campos que forman parte de la clave primaria y su orden. Si en lugar de utilizar adSchemaPrimaryKeys usas adSchemaColumns recuperarás las definiciones de los campos (consulta la ayuda de vb)
Obs: Para que funcione necesitas referenciar la biblioteca "Microsoft ActiveX Data Objects" y modificar la cadena de conexión convenientemente.
Public Sub MostrarClaves(rstrTabla As String)
Dim lCon As New ADODB.Connection
Dim lRst As New ADODB.Recordset
Dim i As Integer
Dim lStr As String
lCon.Open "Provider=***;Data Source=***;User ID=***;Password=***;Data Source=***;"
Set lRst = lCon.OpenSchema(adSchemaPrimaryKeys, Array(Empty, Empty, rstrTabla))
If Not lRst.EOF Then
lStr = ""
For i = 0 To lRst.Fields.Count - 1
lStr = lStr & ", " & lRst.Fields(i).Name
Next
'Debug.Print Mid(lStr, 3)
Do While Not lRst.EOF
lStr = ""
For i = 0 To lRst.Fields.Count - 1
lStr = lStr & ", " & lRst.Fields(i).Value
Next
Debug.Print lRst!column_name & " " & lRst!ordinal
lRst.MoveNext
Loop
End If
lRst.Close: Set lRst = Nothing: lCon.Close: Set lCon = Nothing
End Sub
Cópialo en un módulo, y desde la pantalla de inmediato prueba MostrarClaves "NombreTabla"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Sigo con problemas !!!

Publicado por Alvaro Mouat (2 intervenciones) el 22/02/2002 20:32:37
Lo estoy intentando pero sigo con problemas ...
Cuando quiero objener los Indeces de una tabla o los campos claves el sistema retorna el siguiente errror: "el objeto o proveedor no puede ejecutar la operación requerida".
No supe como armar el string de conexión, asi que puse uno con el formato de ODBC.
La base de datos asociada al DSN de Sistema es Access, ¿Será este el problema?
El código utilizado es el siguiente:

Private Sub Cmd_Click()
Dim tReg As ADODB.Recordset, _
fReg As ADODB.Recordset, _
kReg As ADODB.Recordset
Dim i As Integer, j As Integer
Cmd.Enabled = False
Me.MousePointer = vbHourglass
Set tReg = Con.OpenSchema(adSchemaTables)
While Not tReg.EOF
If tReg.Fields("TABLE_TYPE") <> "SYSTEM TABLE" Then
For i = 0 To tReg.Fields.Count - 1
TxtInfo.Text = TxtInfo.Text & tReg.Fields(i).Name & " - " _
& tReg.Fields(i).Value & vbCrLf
Next i
Set fReg = Con.OpenSchema(adSchemaColumns, _
Array(Empty, Empty, _
tReg.Fields("TABLE_NAME").Value, Empty))
While Not fReg.EOF
For j = 0 To fReg.Fields.Count - 1
TxtInfo.Text = TxtInfo.Text & vbTab & _
fReg.Fields(j).Name & ": " & _
fReg.Fields(j).Value & vbCrLf
Next j
TxtInfo.Text = TxtInf
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar