miércoles, diciembre 29, 2010

VB.Net - Aplicación Móvil con Data Local


"Si usa algún código del siguiente tutorial, den el icono de ME GUSTA del Facebook que se encuentra en su mano derecha, para que se vuelva Seguidor del Blog y también comentenos que tal les pareció el tutorial"

1. Entorno

  • Visual Studio 2008

2. Introducción


ADO.NET proporciona acceso a diversas fuentes de datos. Estos incluyen Microsoft SQL Server, SQL Server CE, fuentes de datos expuestos a través   de OLE DB, y XML. Porque ADO.NET se basa en Microsoft. NET Framework, el acceso es el mismo para datos locales y remotos ADO.NET utiliza una arquitectura de datos desconectada. Los datos se almacenan y manipulado a nivel local en dataset. El dataset es un  base de datos virtual que contiene una o más tablas. En una aplicación móvil, los tablas del dataset  pueden ser pobladas por el usuario móvil de una bases de datos local o remota.


3. Desarrollo



3.1. Crear proyecto en Visual Studio 2008

Primero debemos de crear un proyecto del tipo Smart Device desde Visual Studio 2008, para eso abrimos el Visual Studio y seleccionamos la opción de crear un nuevo proyecto del tipo Smart Device y le ponemos como nombre "EjemploDataLocal"













Y de ahí seleccionamos la opción de crear un proyecto del tipo SmartPhone
















3.2. Agregando la Base de Datos Local

Para ello hacemos clic derecho en el proyecto de ahi seleccionamos "Agregar-->Nuevo Elemento"



















De ahí seleccionamos la categoría Datos, luego la opción de Archivo de Base de datos y finalmente le ponemos como nombre a nuestra base de datos "BDEmpleado"













De ahí nos sale la siguiente ventana y luego presionamos el botón Finalizar

















3.3. Crear las tablas

Para crear la tabla ir a la parte de "Explorador de Servidores" y hacer clic derecho en la carpeta que dice "Tabla" y seleccionamos la opción de "Crear tabla"
















Luego debemos de crear dos tablas Cargo y Empleado. La tabla Cargo tendra las siguiente columnas















Y la tabla Empleado tiene las siguiente columnas
















3.4. Llenar los datos de la tabla Cargo

Para eso hacemos clic derecho en la tabla Cargo y luego seleccionamos la opción "Mostrar Datos de Tabla"































3.5. Creando Clases

Debemos crear la clase que daran soporte al formulario que vamos a crear

3.5.1. Clase Conexion

Public Class Conexion

    Public cnn As String = "Data Source =" + System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly.GetName.CodeBase) + "\BDEmpleado.sdf;"

End Class

3.5.2. Clase Cargo

Imports System.Data.SqlServerCe
Imports System.Data

Public Class Cargo

    Public Function llenarCargo() As DataTable
        Dim dt As New DataTable
        Dim sqlcon As New SqlCeConnection
        sqlcon.ConnectionString = New Conexion().cnn
        Dim sqlcmd As New SqlCeCommand
        sqlcmd.Connection = sqlcon
        sqlcmd.CommandText = "select * from cargo"
        Dim sqldat As New SqlCeDataAdapter(sqlcmd)
        sqldat.Fill(dt)
        Return dt
    End Function

End Class

3.5.3. Clase Empleado

Imports System.Data.SqlServerCe
Imports System.Data

