You are on page 1of 6

Martes, 15 de Mayo de 2012 05:40 p.m.

Option Explicit On Imports Imports Imports Imports Imports System.Data System.Data.OleDb System.Threading System.Runtime.InteropServices VB = Microsoft.VisualBasic

Public Class frmLocalidadesProvincias Private MiConexion As OleDbConnection Private MiDataSet As DataSet 'Delegado para llamar a la carga de datos en la base de datos. Private Delegate Function CargarDatosDelegado(<Out()> ByRef Ds As DataSet) As Integer 'Callback para conocer cuando se termina la cargar de datos de la bdd. Private CallbackHandler As AsyncCallback = AddressOf CargarDatosCallback 'Delegado para actualizar la interfaz del formulario. Private Delegate Sub MostrarDatosDelegate(ByVal Ds As DataSet, ByVal CantRegistros As Integer) Private Sub frmLocalidadesProvincias_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed DesconectarBaseDeDatos() End Sub Private Sub frmLocalidadesProvincias_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load End Sub Private Sub btnLeerTablas_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnLeerTablas.Click Dim llamador As New CargarDatosDelegado(AddressOf Me.CargarDatosDeBaseDeDatos)

Debug.Print("Flujo de ejecucin de las llamadas asncronas - Hilo " & Thread.CurrentThread.ManagedThreadId()) 'Hacemos la llamada asncrona a la carga de datos de la base de datos, y le pasamos 'la funcin Callback, en la que vamos a llamar al procedimiento que cargar los 'datos devueltos en el form. Debug.Print("Llamamos a CargarDatosDeBaseDeDatos de forma asncrona - Hilo " & Thread.CurrentThread.ManagedThreadId()) llamador.BeginInvoke(MiDataSet, CallbackHandler, llamador) 'Continuamos con otras sentencias CrearColumnas() End Sub Private Function ConectarBaseDeDatos() As Boolean Dim Ubicacion As String Dim CadenaConexion As String

-1-

Martes, 15 de Mayo de 2012 05:40 p.m.

Ubicacion = "G:\Mis Cdigos\VB.NET\MisClases\Data.mdb" CadenaConexion = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Ubicacion & ";" MiConexion = New OleDbConnection(CadenaConexion) If MiConexion IsNot Nothing Then MiConexion.Open() Return (MiConexion.State = ConnectionState.Open) Else Return False End If End Function Private Sub DesconectarBaseDeDatos() If MiConexion IsNot Nothing Then If MiConexion.State = ConnectionState.Open Then MiConexion.Close() MiConexion.Dispose() MiConexion = Nothing End If End If End Sub Private Sub CrearColumnas() Debug.Print("Inicio CrearColumnas - Hilo " & Thread.CurrentThread.ManagedThreadId()) lvwDatos.Clear() With lvwDatos.Columns .Add("IdLocalidad", 100, HorizontalAlignment.Right) .Add("CodigoPostal", 100, HorizontalAlignment.Right) .Add("Nombre", 150, HorizontalAlignment.Left) .Add("Localidad.IdProvincia", 100, HorizontalAlignment.Right) .Add("IdProvincia", 100, HorizontalAlignment.Right) .Add("Nombre", 150, HorizontalAlignment.Left) End With Debug.Print("Fin CrearColumnas") End Sub 'Pasamos el parmetro con la leyenda Out y ByRef ya que vamos a utilizarlo a ese parmetro 'como resultado de retorno cuando llamemos a EndInvoke. 'Hay que importar la librera System.Runtime.InteropServices Private Function CargarDatosDeBaseDeDatos(<Out()> ByRef Ds As DataSet) As Integer Dim ConsultaSQL As String Dim da As OleDbDataAdapter Dim Ubicacion As String Dim CadenaConexion As String 'Abrimos la conexin Debug.Print("Inicio CargarDatosDeBaseDeDatos - Hilo " & Thread.CurrentThread.ManagedThreadId()) Ubicacion = "G:\Mis Cdigos\VB.NET\MisClases\Data.mdb" CadenaConexion = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Ubicacion &
-2-

Martes, 15 de Mayo de 2012 05:40 p.m.

";" MiConexion = New OleDbConnection(CadenaConexion) If MiConexion IsNot Nothing Then MiConexion.Open() Else Exit Function End If 'Generamos la consulta ConsultaSQL = "SELECT tLocalidades.IdLocalidad, tLocalidades.CodigoPostal, " & _ "tLocalidades.Nombre, tLocalidades.IdProvincia, tProvincias.IdProvincia, " & _ "tProvincias.Nombre FROM tLocalidades INNER JOIN tProvincias ON " & _ "tLocalidades.IdProvincia = tProvincias.IdProvincia" Ds = New DataSet da = New OleDbDataAdapter(ConsultaSQL, MiConexion) da.Fill(Ds) 'Cerramos la conexin If MiConexion IsNot Nothing Then If MiConexion.State = ConnectionState.Open Then MiConexion.Close() MiConexion.Dispose() MiConexion = Nothing End If End If 'Devolvemos la cantidad de registros If Ds.Tables.Count > 0 Then Return Ds.Tables(0).Rows.Count Else Return 0 End If Debug.Print("Fin CargarDatosDeBaseDeDatos") End Function Private Sub CargarDatosEnFormulario(ByVal Ds As DataSet, ByVal CantRegistros As Integer) Dim i As Integer Dim j As Integer Dim k As Integer Dim NombreEsLocalidad As Boolean Dim IdEsLocalidad As Boolean Debug.Print("Inicio CargarDatosEnFormulario - Hilo " & Thread.CurrentThread.ManagedThreadId()) If Ds.Tables.Count > 0 Then With Ds.Tables(0) For i = 0 To .Rows.Count - 1 For j = 0 To .Columns.Count - 1 If VB.InStr(.Columns(j).ColumnName, "IdLocalidad",
-3-

