How to: Utilizar en modelo de proveedores de datos de ADO.NET 2.0

(*) Este post es bastante antiguo y lo tenía publicado en otro blog que ya no existe, pero como veo que es un tema recurrente en los foros de MSDN he decidido publicarlo de nuevo.

A petición del inefable Juansa, vamos a ver cómo funciona el modelo de proveedores de ADO.NET 2.0.

1

Estre modelo es ideal para todas aquellas aplicaciones que deben utilizar distintos proveedores de datos (Access, SQL Server, Oracle), ya que disponen de unas factorías de objetos que proporcionan un nivel de abstracción. Por ejemplo, si deseamos usar el proveedor de SQL Server ya no es necesario usar las clases conexión, comando, etc. que hay dentro del namespace System.Data.SqlClient, ahora podemos crear una factoría basada en SQL Server y pedirle que nos cree una clase de tipo connection, comando, etc.

De este modo, si deseamos cambiar el proveedor de datos basta con cambiar el string del nombre del proveedor y la cadena de conexión. Para muestra un botón:

Private Sub TestFactoryProviders()    
    Dim ProviderName As String = "System.Data.SqlClient"    
    Dim CnnStr As String = "Data Source=TU_SERVIDOR_SQL;" + _      
        "Initial Catalog=TU_BD;" + _      
        "Integrated Security=True"    
    Dim SQLStr As String = "SELECT * FROM TU_TABLA"    
    'Crea la factoria en base al proveedor especificado    
    Dim Factory As DbProviderFactory = DbProviderFactories.GetFactory(ProviderName)    
    'Crea la conexión del tipo apropiado (según proveedor)    
    Dim Con As DbConnection = Factory.CreateConnection()    
    Using Con        
        'Asigna la cadena de conexión        
        Con.ConnectionString = CnnStr        
        Con.Open()        
        'Crea un command del tipo apropiado (según proveedor)        
        Dim Cmd As DbCommand = Con.CreateCommand()        
        Using Cmd            
            Cmd.CommandType = CommandType.Text            
            Cmd.CommandText = SQLStr            
            'Crea un DataTable y lo llena a partir del             
            'DataReader que devuelve el comando            
            Dim dt As DataTable = New DataTable("dt1")            
            dt.Load(Cmd.ExecuteReader())            
            For Each row As DataRow In dt.Rows                
                'Haz lo que quieras con los datos... 😛            
            Next        
        End Using        
        Con.Close()    
    End Using
End Sub

Según el ejemplo, cambiando los valores de las dos primeras variables podemos utilizar cualquier origen de datos de forma indistinta.
Happy coding!

How to: Cómo insertar un WinForm dentro de un control TabPanel

:-)
Hoy he visto en el foro de VB una duda que planteaba Tito, acerca de la posibilidad de usar un entorno de formularios hijos dentro de un TabPanel (al estilo del editor de Visual Studio). No es la primera vez que veo esta duda, así que le he dedicado un ratillo y aquí publico una posible solución.

FormInTabPanel 

De este modo podemos tener un formulario que actúa como contenedor de otros, pero sin utilizar MDI (que por otra parte me parece ya bastante pasado de moda :-P). La técnica a usar muy sencilla y lo único que hacemos es cada vez que creamos un form, creamos también un objeto TabPage e insertamos el formulario dentro de la nueva pestaña. La única cosa que tenemos que tener en cuenta es establecer la propiedad TopLevel del nuevo formulario ‘hijo’ a False, ya que de otro modo recibiremos un error.

Una muestra:

Private Sub ShowForm()
    Dim r As New Random()
    Static i As Integer
    i += 1
    Dim key As String = "f" + i.ToString()
    'Crea el nuevo form (copia de form2)
    Dim f As New Form2
    f.BackColor = Color.FromArgb(r.Next(0, 255), r.Next(0, 255), r.Next(0, 255))
    f.Text = String.Format("Nuevo form {0}", i)
    'Crea el tab que lo contiene
    Me.Tabs.TabPages.Add(key, f.Text)
    f.TopLevel = False
    f.FormBorderStyle = Windows.Forms.FormBorderStyle.None
    f.Dock = DockStyle.Fill
    Me.Tabs.TabPages(key).Controls.Add(f)
    Me.Tabs.SelectedTab = Me.Tabs.TabPages(key)
    'Asigna el nuevo form al tag del tabpage
    Me.Tabs.TabPages(key).Tag = f
    'Por si desde el propio form quieres cerrar y eliminar el tab
    f.Tag = Me.Tabs.TabPages(key)
    f.Show()
End Sub

Podeis descargar el proyecto de ejemplo desde:

Y para los que siempre me tiráis los puntosycoma en cara, lo he realizado en VB (eh Jorge? :-D).
Un saludo desde Andorra!

** Modificación (02/07/2008) para agregar un menú contextual a las pestañas **

A petición de Carlos. De este modo es puede cerrar la pestaña actual o todas las pestañas menos la que estamos viendo ahora. El menú es un objeto ContextMenuStrip, de modo que es totalmente extensible para agregar vuestra propia funcionalidad.

FormInTabPanel_Menu

La nueva versión está disponible en:

Saludos,