Public Class Empleado

    Private varCodigo As Integer
    Private varNombre As String
    Private varFechaNacimiento As DateTime
    Private varCodigoCargo As Integer

    Public Function insertarEmpleado(ByVal emp As Empleado) As String
        Dim sqlcon As New SqlCeConnection
        Try
            sqlcon.ConnectionString = New Conexion().cnn
            sqlcon.Open()
            Dim sqlcmd As New SqlCeCommand
            sqlcmd.Connection = sqlcon
            sqlcmd.CommandText = "INSERT INTO Empleado(Empleado_Nombre,Empleado_FecNac,Cargo_Codigo) VALUES(?,?,?)"
            sqlcmd.Parameters.Add("@Empleado_Nombre", SqlDbType.NVarChar, 100).Value = emp.Nombre
            sqlcmd.Parameters.Add("@Empleado_FecNac", SqlDbType.DateTime).Value = emp.FechaNacimiento
            sqlcmd.Parameters.Add("@Cargo_Codigo", SqlDbType.Int).Value = emp.CodigoCargo
            If sqlcmd.ExecuteNonQuery = 1 Then
                Return "OK"
            Else
                Return "No se pudo insertar al Empleado"
            End If
        Catch ex As Exception
            Return ex.Message
        Finally
            If sqlcon.State = ConnectionState.Open Then
                sqlcon.Close()
            End If
        End Try
    End Function


    Public Function actualizarEmpleado(ByVal emp As Empleado) As String
        Dim sqlcon As New SqlCeConnection
        Try
            sqlcon.ConnectionString = New Conexion().cnn
            sqlcon.Open()
            Dim sqlcmd As New SqlCeCommand
            sqlcmd.Connection = sqlcon
            sqlcmd.CommandText = "UPDATE Empleado SET Empleado_Nombre=? ,Empleado_FecNac=?, Cargo_Codigo=? WHERE Empleado_Codigo=?"
            sqlcmd.Parameters.Add("@Empleado_Nombre", SqlDbType.NVarChar, 100).Value = emp.Nombre
            sqlcmd.Parameters.Add("@Empleado_FecNac", SqlDbType.DateTime).Value = emp.FechaNacimiento
            sqlcmd.Parameters.Add("@Cargo_Codigo", SqlDbType.Int).Value = emp.CodigoCargo
            sqlcmd.Parameters.Add("@Empleado_Codigo", SqlDbType.Int).Value = emp.Codigo
            If sqlcmd.ExecuteNonQuery = 1 Then
                Return "OK"
            Else
                Return "No se pudo actualizar al Empleado"
            End If
        Catch ex As Exception
            Return ex.Message
        Finally
            If sqlcon.State = ConnectionState.Open Then
                sqlcon.Close()
            End If
        End Try
    End Function

    Public Function eliminarEmpleado(ByVal codigoEmp As Integer) As String
        Dim sqlcon As New SqlCeConnection
        Try
            sqlcon.ConnectionString = New Conexion().cnn
            sqlcon.Open()
            Dim sqlcmd As New SqlCeCommand
            sqlcmd.Connection = sqlcon
            sqlcmd.CommandText = "DELETE FROM Empleado WHERE Empleado_Codigo=?"
            sqlcmd.Parameters.Add("@Empleado_Codigo", SqlDbType.Int).Value = codigoEmp
            If sqlcmd.ExecuteNonQuery = 1 Then
                Return "OK"
            Else
                Return "No se pudo eliminar al Empleado"
            End If
        Catch ex As Exception
            Return ex.Message
        Finally
            If sqlcon.State = ConnectionState.Open Then
                sqlcon.Close()
            End If
        End Try
    End Function

    Public Function todosEmpleados() As DataTable
        Dim dt As New DataTable
        Dim sqlcon As New SqlCeConnection
        sqlcon.ConnectionString = New Conexion().cnn
        Dim sqlcmd As New SqlCeCommand
        sqlcmd.Connection = sqlcon
        Dim sql As String = "SELECT Empleado.Empleado_Codigo AS Codigo, Empleado.Empleado_Nombre AS Empleado, Empleado.Empleado_FecNac AS FecNac, " & _
        "Cargo.Cargo_Nombre AS Cargo, Cargo.Cargo_Codigo as CodigoCargo " & _
        "FROM Cargo INNER JOIN " & _
        "Empleado ON Cargo.Cargo_Codigo = Empleado.Cargo_Codigo"
        sqlcmd.CommandText = sql
        Dim sqldat As New SqlCeDataAdapter(sqlcmd)
        sqldat.Fill(dt)
        Return dt
    End Function

    Public Property Codigo() As Integer
        Get
            Return varCodigo
        End Get
        Set(ByVal value As Integer)
            varCodigo = value
        End Set
    End Property

    Public Property Nombre() As String
        Get
            Return varNombre
        End Get
        Set(ByVal value As String)
            varNombre = value
        End Set
    End Property

    Public Property FechaNacimiento() As DateTime
        Get
            Return varFechaNacimiento
        End Get
        Set(ByVal value As DateTime)
            varFechaNacimiento = value
        End Set
    End Property

    Public Property CodigoCargo() As Integer
        Get
            Return varCodigoCargo
        End Get
        Set(ByVal value As Integer)
            varCodigoCargo = value
        End Set
    End Property

End Class

3.6. Diseño del Formulario

Debemos de diseñar el siguiente formulario



















