jueves, 13 de mayo de 2010

Obtención del Esquema de una Base de Datos

En este post voy a tratar de explicar brevemente como obtener el Esquema de una Base de Datos a través de nuestra conexión.

En primer lugar, necesitamos tener una variable de tipo Connection. Puede ser una SqlConnection, OleDbConnection u otra. En el ejemplo voy a usar una variable del tipo OleDbConnection.

Private conexion As OleDb.OleDbConnection

Por otro lado, vamos a crearnos 2 tablas para mantener las columnas.(Más Adelante voy a explicar su uso).


Private dtColumnas As DataTable
Private dtAux As DataTable


Bueno ahora viene la parte importante:

Consultar las Tablas de la Base de Datos:

Sub Obtener_Listado_Tablas_BD()
Try
If conexion Is Nothing Then conexion = New OleDb.OleDbConnection("ConnectionString")
conexion.Open()

Me.ComboBox1.DataSource = conexion.GetSchema("Tables")
Me.ComboBox1.DisplayMember = "TABLE_NAME"
Me.ComboBox1.ValueMember = "TABLE_NAME"

dtColumnas = conexion.GetSchema("Columns")
Obtener_Listado_Columnas(ComboBox1.SelectedValue)
Catch ex As Exception
Msgbox(ex.Message)
End Try
End Sub

El primer paso es definir la conexion y abrirla.

A continuación llamamamos al método GetSchema de nuestra variable "conexion" indicandole que datos queremos obtener, en nuestro caso Tables.

Vamos a guardar dichos resultados en un ComboBox.

Ahora, pasamos a obtener todas las columnas de las tablas de la BD y lo guardamos en dtColumnas.

Y por último, vamos a

Obtener Listado de Columnas


Sub Obtener_Listado_Columnas(ByVal strNombreTabla As String)
dtAux = dtColumnas.Clone
dtAux.Rows.Clear()
dtColumnas.Select("TABLE_NAME='" & strNombreTabla & "'").ToList().ForEach(Sub(a) dtAux.ImportRow(a))
Me.DataGridView1.DataSource = dtAux
End Sub


Dada una Tabla, indicada por strNombreTabla vamos a filtrar la tabla de columnas llenada anteriormente.

Con una función Lambda (se podría sustituir por un bucle for each tradicional) vamos a almacenar en dtAux los registros coincidentes con nuestro filtro, indicado por .Select("TABLE_NAME='" & strNombreTabla & "'")

Y por último, mostramos el contenido en un DataGridView.

Os dejo el enlace al código en mi SkyDrive.

8 comentarios:

  1. Esquema??? bueno dejemos eso para otras discusiones mas tecnicas ... Hay formas mucho mas rapidas y eficientes como por ejemplo consultar directamente las tablas del sistema y obtener la definicion del objeto

    ResponderEliminar
  2. Hola, no voy a entrar en discusión de lo del esquema.

    Formas más rapidas, si. Que yo sepa este método te da independencia de la Base de Datos y es reutilizable.
    Sin embargo hacer uso de las tablas del Sistema es distinto para cada tabla.

    ResponderEliminar
  3. como de distinto pasar un parametro ???

    ResponderEliminar
  4. Un parametro? Las tablas del Sistema de Oracle, que yo sepa son bastante distintas de las De Access o de las de SQL Server...

    ResponderEliminar
  5. y has probado a bucear un poco en las espec de ODBC, OLEDB, JDBC, ... veras que existe un desc que te permite conocer con exactitud y precision con andas trabajando.
    Aun asi en tu articulo dice Obtencion del Esquema de una BBDD en ningun momento mecionas un metodo generico (ya que el tuyo tampoco lo es al 100% dependes de las referencias a la DLL de acceso a datos) Si quieres algo que funcione de verdad bucea un poco en las APIs y te encontraras alguna sorpresa que otra y quizas mas optima que lo q te proponia al principio.

    ResponderEliminar
  6. Yo no estoy discutiendo que existan o no formas mejores, haberlas las hay, puedes crear tu propia dll y dependiendendo de lo que te conectes obtenerlas.

    Únicamente estoy exponiendo un ejemplo.

    Aqui dependo del objeto conexion, un tipo OleDbConnection, ¿Que problema ves en usar esto?

    PD: ¿Nos conocemos?

    ResponderEliminar
  7. buenas, si quieres codigo fuente para sacar la estructura de las tablas puedes mirar en http://code.google.com/p/magicapps es la direccion de mi generador de codigo, saca la estructura de una base de datos y crea programas a partir de ella, hay un
    screencast en http://www.screentoaster.com/watch/stUEtdQ01MRFtYQ1taWlJbU1dT/code_generation_with_myway

    Por ahora genera "solo" aplicaciones web c# y vb (a partir de una
    base de datos o bien creando un modelo)..., aunque ahora mismo estoy
    creando para winform también. si quieres te lo puedes descargar de
    http://code.google.com/p/magicapps/downloads/detail?name=myway.zip&can=2&q=

    ResponderEliminar
  8. Hola ICS,

    La verdad es que te estás currando la aplicación y pinta muy bien.

    Gracias por el comentario!

    ResponderEliminar