Martes, 15 de Mayo de 2012 05:40 p.m.

CompareMethod.Text) > 0 Then If .Rows(i).IsNull(j) Then lvwDatos.Items.Add("") Else lvwDatos.Items.Add(.Rows(i).Item(j).ToString) End If 'Agregamos los subitems For k = 1 To .Columns.Count - 1 lvwDatos.Items(i).SubItems.Add("") Next NombreEsLocalidad = True IdEsLocalidad = True ElseIf VB.InStr(.Columns(j).ColumnName, "CodigoPostal", CompareMethod.Text) > 0 Then If .Rows(i).IsNull(j) Then lvwDatos.Items(i).SubItems.Item(j).Text = "" Else lvwDatos.Items(i).SubItems.Item(j).Text = .Rows(i).Item( j).ToString End If ElseIf VB.InStr(.Columns(j).ColumnName, "Nombre", CompareMethod.Text) > 0 Then If .Rows(i).IsNull(j) Then lvwDatos.Items(i).SubItems.Item(j).Text = "" Else If NombreEsLocalidad Then lvwDatos.Items(i).SubItems.Item(2).Text = .Rows(i). Item(j).ToString NombreEsLocalidad = False Else lvwDatos.Items(i).SubItems.Item(5).Text = .Rows(i). Item(j).ToString End If End If ElseIf VB.InStr(.Columns(j).ColumnName, "IdProvincia", CompareMethod.Text) > 0 Then If .Rows(i).IsNull(j) Then lvwDatos.Items(i).SubItems.Item(j).Text = "" Else If IdEsLocalidad Then lvwDatos.Items(i).SubItems.Item(3).Text = .Rows(i). Item(j).ToString IdEsLocalidad = False Else lvwDatos.Items(i).SubItems.Item(4).Text = .Rows(i). Item(j).ToString End If End If End If Next Next End With
-4-

Martes, 15 de Mayo de 2012 05:40 p.m.

Else MsgBox("No se pudieron cargar los datos. No se cargaron las tablas.") End If Debug.Print("Fin CargarDatosEnFormulario") End Sub Private Sub CargarDatosCallback(ByVal Ar As IAsyncResult) Dim Retorno As Integer Dim ds As DataSet Try Dim llamador As CargarDatosDelegado Debug.Print("Inicio CargarDatosCallback - Hilo " & Thread.CurrentThread.ManagedThreadId()) 'Como mandamos como ltimo parmetro al delegado en BeginInvoke, mediante 'una conversin de tipos, podemos recuperarlo para llamar a EndInvoke. llamador = CType(Ar.AsyncState, CargarDatosDelegado) 'La llamada a EndInvoke devuelve el mismo tipo que devolvera la funcin 'si se llamara sincronamente. Retorno = llamador.EndInvoke(ds, Ar) 'Ac debemos actualizar la interfaz de usuario, que se encuentra en otro hilo. ActualizarUI(ds, Retorno) Catch ex As Exception ActualizarUI(ds, Retorno) End Try Debug.Print("Fin CargarDatosCallback") End Sub Private Sub ActualizarUI(ByVal Ds As DataSet, ByVal CantRegistros As Integer) Dim llamador As MostrarDatosDelegate Debug.Print("Inicio ActualizarUI - Hilo " & Thread.CurrentThread.ManagedThreadId ()) If Me.InvokeRequired Then 'Si estamos en otro hilo distinto al de la Interfaz (Hilo ppal.), creamos 'un delegado para llamar al cdigo que actualizar el formulario. 'Al llamarlo de Me.BeginInvoke, lo que estamos haciendo es obligar al programa 'que llame al mtodo que queremos ejecutar desde el hilo ppal., y no desde 'el hilo actual (secundario o asncrono). llamador = New MostrarDatosDelegate(AddressOf CargarDatosEnFormulario) Dim Params() As Object = {Ds, CantRegistros} Debug.Print("Llamamos a CargarDatosEnFormulario desde Hilo " & Thread.CurrentThread.ManagedThreadId()) Me.BeginInvoke(llamador, Params) Else 'Si estamos en el mismo hilo, cargamos los datos en el formulario. Debug.Print("Llamamos a CargarDatosEnFormulario desde Hilo " &
-5-

Martes, 15 de Mayo de 2012 05:40 p.m.

Thread.CurrentThread.ManagedThreadId()) CargarDatosEnFormulario(Ds, CantRegistros) End If Debug.Print("Fin ActualizarUI") End Sub End Class

-6-

You might also like