Los nombre de los componentes que se han diseñado serán lo siguientes:

  • txtCodigo --> TextBox
  • txtNombre --> TextBox
  • dtpFechaNacimiento --> DateTimePicker
  • cboCargo --> ComboBox
  • btnRegistrar --> Button
  • brnActualizar --> Button
  • btnEliminar --> Button
  • btnLimpiar --> Button

Luego en la otra pestaña del TabControl



















En la siguiente pestaña lo componentes que estarán recibirán los siguientes nombres:

  • dgEmpleado --> DataGrid

3.7. Codigo del Formulario

El formulario debe de tener el siguiente codigo

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim c As New Cargo
        Me.cboCargo.DataSource = c.llenarCargo
        Me.cboCargo.DisplayMember = "Cargo_Nombre"
        Me.cboCargo.ValueMember = "Cargo_Codigo"
        Me.dgEmpleado.DataSource = New Empleado().todosEmpleados
    End Sub

    Private Sub limpiar()
        Me.txtCodigo.Text = ""
        Me.txtNombre.Text = ""
        Me.cboCargo.SelectedIndex = 0
        Me.dtpFechaNacimiento.Value = Date.Now
    End Sub

    Private Sub mOk(ByVal men As String)
        MessageBox.Show(men, "MENSAJE", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1)
    End Sub

    Private Sub mError(ByVal men As String)
        MessageBox.Show(men, "MENSAJE", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1)
    End Sub

    Private Sub btnRegistrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRegistrar.Click
        Dim emp As New Empleado
        emp.Nombre = Me.txtNombre.Text.ToUpper
        emp.FechaNacimiento = Me.dtpFechaNacimiento.Value
        emp.CodigoCargo = CInt(Me.cboCargo.SelectedValue)
        Dim mensaje As String = emp.insertarEmpleado(emp)
        If mensaje = "OK" Then
            mOk("Se registro al Empleado de forma correcta")
            Me.limpiar()
            Me.dgEmpleado.DataSource = emp.todosEmpleados
        Else
            mError(mensaje)
        End If
    End Sub

    Private Sub brnActualizar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles brnActualizar.Click
        If Me.txtCodigo.Text <> "" Then
            Dim emp As New Empleado
            emp.Codigo = CInt(Me.txtCodigo.Text)
            emp.Nombre = Me.txtNombre.Text.ToUpper
            emp.FechaNacimiento = Me.dtpFechaNacimiento.Value
            emp.CodigoCargo = CInt(Me.cboCargo.SelectedValue)
            Dim mensaje As String = emp.actualizarEmpleado(emp)
            If mensaje = "OK" Then
                mOk("Se actualizo al Empleado de forma correcta")
                Me.limpiar()
                Me.dgEmpleado.DataSource = emp.todosEmpleados
            Else
                mError(mensaje)
            End If
        Else
            mError("Debe de buscar un empleado para actualizar")
        End If
    End Sub

    Private Sub dgEmpleado_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles dgEmpleado.DoubleClick
        Dim indice As Integer = Me.dgEmpleado.CurrentCell.RowNumber
        Dim dt As Data.DataTable = Me.dgEmpleado.DataSource
        Dim r As Data.DataRow = dt.Rows(indice)
        Me.txtCodigo.Text = r("Codigo")
        Me.txtNombre.Text = r("Empleado")
        Me.dtpFechaNacimiento.Value = r("FecNac")
        Me.cboCargo.SelectedValue = r("CodigoCargo")
        Me.TabControl1.SelectedIndex = 0
    End Sub

    Private Sub btnLimpiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLimpiar.Click
        Me.limpiar()
    End Sub

    Private Sub btnEliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEliminar.Click
        If Me.txtCodigo.Text <> "" Then
            Dim emp As New Empleado
            Dim mensaje As String = emp.eliminarEmpleado(CInt(Me.txtCodigo.Text))
            If mensaje = "OK" Then
                mOk("Se elimino al Empleado de forma correcta")
                Me.limpiar()
                Me.dgEmpleado.DataSource = emp.todosEmpleados
            Else
                mError(mensaje)
            End If
        Else
            mError("Debe de buscar un empleado para eliminar")
        End If
    End Sub
    
End Class


4. Ejemplo de la Aplicación


20 comentarios:

buen ejemplo solo que ocurre algo curioso !! al ejecutar la aplicación puedo hacer todos sus métodos , registrar , eliminar , etc pero al terminar la aplicación y reviso la BD no se ha realizado ni un cambio? tal vez me equivoque en algo me pudieras explicar en que =D o a que se debe el error xD es que soy nuevo y estoy practicando y viendo código xD

