Listar Tablas SQL SERVER en VB5.0

juanoyuela
23 de Julio del 2004
Hola, alquien sabe como listar las tablas que tenga una base de datos en SQL SERVER desde codigo VB 5.0?
Gracias.

semperfimxl
23 de Julio del 2004
Para que puedas probar el siguiente codigo necesitas poner en una forma nueva:
3 comboboxes (comboGroups, comboServers, comboDatabases)
2 listboxes (listTables, listFields)
1 command button (Command1)
y las etiquetas apropiadas para cada uno de los objetos (para identificarlos visualmente al correr el proyecto)...

Necesitas ademas marcar en Referencias en tu proyecto el "Microsfot SQLDMO Object Library"

Tambien necesitas cambiar los valores de las variables cUser y cPasword que se asignan en el Form_Load()


'+++++++++++++++++++++

Dim oApp As New SQLDMO.Application
Dim oServerGroup As SQLDMO.ServerGroup
Dim oRegServer As SQLDMO.RegisteredServer
Dim oServer As SQLDMO.SQLServer
Dim oDatabase As SQLDMO.Database
Dim oTable As SQLDMO.Table
Dim oField As SQLDMO.Column
Dim nCount As Integer
Dim cUser As String
Dim cPassword As String


Private Sub comboDatabases_Click()
If oServer Is Nothing Then
Exit Sub
End If

Me.listTables.Clear

Set oDatabase = oServer.Databases(Me.comboDatabases.List(Me.comboDatabases.ListIndex))
For Each oTable In oDatabase.Tables
Me.listTables.AddItem oTable.Name
Next

If Me.listTables.ListCount > 0 Then
Me.listTables.ListIndex = 0
End If

End Sub

Private Sub comboGroups_Click()
ServerDisconnect
Me.comboServers.Clear
Set oServerGroup = oApp.ServerGroups(Me.comboGroups.List(Me.comboGroups.ListIndex))

For Each oRegServer In oServerGroup.RegisteredServers
Me.comboServers.AddItem oRegServer.Name
Next

If Me.comboServers.ListCount > 0 Then
Me.comboServers.ListIndex = 0
End If

End Sub

Private Sub comboServers_Click()

ServerDisconnect
Me.comboDatabases.Clear

Set oServer = New SQLServer

With oServer
.LoginSecure = False
.AutoReConnect = False
.Connect Me.comboServers.List(Me.comboServers.ListIndex), cUser, cPassword
End With

For Each oDatabase In oServer.Databases
Me.comboDatabases.AddItem oDatabase.Name
Next

If Me.comboDatabases.ListCount > 0 Then
Me.comboDatabases.ListIndex = 0
End If


End Sub

Private Sub Command1_Click()
ServerDisconnect
Unload Me
End Sub

Private Sub Form_Load()

ServerDisconnect

cUser = "sa"
cPassword = "admin"

Me.Show
Me.Refresh

Me.comboDatabases.Clear
Me.comboGroups.Clear
Me.comboServers.Clear
Me.listFields.Clear
Me.listTables.Clear

For Each oServerGroup In oApp.ServerGroups
Me.comboGroups.AddItem oServerGroup.Name
Next

If Me.comboGroups.ListCount > 0 Then
Me.comboGroups.ListIndex = 0
End If

End Sub

Private Sub ServerDisconnect()
If Not oServer Is Nothing Then
oServer.DisConnect
Set oServer = Nothing
End If
End Sub

Private Sub listTables_Click()
If oServer Is Nothing Then
Exit Sub
End If

Me.listFields.Clear

Set oTable = oDatabase.Tables(Me.listTables.List(Me.listTables.ListIndex))

For Each oField In oTable.Columns
Me.listFields.AddItem oField.Name
Next

If Me.listFields.ListCount > 0 Then
Me.listFields.ListIndex = 0
End If
End Sub
'+++++++++++++++++++

juanoyuela
23 de Julio del 2004
Gracias por el codigo, funciono perfecto pero tengo una pregunta, este codigo solamente funciona en una maquina que tenga instalado SQL SERVER??

semperfimxl
23 de Julio del 2004
Para el segundo ejemplo no es necesario que el equipo donde pruebas tenga instalado el SQL SERVER ...

Solo asegurarse de que los valores para conexion (Data Source, Initial Catalog, User Id y Password) esten correctos... (Lo acabo de probar en un equipo que no tiene instalado SQL Server, pero si esta correctamente configurado para accesar a la red)...

Incluso lo puedes hacer a traves de un DSN previamente generado en el Control Panel...
En lugar de especificar cada propiedad por separado como te puse en el ejemplo, simplemente usas la propiedad .ConnectionString del objecto Connection...

With oConn
.ConnectionString = "DSN=Server_Name;DATABASE=BaseDeDatosInicial;UID=Usuario;PWD=Password"
.Open
End With

...................

En cuanto al primer ejemplo, dado que utiliza el SQLDMO library, en este caso si se requiere tener instalado el SQL SERVER (Servidor o Cliente)...

semperfimxl
23 de Julio del 2004
Perdon... El string debe ser asi...

"DSN=DSN_Name;DATABASE=BaseDeDatosInicial;UID=Usuario;PWD=Password"

(No confundir el DSN=xxx con el nombre del SQLSERVER...)

semperfimxl
23 de Julio del 2004
Otro ejemplo utilizando ADODB con conexion directa al SQL Server (sin utilizar DSNs) y un recordset ADO ...

Necesitas poner en tu Form:
1 command button (Command1)
1 listbox (list1)

y marcar en Referencias en el proyecto el "Microsoft ActiveX Data Objects" ... Version 2.7 en mi caso...

Por supuesto tienes que cambiar en el Form_Load() los valores para el DataSource, Initial Catalog, User ID y Password por los tuyos propios...

'++++++++++++++
Dim cString As String
Dim oConn As Connection
Dim oRSet As Recordset

Private Sub Command1_Click()
cString = "SELECT * FROM sysobjects WHERE xtype = 'U'"

Set oRSet = New Recordset
oRSet.Open cString, oConn, adOpenDynamic, adLockOptimistic

If Not oRSet.EOF Then
oRSet.MoveFirst
Do While Not oRSet.EOF
List1.AddItem oRSet.Fields("Name")
oRSet.MoveNext
Loop
End If

oRSet.Close
Set oRSet = Nothing

End Sub

Private Sub Form_Load()

Set oConn = New Connection

With oConn
.Provider = "sqloledb"
.Properties("Data Source").Value = "Nombre Del SQL Server"
.Properties("Initial Catalog").Value = "BaseDeDatosEnElSQLServer"
.Properties("User ID").Value = "NombreUsuario"
.Properties("Password").Value = "PasswordUsuario"
.Open
End With


List1.Clear
End Sub

Private Sub Form_Unload(Cancel As Integer)
oConn.Close
Set oConn = Nothing
End Sub

'+++++++++++++++