buen tuto , pero me sucede que cuando grabo o elimino el simulador de móvil me muestra que ha sido satisfactorio pero al revisar la BD no se ha realizado algún cambio =D alguna idea de que podría ser?

Hola

Lo que sucede es que cuando trabajas con una base de datos local, cuando cierras el simulador es como si formatearas el Celular por concerniente se borrar los datos. Cosa que no sucedería si lo estas usando en un celular real. Eso es normal, porque si no lo cierras siempre veras los datos en el datagridview. En el próximo tutorial que voy a realizar que es con base de datos remota. Ahí si vez la información a pesar que reinicies el simulador ya que la base de datos va a estar en otro lugar que no es el celular.

Saludos

gracias por la aclaración xD despejaste mi duda y lo vuelvo a decir buen tutorial xD esperare al próximo xD

De nada, estamos para servirle

Saludos

Excelente, lo guardé como el mejor tutorial de db en smart phone visual basic 2008.
todo organizado, clases, forms y comandos.Me pasaba lo mismo con el emulador y tenia la misma duda que Manu,Lo mejor es conectar el dispositivo con cable y dejarlo sincronizado. Lo hice muchísimo con EVB y pocketpc 4.2, mediante activesynch y ya lo probás en la "cancha" y te evitás el emulador.ahora estoy en W7 VS 2008 y muchas cosas son nuevas
muchisimas gracias por este excelente material.

Excelente, lo guardé como el mejor tutorial de db en smart phone visual basic 2008.
todo organizado, clases, forms y comandos.Me pasaba lo mismo con el emulador y tenia la misma duda que Manu,Lo mejor es conectar el dispositivo con cable y dejarlo sincronizado. Lo hice muchísimo con EVB y pocketpc 4.2, mediante activesynch y ya lo probás en la "cancha" y te evitás el emulador.ahora estoy en W7 VS 2008 y muchas cosas son nuevas
muchisimas gracias por este excelente material.

Que bueno que te haya servido .... Y no te olvides de seguirnos visitando porque pondremos mas tutoriales

HOLA MEN SABES ME SIRVIO MUCHO SOY NUEVO Y FUE MI PRIMERA PRACTICA Y FUNCIONO CORRECTO AHORA ME GUSTARIA SABER COMO ES ESO DE BASE DE DATOS REMOTOS???? ME GUSTARIA Q DEJRAS OTRO EJEMPLO CON BD REMOTOS GRACIAS Y SALUODS

Muy pronto habrá muchos mas ejemplos. Saludos!!!

HOLA HENRY GRACIAS POR EL APORTE Q NOS BRINDAS NOS SIRBE PARA APRENDER MAS MI NOMBR ES JEAN HENRY SABES SI YO HAGO UNA APLICACION EN EL MISMO PROGRAMA UN EJEMPLO UNA CALCULADORA Y COMO HAGO PARA DESCARGARLO AMI CELULAR DICHA APLICACION CREADA ME GUSTARIA Q PONGAS UN EJEMPLO O EXPLIQUES COMO HACERLO COMO SOY NUEVO EN ESTO DE SMART DEVICE GRACIAS POR TU ATENCION

Gracias por tus comentarios...Lo tendré en cuenta para un próximo tutorial.

amigo buenas pero como se compila esa aplicacion e instalas al celular?

y para usar el vb2008 movil se algun pluyin o algo aparte para instalar?

No se si este post tenga mucho tiempo, pero ael problema que tengo es que me sale este error El valor no está dentro del intervalo esperado y es en la quinta linea.
"Me.cboCargo.ValueMember="Cargo_Codigo"

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim c As New Cargo
Me.cboCargo.DataSource = c.llenarCargo
Me.cboCargo.DisplayMember = "Cargo_Nombre"
Me.cboCargo.ValueMember = "Cargo_Codigo"
Me.dgEmpleado.DataSource = New Empleado().todosEmpleados
End Sub


a ver si alguien me ayuda .Gracias

Disculpa la demora Jesús. Tienes algún inconveniente aun?

Henry un excelente tutorial, llevaba semanas buscando algo que me pudiera encaminar en el uso de la base de datos.
Gracias

Muchas gracias por los saludos

Hola acabo de ver el tutorial y la verdad esta muy bueno ...gracias!! una consulta dentro de los comentarios se dijo que abria otro video tutorial con una base de datos remota ya esta disponible?

Si la comunicación lo puedes hacer por medio de web service.

Gracias por la aplicacion esta interesante