You are on page 1of 99

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -383

PRACTICA 6 BASE DE DATOS EN WINDOWS FORMS


Para realizar los ejercicios de este practica se debe tener la base de datos alumnos
que tiene la siguiente estructura( visto en la practica 3)

1. MANEJANDO LA CONEXIN
conectarse a SQL Server usando el proveedor de
datos de SQL, para lo cual veremos algunas
propiedades y mtodos de la clase SqlConnection.
Para ello arrastre un botn de comando y un cuadro
de lista

Imports System.Data.SqlClient
Public Class Form1
Private Sub Btnconectar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnConectar.Click
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)
With con
.Open()
ListBox1.Items.Add("nombre del servidor de datos =" & .DataSource)

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -384

ListBox1.Items.Add("Version del servidor de datos =" & .ServerVersion)


ListBox1.Items.Add("Nombre de la base de datos =" & .Database)
ListBox1.Items.Add("Tamao del paquete en bytes =" & .PacketSize)
ListBox1.Items.Add("cadena de conexion =" & .ConnectionString)
ListBox1.Items.Add("tiempo de conexion = " & .ConnectionTimeout)
ListBox1.Items.Add("Estacion de trabajo= " & .WorkstationId)
ListBox1.Items.Add("Estado = " & .State)
ListBox1.Items.Add("Estatic enabled = " & .StatisticsEnabled)
.Close()
ListBox1.Items.Add("Estado = " & .State)
End With
End Sub
End Class
Use intelligence sense para ver los propiedades y mtodos del objeto

Nota si usted copia la base de datos al directorio del proyecto su cadena de conexxion
seria
Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\demo35\demo35\ALUMNOS.mdf;
Integrated Security=True;Connect Timeout=30;User Instance=True
Si su base de datos es obtenido del servidor ( creado en SQL Server 2008) solo
deberia poner)
Dim CadenaConexion As String = "Data Source=.\sqlexpress;Initial
Catalog=Alumnos;Integrated Security=True"
Y su solucion seria

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -385

USANDO EL PROVEEDOR DE OLEDB


1.1.1 Clase OleDbConnection
Esta clase permite conectarse a cualquier rigen de datos que tenga un proveedor de
OleDB, tal como Access o versiones anteriores a SQL Server 7. Esta Clase tambin
implementa los miembros de la clase Connection, y es muy similar a SqlConnection
conectarse a una base de datos de MS Access 2007 usando el proveedor de datos de
OleDb
Cdigo
Imports System.Data.OleDb
Public Class Form1
Inherits System.Windows.Forms.Form
Private Sub btnConectar_Click_1(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnConectar.Click
Dim CadenaConexion = "Provider=Microsoft.ACE.OLEDB.12.0;Data
Source=E:\DATOS\ALUMNOS.accdb"
Dim con As New OleDbConnection(CadenaConexion)
ListBox1.Items.Clear()
With con
.Open()
ListBox1.Items.Add("Nombre de la base de datos =" & .DataSource)
ListBox1.Items.Add("Provedor =" & .Provider)
ListBox1.Items.Add("Cadena de conexion =" & .ConnectionString)
ListBox1.Items.Add("Version del servidor =" & .ServerVersion)
ListBox1.Items.Add("database =" & .Database)
ListBox1.Items.Add("estado = " & .State)
.Close()
ListBox1.Items.Add("estado = " & .State)
End With
End Sub
End Class

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -386

Puede cambiar la cadena de conexion a


Dim CadenaConexion = "data source = .\sqlexpress;provider = sqloledb;integrated
security = sspi;Initial Catalog=Alumnos"
USANDO EL PROVEEDOR DE Odbc(OPCIONAL)
Imports System.Data.Odbc
Public Class Form1
Inherits System.Windows.Forms.Form
Private Sub Btnconectar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnConectar.Click
Dim CadenaConexion = "dsn=AlumnosODBC"
Dim con As New OdbcConnection(CadenaConexion)
ListBox1.Items.Clear()
With con
.Open()
ListBox1.Items.Add("Nombre de la base de datos =" & .DataSource)
ListBox1.Items.Add("Provedor =" & .Driver)
ListBox1.Items.Add("Cadena de conexion =" & .ConnectionString)
ListBox1.Items.Add("Version del servidor =" & .ServerVersion)
ListBox1.Items.Add("estado =" & .State)
ListBox1.Items.Add("database =" & .Database.ToString)
.Close()
End With
End Sub
End Class

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -387

1.2 CONTROLANDO ERRORES DE CONEXIN A SQL SERVER


Cuando ejecutamos una aplicacin pueden ocurrir errores en tiempo de ejecucin a las
cuales se les conoce como Excepciones ,las cuales se controlan mediante la estructura
Try.. Catch y atrapadas mediante la clase llamada Exception en .NET
Pero la clase Exception es muy genrico, ya que fue diseada para informar sobre
cualquier tipo de error en tiempo de ejecucin, para lo cual tiene propiedades como
Message que da la descripcin del error y Source quien dice el origen del error.
Si la aplicacin trabaja con SQL Server lo mejor sera controlar el error usando la clase
SqlException que fue diseado exclusivamente para informar sobre los errores de
acceso de datos en el proveedor de SQL
.Clase SqlException
Esta clase se usa para informar sobre los errores ocurridos en tiempo de ejecucin al
acceder a SQL Server , ya sea al tratar de conectarse o al realizar una operacin sobre
una Base de datos de SQL Server , tal como ejecutar una instruccin SQL, ejecutar un
procedimiento almacenado, etc
1.2.1 Clase SQlError La clase SQlException tiene una coleccin de errores donde
cada error es de tipo SqlError, ste ltimo tiene informacin sobre un solo error
en tiempo de ejecucin.
Ejemplo 1 Try catch finally
Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Private Sub ControlErrores(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim x As Integer = 10
Dim y As Integer = 2
Dim z As Integer
Try
x=x\y
z = Math.Sqrt(4 - x)
ListBox1.Items.Add("operacion correcta x = " & x)
ListBox1.Items.Add("operacion correcta z = " & x)
Catch ex As Exception When y = 0
' Catch the error.
ListBox1.Items.Add(ex.Data)
ListBox1.Items.Add(ex.ToString)
ListBox1.Items.Add(ex.Source)
ListBox1.Items.Add(ex.Message)
Catch ex1 As Exception When x > 4
' Catch the error.
ListBox1.Items.Add(ex1.Message)
Finally
Beep()

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -388

End Try
End Sub
End Class

Cambie a Dim x As Integer = 10


Dim y As Integer = 2
El resultado sera el siguiente

Cambie Dim x As Integer = 2


Dim y As Integer = 1
El resultado sera el siguiente

DEMO 37 controlar errores de acceso a datos a SQL Server mediante la estructura Try..
Catch.. Finally y el uso de los objetos SqlExcpetion y Sql Error. Y guardar los errores en
un archivo de texto para ser revisado por el administrador de la aplicacin.

CODIGO DEL FORMULARIO


Imports System.Data.SqlClient
Imports System.IO
Public Class Form1

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -389

Inherits System.Windows.Forms.Form
Private Sub ControlErrores(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)
Dim cmd As New SqlCommand("Select count(*) from alumnos", con)
Try
con.Open()
Dim intEmpleados As Integer = cmd.ExecuteScalar
MessageBox.Show(intEmpleados.ToString, "Numero de alumnos",
MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch sqlEx As SqlException
Dim Archivo1 As New StreamWriter("E:\datos\Errores.txt", True)
Dim sqlEr As SqlError
For Each sqlEr In sqlEx.Errors
Archivo1.WriteLine("Fecha y Hora : " & Now.ToString)
Archivo1.WriteLine("Numero Error : " & sqlEr.Number)
Archivo1.WriteLine("Mensaje Error: " & sqlEr.Message)
Archivo1.WriteLine(New String("=", 50))
Next
Archivo1.Flush()
Archivo1.Close()
Finally
If con.State = ConnectionState.Open Then con.Close()
End Try
End Sub
Private Sub BtnMostrarErrores_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnMostrarErrores.Click
If File.Exists("E:\datos\Errores.txt") Then
Dim Archivo1 As New StreamReader("E:\datos\Errores.txt")
Dim Linea As String
ListBox1.Items.Clear()
Do While True
Linea = Archivo1.ReadLine
If Linea Is Nothing Then Exit Do
ListBox1.Items.Add(Linea)
Loop
Archivo1.Close()
Else
MessageBox.Show("No existe el archivo de Errores", "Aviso",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End If
End Sub
End Class
Si no hay errores muestra la cantidad de registros que hay en la tabla

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -390

Cambie la cadena de conexion a y vera los errores


Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS1.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
1.3 MANEJANDO EVENTOS DE CONEXIN A SQL SERVER
Los eventos de conexin permiten saber que est sucediendo a la conexin en el
transcurso de la ejecucin de la aplicacin
la clase SqlConnection tiene dos eventos de conexin que son el StateChange y el
InfoMessage.
1.3.1 Manejando el cambio de estado de la conexin (opcional)
Para manejar el cambio de estado de la conexin se usa el evento StateChange del objeto
SqlConnection, ste tiene un parmetro e de tipo StateChangeEventArg, el cual tiene
dos propiedades:
CurrentState
OriginalState

Devuelve el estado actual de la conexin


Devuelve el estado anterior de la conexin

1.4.2. Manejando el Envi de Notificaciones SQL a los Clientes


DEMO 38 ( manejar eventos de conexin sobre todo para controlar el cambio de
estado de la conexin que puede afectar a la ejecucin de la aplicacin.
Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Private WithEvents con As New SqlConnection("Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True")
Private Sub MostrarEstado(ByVal sender As Object, ByVal e As
System.Data.StateChangeEventArgs) Handles con.StateChange
txtEstadoAnterior.Text = e.OriginalState.ToString
txtEstadoActual.Text = e.CurrentState.ToString
End Sub
Private Sub CerrarConexionAlSalir(ByVal sender As Object, ByVal e As
System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
If con.State = ConnectionState.Open Then con.Close()
End Sub
Private Sub btnModificarConexion_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnModificarConexion.Click
If btnModificarConexion.Text = "Conectar" Then
con.Open()
btnModificarConexion.Text = "Desconectar"
Else
con.Close()

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -391

btnModificarConexion.Text = "Conectar"
End If
End Sub
End Class

2. TRABAJANDO CON COMANDOS


2.1 INTRODUCCION A LOS COMANDOS
Los comandos son instrucciones que se ejecutan en un origen de datos y que le indican
al motor de datos realizar una tarea especfica como: recuperar registros, insertar,
actualizar o eliminar registros sobre el origen de datos.
2.1.2 Tipos de comandos
De acuerdo al tipo de accin o resultado de comando , en ADO.NET podemos clasificar
los comandos en :
Comandos que devuelven un simple valor (ExecuteScalar)
Comandos que devuelven un conjunto de datos (ExecuteReader).
Comandos que actualizan datos EXECUTE NonQuery
2.2 CLASE SQLCOMMAND
Para trabajar con cualquier tipo de comandos necesitamos usar el objeto Command , en
este caso para trabajar con SQL, usamos el SqlCommnand.
2.3 TRABAJANDO CON COMANDOS QUE DEVUELVEN UN SIMPLE VALOR
Ejemplo de la base de datos alumnos encuentre los siguientes valores que se indican en
el formulario
Imports System.Data.SqlClient
Public Class Form1
Dim CadenaConexion As String = "Data
Source=(LocalDB)\v11.0;AttachDbFilename=E:\DATOS\ALUMNOS1.mdf;Integrated
Security=True;Connect Timeout=30"

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -392

Private Sub MostrarEstadistica(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles MyBase.Load
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("Select * FROM Pagos", con)
Dim dst As New DataSet()
dap.Fill(dst, "Pagos")
DataGridView1.DataSource = dst.Tables(0)
Try
Dim cmd As New SqlCommand("", con)
con.Open()
With cmd
.CommandText = "Select Count(Monto) From Pagos"
Dim CantidadPagos As Integer = .ExecuteScalar
ListBox1.Items.Add("Cantidad de Pagos " & CantidadPagos.ToString)
.CommandText = "Select Min(Monto) From pagos"
Dim PagoMinimo As Decimal = .ExecuteScalar
ListBox1.Items.Add(" Minimo pago " & PagoMinimo.ToString)
.CommandText = "Select max(monto) From pagos"
Dim PagoMaximo As Decimal = .ExecuteScalar.ToString
ListBox1.Items.Add("Pago maximo " & PagoMaximo.ToString)
.CommandText = "Select Avg(Monto) From Pagos"
Dim PagoPromedio As Decimal = .ExecuteScalar
ListBox1.Items.Add("Pago promedio " & PagoPromedio.ToString)
.CommandText = "Select sum(monto) From pagos"
Dim PagoSuma As Decimal = .ExecuteScalar
ListBox1.Items.Add("Suma de Notas " & PagoSuma.ToString)
.CommandText = "Select StDev(monto) From pagos"
Dim DesviacionPagos As Decimal = .ExecuteScalar
ListBox1.Items.Add("Desviacion de Pagos " & DesviacionPagos.ToString)
End With
Catch ex As Exception
MsgBox(ex.Message)
Finally
con.Close()
End Try
End Sub
End Class

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -393

2 TRABAJANDO CON COMANDOS DE SELECCIN


3.1 CLASE SQLDATAREADER
Todos los comandos de seleccin usan el objeto DataReader para almacenar los datos
recuperados por la instruccin SQL.
El objeto DataReader tiene las siguientes caractersticas:

Este es muy rpido y consume pocos recursos de memoria ya que mantiene una
sola fila a la vez.
Solo permite el desplazamiento hacia adelante (ForwardOnly)
No sirve para modificar registros
No es enlazable a controles Windows ( No Binding Windows Controls) para
mostrar los datos hay que leer y mostrar registro por registro.

1. Para recuperar un valor del DataReader usar la propiedad Value de los mtodos
GetSql de acuerdo al tipo de datos a leer y el ndice de campo en la instruccin
Select , por ejemplo para un Select de 3 columnas , una entera , otra cadena, y otra
moneda, tenemos:
Dim valor1 as integer = drd: getSqlInt32(0).Value
Dim valor2 as Stringr = drd: getSqlString(1).Value
Dim valor3 as Decimal = drd: getSqlMoney(2).Value
Consejos

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -394

Existen varias formas de leer un valor de un campo en un DataReader pero la


mejor forma es especificar el tipo de del origen de datos y el ndice del campo, tal
como se aprecia en el cdigo anterior
Cuando se lee un campo que no tiene dato , es decir es nulo , se producir un error
, para esto debe verificarse primero si el campo tiene datos o no con la propiedad
IsNull de los mtodos GetSql. Por ejemplo, para el caso anterior tendramos:

If Not drd.GetSqlInt32(0).IsNull Then valor1= drd:GetSqlInt32(0).Value


If Not drd.GetSqlString(1).IsNull Then valor2= drd:GetSqlString(1).Value
If Not drd.GetSqlMoney(2).IsNull Then valor2= drd:GetSqlMoney(2).Value
DEMO 40 (Obtener el campo nombre de la tabla alumnos)
Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Private Sub ListarNombres(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("Select * FROM alumnos", con)
Dim dst As New DataSet()
dap.Fill(dst, "Alumnos")
DataGridView1.DataSource = dst.Tables(0)
Dim cadena1 As String = "select NombreALumno from alumnos"
Dim cmd As New SqlCommand(cadena1, con)
con.Open()
Dim drd As SqlDataReader = cmd.ExecuteReader
Do While drd.Read
ListBox1.Items.Add(drd.GetSqlString(0))
Loop
drd.Close()
con.Close()
End Sub
End Class

Tarea. Listar el campo deseado de una base de datos

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -395

Modifique y pruebe
Puede listar dos campos de texto a la vez nombre y cdigo
Para el campo tipo fecha seria ListBox1.Items.Add(drd.GetDateTime(0))
DEMO 41 comandos de seleccin que recuperen varios campos de un conjunto de datos.
Ejercicio 1 .Devolver todos los campos de la tabla alumnos

Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Private Sub ListarNombres(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("Select * FROM alumnos", con)
Dim dst As New DataSet()
dap.Fill(dst, "Alumnos")
DataGridView1.DataSource = dst.Tables(0)
Dim cadena1 As String = "select CodAlumno,NombreAlumno,FechaNac from
alumnos"
Dim cmd As New SqlCommand(cadena1, con)
con.Open()
Dim drd As SqlDataReader = cmd.ExecuteReader
Do While drd.Read
ListBox1.Items.Add(drd.GetSqlString(0).Value & drd.GetSqlString(1).Value &
Space(30) & drd.GetDateTime(2).Date)
Loop
drd.Close()
con.Close()
End Sub

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -396

End Class
Puede usar el signo + en vez de &
Ejercicio 3 . Combinar tabla pagos con tabla alumnos como se muestra

Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\SI2011B\DATOS\ALUMNOS.mdf;Integrate
d Security=True;Connect Timeout=30;User Instance=True"
Private Sub ListarNombres(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("Select A.Nro, A.CodAlumno ,B.NombreAlumno,
A.Monto FROM Pagos A, Alumnos B Where A.Codalumno=B.codalumno", con)
Dim dst As New DataSet()
dap.Fill(dst, "Alumnos")
DataGridView1.DataSource = dst.Tables(0)
Dim cadena1 As String = "Select Nro, A.CodAlumno ,B.NombreAlumno, Monto FROM
Pagos A, Alumnos B Where A.Codalumno=B.codalumno"
Dim cmd As New SqlCommand(cadena1, con)
con.Open()
Dim drd As SqlDataReader = cmd.ExecuteReader
Do While drd.Read
ListBox1.Items.Add(drd.GetInt32(0).ToString.PadLeft(5) +
drd.GetSqlString(1).Value.PadLeft(15) + drd.GetSqlString(2).Value.PadLeft(20) +
drd.GetDecimal(3).ToString.PadLeft(20))
Loop
drd.Close()
con.Close()
End Sub

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -397

End Class
Ejercicio 5 .Listar los campos nro, codigo del alumno, monto y el final que obtenga la
suma del monto , y el mayor monto

Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Private Sub ListarNombres(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("select Nro, CodAlumno,Monto from pagos", con)
Dim dst As New DataSet()
dap.Fill(dst, "Alumnos")
DataGridView1.DataSource = dst.Tables(0)
Dim cadena1 As String = "select Nro, CodAlumno,monto from pagos "
Dim cmd As New SqlCommand(cadena1, con)
con.Open()
Dim drd As SqlDataReader = cmd.ExecuteReader
Do While drd.Read
ListBox1.Items.Add(drd.GetInt32(0) & Space(30) & drd.GetSqlString(1).Value &
Space(30) & drd.GetDecimal(2))
Loop
drd.Close()
cmd.CommandText = "Select sum (Monto) From Pagos"
Dim SumaPagos As Integer = cmd.ExecuteScalar
ListBox1.Items.Add(" Suma de monto es " & SumaPagos)
cmd.CommandText = "Select MAX (Monto) From Pagos"
ListBox1.Items.Add(" el maximo monto es " & cmd.ExecuteScalar)

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -398

con.Close()
End Sub
End Class
3.3 RECUPERANDO MULTIPLES CONJUNTOS DE DATOS
Para ejecutar comandos que devuelven mltiples conjuntos de datos tambin se usa el
mtodo ExecuteReader del objeto SqlCommand,
Ejercicio 1. Generar dos tablas uno de cdigos de alumnos y otro de los nombres de
alumnos y luego mostrarlos su contenido

Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles MyBase.Load
Dim CadenaConexion As String = " Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("Select * FROM alumnos", con)
Dim dst As New DataSet()
dap.Fill(dst, "Alumnos")
DataGridView1.DataSource = dst.Tables(0)
Dim cmd As New SqlCommand("Select CodAlumno from Alumnos;Select
NombreAlumno From Alumnos;", con)
Dim drd As SqlDataReader
con.Open()
drd = cmd.ExecuteReader

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -399

ListBox1.Items.Clear()
Do While drd.Read
ListBox1.Items.Add(drd.GetSqlString(0).Value)
Loop
If drd.NextResult Then
ListBox1.Items.Add("siguiente tabla")
Do While drd.Read
ListBox1.Items.Add(drd.GetSqlString(0).Value)
Loop
End If
drd.Close()
con.Close()
End Sub
End Class
Ejercicio 2. Mostrar datos de las todas las tablas de base de datos Alumnos

Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles MyBase.Load
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("Select * FROM alumnos;Select * From Pagos;
select * from Cursos; ", con)
Dim dst As New DataSet()
dap.Fill(dst, "Alumnos")
DataGridView1.DataSource = dst.Tables(0)

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -400

Dim cmd As New SqlCommand("Select CodAlumno ,NombreAlumno,FechaNac from


Alumnos;Select Nro, CodAlumno, Fechapago, Monto,CodCurso from Pagos;select
codcurso, nombrecurso, profesor from cursos", con)
Dim drd As SqlDataReader
con.Open()
drd = cmd.ExecuteReader
ListBox1.Items.Clear()
Do While drd.Read
ListBox1.Items.Add(drd.GetSqlString(0).Value & drd.GetSqlString(1).Value & " " &
drd.GetDateTime(2).Date)
Loop
Me.Show()
If drd.NextResult Then
ListBox1.Items.Add("tabla pagos")
MsgBox("siguiente tabla")
DataGridView1.DataSource = dst.Tables(1)
Do While drd.Read
ListBox1.Items.Add(drd.GetSqlInt32(0).Value & " " & drd.GetSqlString(1).Value & " "
& drd.GetDateTime(2).Date & " " & drd.GetSqlMoney(3).Value & " " &
drd.GetSqlString(4).Value)
Loop
End If
Me.Show()
If drd.NextResult Then
ListBox1.Items.Add("tabla cursos")
MsgBox("siguiente tabla")
DataGridView1.DataSource = dst.Tables(2)
Do While drd.Read
ListBox1.Items.Add(drd.GetSqlString(0).Value & " " & drd.GetSqlString(1).Value & " "
& drd.GetSqlString(2).Value)
Loop
End If
drd.Close()
con.Close()
End Sub
End Class
1.4 RECUPERANDO IMGENES DESDE UNA BASE DE DATOS SQL
Las imgenes son considerados Objetos Binarios grandes mas conocidos como datos
BLOB y se almacenan en un Array de Bytes o caracteres los cuales con recuperados
mediante el mtodo GetBytes del DataReader.
Para recuperar imgenes desde una base de datos de SQL Server realice los siguientes
pasos:
1. Definir el Namespace del proveedor de SQl
Imports System.Data.SqlClient
2. Declarar una variable de tipo SqlConecction pasando como parmetro en el
constructor la cadena de conexin:
Dim con as new sqlConnection(cadena de conexin)

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -401

3. Declarar una variable de tipo SqlCommand pasando como parmetros en el


constructor la instruccin Select y la conexin usada:
Dim cmd as New SqlCommand (Select Lista_Campos From Tabla, con)
4. Abrir la conexin mediante el mtodo Open del objeto de conexin
5. Ejecutar la instruccin mediante el mtodo ExecuteReader pasando como parmetro
CommandBehavior.SequentialAccess y almacenar los datos en objeto de tipo
SqlDataReader
Dim
drd
As
SqlDataReader=cmd.ExecuteReader
(CommandBehavior.SequentialAccess)
Nota.- El parmetro CommnadBehavior:SequentialAccess se usa para ir cargando en
forma secuencial datos grandes conforme se necesitan . Esto es solo es aplicable a
SQLServer; ya que el MS Access los datos BLOB se cargan por completo en el
DataReader
6. Usar el Mtodo Read del SqlDataReader para leer un registro . Este devuelve True si
hay registros y False si no hay registros que leer
Drd.Read()
7. Para recuperar un valor simple del DataReader usar la propiedad Value de los
mtodos GetSql para leer una imagen o dato BLOB usar la propiedad value del
Mtodo GetSqlBinary que devuelve una array de bytes
Dim Valor as Integer = drd.GetSqlInt32(0).Value
Dim Img() as Byte =drd.GetSqlBinary(1).value
Nota.- Cuando usamos el parmetro CommandBehavior .SequentialAccess es necesario
leer en orden los campos de DataReader
8. Declarar una variable de tipo MemoryStream que almacena la imagen en memoria
Dim ms as new MemoryStream
9. Escribir el array de bytes en el flujo de memoria usando el mtodo Write del objeto
Memory Stream:
Ms.Write(img, o, img.Length()
10. Cargar el flujo de memoria en la imagen de algn control como el PictureBox usando
el mtodo FromStream de la clase Image
PicFigura.Image = Image.FromStream(ms)
11. Cerrar el Flujo de memoria abierto usando el mtodo Close:
Ms.Close()
12. Despus de leer todos los registros de DataReader cerrar el objeto con el mtodo
Close
Drd.close()
13. Cerrar la conexin mediante el mtodo Close del objeto Conexin:
Con.Close()
DEMO 43 Recuperar imgenes desde
una base de datos
SqlDataReader y mostrar la imgenes en un PictureBox

usando el objeto

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -402

Cargar una imagen en tiempo de ejecucin


Agreguemos un campo de camino de la foto
Imports system.io
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
PictureBox1.Load("e:\fotos\avion1.bmp")
End Sub
End Class
Mostrar fotos en la base de datos de alumnos

Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)
Dim cmd As New SqlCommand("Select Codalumno,nombrealumno,foto From alumnos",
con)
Dim drd As SqlDataReader
Private Sub MostrarAlumno()
If drd.Read() Then
'Mostrar textos
Try
TextBox1.Text = drd.GetSqlString(0).Value
TextBox2.Text = drd.GetSqlString(1).Value
TextBox3.Text = drd.GetSqlString(2).Value
PictureBox1.Load(" e:\fotos\" & TextBox3.Text & ".bmp")
Catch ex As Exception
MsgBox("error " & ex.Message)
End Try
Else

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -403

MessageBox.Show("No existen mas alumnos", "Fin de archivo",


MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End If
End Sub
Private Sub CargarAlumnos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
con.Open()
drd = cmd.ExecuteReader
MostrarAlumno()
End Sub
Private Sub Cerrar(ByVal sender As Object, ByVal e As
System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
drd.Close()
con.Close()
End Sub
Private Sub btnSiguiente_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnSiguiente.Click
MostrarAlumno()
End Sub
End Class
Nota. Para mostrar las fotos agregue un campo a la tabla alumnos de la siguiente forma

Todos estos comandos tienen la caracterstica de realizar cambios sobre el origen de


datos y no deben retornar registros excepto un valor indicando la cantidad de registros
afectados, por lo que se ejecutan con el mtodo ExecuteNonQuery el objeto Command.
1.1 INSERTANDO REGISTROS
Para insertar registros se usa la instruccin Insert de SQL
1.2 ACTUALIZANDO REGISTROS
Para actualizar registros se usa la instruccin Update de SQL,
1.3 ELIMINANDO REGISTROS
Para eliminar registros se usa la instruccin Delete de SQL
Ejercicio 1. (demo 44) Usando la base de datos alumnos elabore una aplicacin para el
mantenimiento de la tabla alumnos donde se permita agregar, actualizar y eliminar
registros

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -404

Imports System.Data.SqlClient 'Para Usar SqlConnection, SqlCommand,SqlDataReader


Imports System.Text 'Para usar StringBuilder
Imports System.IO 'Para usar StreamWriter
Public Class Form1
Inherits System.Windows.Forms.Form
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)
Dim cmd As New SqlCommand("", con)
Dim stb As New StringBuilder() 'Concatenar datos
Dim reg As Integer 'Numero de Registros Afectados
Dim pc As String 'Nombre de la PC Cliente con error
Private Sub ListarAlumnos()
ListBox1.Items.Clear()
con.Open()
pc = con.WorkstationId
cmd.CommandText = "Select CodAlumno,NombreAlumno,FechaNac From alumnos"
Dim drd As SqlDataReader = cmd.ExecuteReader
Do While drd.Read
stb.Append(drd.GetSqlString(0).ToString.PadRight(5)) REM codalu
stb.Append(drd.GetSqlString(1).ToString.PadRight(25)) REM nombre
stb.Append(drd.GetDateTime(2).ToString.PadRight(30)) REM FechaNaca
ListBox1.Items.Add(stb.ToString)

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -405

stb.Length = 0
Loop
drd.Close()
con.Close()
End Sub
Private Sub GrabarError(ByVal vMensaje As String)
Try
Dim Archivo As New StreamWriter("C:\MISDATOS\ErroresManEmp.txt", True)
Archivo.WriteLine("Fecha y Hora = " & Now.ToString)
Archivo.WriteLine("Cliente = " & pc)
Archivo.WriteLine("Error = " & vMensaje)
Archivo.WriteLine(New String("=", 50))
Archivo.Flush()
Archivo.Close()
Catch ex As Exception
End Try
End Sub
Private Sub CargarAlumnos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
ListarAlumnos()
End Sub
Private Sub MostrarAlumnos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles ListBox1.SelectedIndexChanged
With ListBox1.SelectedItem.ToString
'Mostrar textos
TextBox1.Text = .Substring(0, 5).Trim REM codalu
TextBox2.Text = .Substring(5, 25).Trim REM nombre
TextBox3.Text = .Substring(30, 30).Trim REM FechaNac
End With
End Sub
Private Sub NuevoAlumno(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnNuevo.Click
con.Open()
TextBox1.Clear()
con.Close()
TextBox2.Clear()
TextBox3.Clear()
TextBox2.Focus()
BtnAdicionar.Enabled = True
End Sub
Private Sub AdicionarAlumno(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnAdicionar.Click
Dim nombre1 As String
If TextBox1.Text <> "" And TextBox2.Text <> "" And TextBox3.Text <> "" And
TextBox3.Text <> "" Then
Try
stb.Length = 0
stb.Append("Insert Into Alumnos(codAlumno,nombreAlumno,FechaNac) Values('")
stb.Append(TextBox1.Text)

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -406

stb.Append("','")
stb.Append(TextBox2.Text)
stb.Append("','")
stb.Append(TextBox3.Text)
stb.Append("' )")
nombre1 = stb.ToString
con.Open()
cmd.CommandText = stb.ToString
reg = cmd.ExecuteNonQuery()
If reg <= 0 Then Throw New Exception("No se pudo adicionar el Alumno")
Catch ex As Exception
GrabarError(ex.Message)
MessageBox.Show(ex.Message, ex.Source, MessageBoxButtons.OK,
MessageBoxIcon.Error)
Finally
If con.State = ConnectionState.Open Then con.Close()
stb.Length = 0
ListarAlumnos()
BtnAdicionar.Enabled = False
End Try
End If
End Sub
Private Sub ActualizarAlumno(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnActualizar.Click
Dim nombre As String
If TextBox1.Text <> "" And TextBox2.Text <> "" And TextBox3.Text <> "" And
TextBox3.Text <> "" Then
Try
stb.Length = 0
stb.Append("Update Alumnos Set CodAlumno='")
stb.Append(TextBox1.Text)
stb.Append("',NombreAlumno='")
stb.Append(TextBox2.Text)
stb.Append("',FechaNac='")
stb.Append(TextBox3.Text)
stb.Append("' Where CodAlumno='")
stb.Append(TextBox1.Text)
con.Open()
stb.Append("'")
nombre = stb.ToString
cmd.CommandText = stb.ToString
reg = cmd.ExecuteNonQuery()
If reg <= 0 Then Throw New Exception("No se pudo actualizar el alumno")
Catch ex As Exception
GrabarError(ex.Message)
MessageBox.Show(ex.Message, ex.Source, MessageBoxButtons.OK,
MessageBoxIcon.Error)
Finally

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -407

If con.State = ConnectionState.Open Then con.Close()


stb.Length = 0
ListarAlumnos()
BtnAdicionar.Enabled = False
End Try
End If
End Sub
Private Sub EliminarAlumno(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnEliminar.Click
If TextBox1.Text <> "" Then
Try
stb.Length = 0
stb.Append("Delete From Alumnos Where CodAlumno='")
stb.Append(TextBox1.Text)
stb.Append("'")
con.Open()
cmd.CommandText = stb.ToString
reg = cmd.ExecuteNonQuery()
If reg <= 0 Then Throw New Exception("No se pudo eliminar el alumno")
Catch ex As Exception
GrabarError(ex.Message)
MessageBox.Show(ex.Message, ex.Source, MessageBoxButtons.OK,
MessageBoxIcon.Error)
Finally
If con.State = ConnectionState.Open Then con.Close()
stb.Length = 0
ListarAlumnos()
BtnAdicionar.Enabled = False
End Try
End If
End Sub
End Class
Si no usa string builder puede usar lo siguiente
Dim cadena As String
Do While drd.Read
cadena = cadena + drd.GetSqlString(0).ToString.PadRight(5) +
drd.GetSqlString(1).ToString.PadRight(25) + drd.GetDateTime(2).ToString.PadRight(30)
REM FechaNac
ListBox1.Items.Add(cadena)
cadena = ""
Loop
Recupera 15 caracteres de la posicion 30
TextBox3.Text = .Substring(30, 15).Trim REM FechaNac

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -408

TRABAJANDO EN FORMA DESCONECTADA


1. TRABAJANDO CON EL CONTROL DATA SET
1.1 Clase DataSet
La principal clase del modelo ADO.NET sin duda es el Dataset , que es el repositorio de
datos desconectado , el cual tiene las siguientes caractersticas:
Se encuentra en la memoria del cliente , es decir donde se ejecuta la aplicacin
(Client Side)
Consume bastantes recursos de memoria ya que mantiene cargados todos los
datos
Permite el desplazamiento hacia cualquier direccin
Es actualizable , es decir permite modificar registros
Es enlazable a controles Windows (Binding Windows Controls)
AGREGANDO TABLAS AL DATASET DESDE UNA BASE DE DATOS
Una vez creado el DataSet en necesario crear tablas. Las tablas pueden crearse desde
cero o recuperarlo desde una Base de Datos mediante dataAdapter.
1.2 1 Clase SqlDataAdapter.
El DataAdapter es un objeto conectado, pero que sirve de intermediario entre el origen de
datos y el DatasSet
El DataAdapter se compone de de Objetos Command , cada uno con una tarea especifica
1.2.2 Llenando una Tabla del DataSet mediante el DataAdapter.
.
Para llenar Datos desde una base de datos de SQL , Server en una tabla del DataSet se
usa el mtodo Fill del objeto SqlDataAdapter.
Ejercicio 1 Mostrar la Tabla Pagos en un Datagridview
imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Private Sub ListarAlumnos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim dst As New DataSet
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("Select * From PAGOS", con)
dap.Fill(dst, "PAGOS")
DataGridView1.DataSource = dst.Tables(0)
End Sub
End Class

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -409

Con procedimientos almacenados seria asi


Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Private Sub ListarAlumnos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim CadenaConexion As String = "Data
Source=(LocalDB)\v11.0;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30"
Dim dst As New DataSet
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("PAlumnos1", con)
dap.SelectCommand.CommandText = "PAlumnos1"
dap.Fill(dst, "PAGOS")
DataGridView1.DataSource = dst.Tables(0)
End Sub
End Class

Ejercicio 2 . Mostrar una tabla de Access OLDB


Imports System.Data.OleDb
Public Class Form1
Inherits System.Windows.Forms.Form
Private Sub ListarAlumnos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim CadenaConexion As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data
Source=E:\DATOS\VENDEDORES.accdb"
Dim dst As New DataSet
Dim con As New OleDbConnection(CadenaConexion)
Dim dap As New OleDbDataAdapter("Select * From VENDEDORES", con)
dap.Fill(dst, "VENDEDORES")
DataGridView1.DataSource = dst.Tables(0)
End Sub
End Class

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -410

Ejercicio 2 Mostrar una sentencia SQL ingresada por el teclado


Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Dim CadenaSQL As String
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\SI2011\DATOS\ALUMNOS2.mdf;Integrate
d Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("", con)
Dim dst As New DataSet
Private Sub btnMostrarSQL_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnMostrarSQL.Click
CadenaSQL = TextBox1.Text
dst.Tables.Clear()
dap.SelectCommand.CommandText = CadenaSQL
dap.Fill(dst, "CONSULTA")
DataGridView1.DataSource = dst.Tables(0)
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
TextBox1.Text = "SELECT * FROM PAGOS"
End Sub
End Class

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -411

Pruebe con estas sentencias y otras


SELECT YEAR(fechapago) as ao,SUM(monto) as PAGOTOTAL FROM Pagos GROUP
BY YEAR(FECHAPAGO)
SELECT * FROM PAGOS WHERE CODALUMNO = 'A1'
Ejercicio3 Mostrar varias tablas en un datagrid

El rayado interior se obtiene con alternatebackcolor


CODIGO
Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
' variables a nivel de clase para la manipulacin de datos
Private DataAdapter As SqlDataAdapter
Private DataSet As DataSet
Private Sub frmNormal_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles MyBase.Load
' crear conexin
Dim Conexion As New SqlConnection()
Conexion.ConnectionString = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
' crear adaptadores
Dim DAlumnos As New SqlDataAdapter("SELECT * FROM Alumnos", Conexion)

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -412

Dim DCursos As New SqlDataAdapter("SELECT * FROM Cursos", Conexion)


Dim DPagos As New SqlDataAdapter("SELECT * FROM Pagos", Conexion)
' crear dataset
Dim DataSet As New DataSet()
DAlumnos.Fill(DataSet, "Alumnos")
DCursos.Fill(DataSet, "Cursos")
DPagos.Fill(DataSet, "Pagos")
' asignar dataset a datagrid
Me.DataGrid1.DataSource = DataSet
End Sub
End Class
1.3 AGREGANDO RELACIONES ENTRE TABLAS DATASET
Una DataSet no solo puede contener una tabla sino varias y estos pueden estar
relacionadas . Dicha relacin no es sobre la base de datos, sino sobre el objeto en la
memoria del cliente (el DataSet)
Las relaciones entre tablas del Dataset se usan para garantizar la integridad de datos
(clave fornea) al momento de trabajar con datos en el cliente.
1.3.1 Clase DataRelation
1.3.2 Creando y agregando una Relacin en el DataSet
Para crear una relacin entre dos tablas se usa el objeto DataRelation y para agregarlo al
DataSet se usa el mtodo Add de la coleccin Relations del DataSet:, tal como se precia
en el siguiente modelo de trabajo
7.

Declare una variable de tipo data relation pasando 3 parametros


en el comstructor prmero el nombre del la relacin , segundo las(s) columnas en la
tablas padre y tercero las(s) columnas(s) de la tabla hija

Dim drn as new datarelation(relacion,col_Tabla1, Col_Tabla2)


Nota.- El segundo y tercer parmetro puede ser un solo campo a un arreglo de campos
en el caso de que la clave esta formada por varios campos
8.

Agregar la relacin creada a la coleccin de relaciones del


Dataset mediante el mtodo Add de la colecci Relations:
dst.relatons.Add(drn)
9.
Enlazar la tabla padre a algn control como el datagrid
dgdControl.DatSource=dst.tables(0)
DEMO 46 crear dos tablas en un DataSet, luego crear una relacin entre dichas tablas y
agregar la relacin al DataSet .
Ejercicio 1. Se tiene la base de datos Alumnos que tiene tres tablas Alumnos , pagos y
cursos que tienen la siguiente estructura

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -413

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -414

CODIGO
Imports System.Data.SqlClient
Public Class Form1
Private Sub LitarAlumnosagos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -415

Dim dap As New SqlDataAdapter("", con)


Dim dst As New DataSet()
dap.SelectCommand.CommandText = "Select
CODALUMNO,NOMBREALUMNO,fechanac FROM alumnos"
dap.Fill(dst, "Alumnos")
dap.SelectCommand.CommandText = "Select
NRO,CODALUMNO,FECHAPAGO,MONTO,CODCURSO FROM PAGOS"
dap.Fill(dst, "pagos")
Dim drn As New DataRelation("Alumnos_Pagos", dst.Tables(0).Columns(0),
dst.Tables(1).Columns(1))
dst.Relations.Add(drn)
DataGrid1.DataSource = dst.Tables(0)
DataGrid1.Expand(0)
End Sub
End Class
Modifique y vea
dap.SelectCommand.CommandText = "Select * FROM alumnos;"
dap.Fill(dst, "Alumnos")
dap.SelectCommand.CommandText = "Select * FROM PAGOS"
dap.Fill(dst, "pagos")
Dim drn As New DataRelation("AlumnosPagos", dst.Tables(0).Columns(0),
dst.Tables(1).Columns(2))
Relacion entre la tabla cursos y pagos

Imports System.Data.SqlClient
Public Class Form1
Private Sub LitarAlumnosagos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("", con)
Dim dst As New DataSet()

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -416

dap.SelectCommand.CommandText = "Select
CODALUMNO,NOMBREALUMNO,fechanac FROM alumnos"
dap.Fill(dst, "Alumnos")
dap.SelectCommand.CommandText = "Select
NRO,CODALUMNO,FECHAPAGO,MONTO,CODCURSO FROM PAGOS"
dap.Fill(dst, "pagos")
dap.SelectCommand.CommandText = "Select CODCURSO,
NOMBRECURSO,PROFESOR FROM CURSOS"
dap.Fill(dst, "CURSOS")
Dim drn As New DataRelation("CURSOS_Pagos", dst.Tables(2).Columns(0),
dst.Tables(1).Columns(4))
dst.Relations.Add(drn)
DataGrid1.DataSource = dst.Tables(2)
DataGrid1.Expand(0)
End Sub
End Class
TAREA como obtener la relacion alumnos con cursos, dado un alumno listar que cursos
lleva
Nota
DataGrid1.DataSource = dst.Tables(1) lista la tabla pagos
DataGrid1.DataSource = dst.Tables(0) lista la tabla alumnos
2

TRABAJANDO CON TABLAS

Como ya sabemos el DataSet est compuesto por uno o ms tablas, las cuales pueden
contener registros. En un esquema desconectado todas las operaciones deben realizarse
dentro de las tablas o vistas de una tabla en el DataSet
2.1 Clase DataTable
2.2 Realizando el Mantenimiento de Datos
El Objeto DataTable tiene mtodos que permiten realizar operaciones con los registros
de la tabla, tales como insercin de nuevos registros, actualizacin de datos o eliminacin
de registros.
2.1.1 Insertando Registros en un tabla
Para insertar un nuevo registros en una tabla primero debe crearse un Objeto DataRow
que tenga la estructura de una fila existente de la tabla, la cual se obtiene con el mtodo
NewRow del Objeto DataTable
Luego debe llenarse los datos del DataRow y finalmente agregarse a la coleccin de
Rows del DataTable mediante el mtodo Add.
4 Crear un objeto DataRow que tome la estructura de una fila de la tabla mediante el
mtodo NewRow
Dim drw as datrow= dst.tables(0).NewRow

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -417

5 Llenar los campos del DataRow con los valores deseados , por ejemplo ,para una tabla
con 3 columnas tenemos
Drw(0)= valor1
Drw(1)= valor2
Drw(2)= valor3
3 Finalmente agregar el dataRow a la coleccin de filas de la tabla mediante el
mtodos Add de la coleccin Rows de DataTable
Dst.Tables(0).Add(drw)
2.2.2 Actualizando Registros de una Tabla
Para actualizar un registro existente en una tabla primero debe de seleccionarse la fila
que se desea actualizar creando un objeto DataRow que apunte a dicha fila
Para Empezar la edicin debe usarse el Mtodo BeginInt del DataTable, luego debe
llenarse los datos del DataRow y finalmente debe llamarse al mtodo EndInit
A continuacin presentamos la forma de actualizar un registro de una tabla
4 Crear un objeto DataRow que apunte a la fila de la tabla que se desea modificar
Dim drw as DataRow= dst.tables(0),rows(N)
Nota.- El Prmetro N indica el indice de la fila que se desea modificar
5 Llamar al mtodo BeginInit del DataTable para empezar la edicin de un registro de la
tabla
Dst.tables(0).BeginInt()
6. Actualizar los campos de DataRow con los valores desados , por ejemplo , para una
tabla con 3 columnas tenemos
Drw(0)= valor1
Drw(1)= valor2
Drw(2)= valor3
7. Finalmente llamar al mtodo EndInit del Datatable para finalizar la edicin del registro
de la tabla
Dst.Tables(0).EndInit()
2.2.3. Eliminando Registro de una Tabla
Para eliminar un registro existente de una tabla primero debe de seleccionarse la fila
que se desea eliminar creando un objeto DataRow que apunte a dicha fila. Luego debe
llamarse al mtodo Delete del Objeto DataRow para eliminar dicha fila del DataTable
4 Crear un objeto DataRow que apunte a la fila de la tabla que se desea eliminar
Dim drw as DataRow= dst.Tables(0).Rows(N)
5. finalmente llamar al mtodo Delete del DataRow para elimnar el registro
drw.Delete()
Nota.- En realidad el registro slo se marca para despus ser borrado fsicamente al
enviar cambios desde la tabla hacia la base de datos.
2.3 Actualizando la Base de Datos

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -418

Despus de trabajar en forma desconectada con el DataSet , todos los cambios


realizados a una Tabla deben ser enviados por lotes hacia la base de daos
2.3.1 Creando comandos para enviar cambios
Si los datos de una Tabla fueron obtenidos mediante el mtodo Fill del DataAdapter que
ejecut el Select Command , para que estos cambios sean regresados o enviados hacia
la base de datos se usa el mtodo Update del DataAdapter
Para que se pueda usar el mtodo Update del DataAdapter es necesario que se hayan
creado los objetos (propiedades) InsertCommand, UpdateCommand y DeleteCommand
del DataAdapter,
Existen dos formas de crear dichos comandos en el DataAdapter
1. Manualmente
Consiste en escribir las propiedades CommandText de cada ObjetoCommand del
DataAdapter similar al cdigo escrito
Dap.InsertComand.ComandText =Insert Into Tabla(lista_campos) Values (lista_valores)
Dap.updatecommand.Commadtext(update tabla set campo1=valor1, campo2=valor2,.
Where (expresion lgica)
Dap.Deletecommand.CommadText= delete from tabla where (exp.)
2. Automticamente
Usando el objeto CommandBuilder que se analiza a continuacin
2.3.2 Clase SqlCommandBuilder
El Objeto CommandBuilder se utiliza para generar comandos de actualizacin en forma
automtica
Para esto el CommandBuilder toma el SelectCommand del DataAdapter y crea
automticamente los InsertCommand, UpdateCommand y DeleteCommand
Nota.- El nico inconveniente es que el SelectCommand no puede referirse a varias
tablas el CommandBuilder solo trabaja con una tabla
2.3.3 Enviando loa cambios hacia la base de datos
Para enviar todos los cambios desde la tabla hacia la base de datos se usa el mtodo
Update de DataAdapter
A continuacin presentamos la forma de enviar cambios hacia la base de datos.
1.
Crear una instruccin try.. catch Finally
Try
End Try

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -419

2.

Dentro del Try crear un objeto SqlCommandBuilder pasando como parmetro


el SqlDataAdapter
Dim cbd As New SqlCommandBuilder(dap)
2.
Dentro del Try enviar los cambios usando
el mtodo Update del objeto
SqlDataAdapater pasando como parmetro el DataSet y la tabla
Dap.Update(dst,Tabla)
3.

Dentro de Catch controlar los posibles errores al momento de actualizar usando la


clase Excetion o una clase derivada mas especifica con sqlException
DbConcurrrencyExeption, etc

Catch sqlEex As sql exceptions


Controlar errores de SqL
Catch dvcEx As DbConcurrencyExxeption
Controlar errores de concurrencia de base de datos
Catch genEex As exception
controlar cualquier otro error o errores en general
4.
Dentro de Finally ,actualizar los datos de la tabla del Dataset con los ltimos
cambios realizados en la base de datos , borrando los registros de la tabla y luego
llenndolos nuevamente con el mtodo Fill del SqlDataAdapter
Finally
Dst.Tables(0).Clear()
Dap.Fill(dst,Tabla)
End try
DEMO 47 realizar mantenimiento en una tabla del DataSet y luego enviar los cambios
realizados por lotes (Batch).
Ejercicio 1. Modificar el demo 47 para el caso de los alumnos
1. Agregar el primer formulario y modifique las propiedades de los siguientes controles
Objeto
Form1

Propiedad
Text

DataGridView
Button1

ReadOnly
Name
Tag
Text
Name
Tag
Text
Name
Tag
Text
Name
Text

Button2
Button3
Button4

Valor
Mantenimiento de base de
datos de alumnos
True
BtnNuevo
1
Nuevo
BtnEditar
2
Editar
BtnEliminar
3
Eliminar
BtnEnviarCambios
Enviar cambios

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -420

Agregue un segundo formulario con siguientes propiedades

En botn aceptar en dialog result Ok


En botn cancelar en dialog result Cancel

CODIGO DEL PRIMER FORMULARIO


Imports System.Data.SqlClient

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -421

Public Class Form1


Inherits System.Windows.Forms.Form
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("Select Codalumno,nombrealumno,fechanac From
Alumnos", con)
Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
dap.Fill(dst, "Alumnos")
DataGridView1.DataSource = dst.Tables(0)
End Sub
Private Sub MostrarDetalle(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnNuevo.Click, BtnEditar.Click, BtnEliminar.Click
pos = DataGridView1.CurrentCell.RowIndex
opera = sender.Tag
Dim objMantealumnos As New Form2()
objMantealumnos.ShowDialog()
End Sub
Private Sub EnviarCambios(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnEnviarCambios.Click
Try
Dim cbd As New SqlCommandBuilder(dap)
dap.Update(dst, "Alumnos")
MessageBox.Show("Operacion Realizada", "Aviso", MessageBoxButtons.OK,
MessageBoxIcon.Information)
Catch ex As Exception
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK,
MessageBoxIcon.Error)
Finally
dst.Tables(0).Clear()
dap.Fill(dst, "Alumnos")
DataGridView1.DataSource = dst.Tables(0)
End Try
End Sub
End Class
CODIGO DEL SEGUNDO FORMULARIO
Imports System.Data.SqlClient
Public Class Form2
Inherits System.Windows.Forms.Form
Private Sub LimpiarTextos()
TextBox1.Clear()
TextBox2.Clear()
TextBox3.Clear()
End Sub

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -422

Private Sub MostrarEmpleado()


With dst.Tables(0).Rows(pos)
TextBox1.Text = .Item(0)
TextBox2.Text = .Item(1)
TextBox3.Text = .Item(2)
End With
End Sub
Private Sub MostrarDatos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
If opera = Module1.Operacion.Nuevo Then
Me.Text = "Adicionar un alumno"
GroupBox1.Enabled = True
LimpiarTextos()
ElseIf opera = Module1.Operacion.Editar Then
Me.Text = "Actualizar un alumno"
GroupBox1.Enabled = True
MostrarEmpleado()
ElseIf opera = Module1.Operacion.Eliminar Then
Me.Text = "Eliminar un alumno"
GroupBox1.Enabled = False
MostrarEmpleado()
End If
End Sub
Private Sub Aceptar(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles BtnAceptar.Click
With dst.Tables(0)
Dim fila As DataRow
If opera = Module1.Operacion.Nuevo Then
fila = .NewRow
fila(0) = TextBox1.Text
fila(1) = TextBox2.Text
fila(2) = TextBox3.Text
.Rows.Add(fila)
ElseIf opera = Module1.Operacion.Editar Then
.BeginInit()
fila = .Rows(pos)
fila(0) = TextBox1.Text
fila(1) = TextBox2.Text
fila(2) = TextBox3.Text
.EndInit()
ElseIf opera = Module1.Operacion.Eliminar Then
fila = .Rows(pos)
fila.Delete()
End If
End With
End Sub
End Class
CODIGO DEL MODULO

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -423

Module Module1
Public dst As New DataSet()
Public pos As Integer
Public opera As Operacion
Public Enum Operacion
Nuevo = 1
Editar = 2
Eliminar = 3
End Enum
End Module
NOTA
pos = DataGridView1.CurrentCell.RowIndex
pos = DataGrid1.CurrentRowIndex
pos = DataGridView1.CurrentRow.Index
APLICACION PARA DIFERENCIAR MODO CONECTADO DEL DESCONECTADO
MENU MODO CONECTADO EN MODO CONSOLA Y MODO
FORMULARIO

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -424

CODIGO DEL MODULO 2


Module Module2
Sub listar()
conn.Open()
Console.WriteLine("Conneccion ABIERTA.")
comando.CommandText = sqlqry
Console.WriteLine(": Numero de alumnos {0}", comando.ExecuteScalar())
comando.CommandText = " SELECT * FROM ALUMNOS"
rdr = comando.ExecuteReader
Console.WriteLine("Ejecutando sentencia {0}", comando.CommandText)
nrocol = rdr.FieldCount
While (rdr.Read)
For i = 0 To nrocol - 1
Console.Write("{0}
", rdr.GetValue(i).ToString.PadRight(10))
Next
Console.WriteLine()
End While
conn.Close()
End Sub
Sub modificar()
conn.Open()
Console.WriteLine("Ingrese el codigo del alumno a modificar")
codalumno = Console.ReadLine()
Console.WriteLine("Ingrese el NUEVO NOMBRE del alumno a modificar")
nombrealumno = Console.ReadLine()
Console.WriteLine("Ingrese el NUEVA fecha de nacimiento '1/'1/1988'")
FechaNac = Console.ReadLine()
comando.CommandText = " UPDATE ALUMNOS SET NOMBREALUMNO ='" &
nombrealumno & " ', FECHANAC=' " & FechaNac & "' WHERE CODALUMNO ='" &
codalumno & " ' "
Console.WriteLine("Ejecutando sentencia {0}", comando.CommandText)
comando.ExecuteNonQuery()
conn.Close()
End Sub
Sub agregar()
conn.Open()
Console.WriteLine("Ingrese el codigo del alumno a Agregar")
codalumno = Console.ReadLine()
Console.WriteLine("Ingrese NOMBRE del alumno a insertar")
nombrealumno = Console.ReadLine()
Console.WriteLine("Ingrese fecha de nacimiento '1/'1/1988'")
FechaNac = Console.ReadLine()
comando.CommandText = " INSERT INTO ALUMNOS
( Codalumno,nombrealumno,fechanac) values ('" & codalumno & "' , '" & nombrealumno &
"' , '" & FechaNac & "')"
Console.WriteLine("Ejecutando sentencia {0}", comando.CommandText)

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -425

comando.ExecuteNonQuery()
conn.Close()
End Sub
Sub eliminar()
conn.Open()
Console.WriteLine("Ingrese el codigo del alumno a eliminar")
codalumno = Console.ReadLine()
comando.CommandText = " DELETE FROM ALUMNOS WHERE CODALUMNO = '"
& codalumno & "' "
Console.WriteLine("Ejecutando sentencia {0}", comando.CommandText)
comando.ExecuteNonQuery()
comando.CommandText = " INSERT INTO ALUMNOS
( Codalumno,nombrealumno,fechanac) values ('" & codalumno & "' , '" & nombrealumno &
"' , '" & FechaNac & "')"
conn.Close()
End Sub
End Module
CODIGO DEL MODULO 1
Imports System.Data.SqlClient
Module Module1
Public cadenaconexion As String = " Data
Source=(LocalDB)\v11.0;AttachDbFilename=E:\Datos\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30"
Public conn As SqlConnection = New SqlConnection(cadenaconexion)
Public sqlqry As String = "select count(*) from alumnos"
Public Opcion As Integer
Public codalumno As String
Public nombrealumno As String
Public FechaNac As String
Public comando As SqlCommand = New SqlCommand(sqlqry, conn)
Public rdr As SqlDataReader
Public nrocol As Integer
Public i As Integer
Sub Main()
Try
Do
Console.WriteLine(" 1. listar 2. modificar 3 Agregar 4 Eliminar 5 salir ")
Console.WriteLine(" Ingrese opcion ")
Opcion = Console.ReadLine()
Select Case Opcion
Case 1
listar()
Case 2
modificar()
Case 3
agregar()

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -426

Case 4
eliminar()
End Select
Loop Until Opcion = 5
Catch ex As SqlException
Console.WriteLine(ex)
Finally
conn.Close()
Console.WriteLine("Conneccion cerrada.")
End Try
Console.ReadLine()
End Sub
End Module
CODIGO DEL FORMULARIO
Public Class Form1
Private Sub BtnListar_Click(sender As Object, e As EventArgs) Handles BtnListar.Click
conn.Open()
comando.CommandText = " SELECT * FROM ALUMNOS"
rdr = comando.ExecuteReader
nrocol = rdr.FieldCount
Dim cadena As String
cadena = ""
For i = 0 To nrocol - 1
cadena = cadena + rdr.GetName(i) + vbTab
Next
ListBox1.Items.Add(cadena)
' cadena = ""
While (rdr.Read)
cadena = ""
For i = 0 To nrocol - 1
cadena = cadena + rdr.GetValue(i) + vbTab
Next
ListBox1.Items.Add(cadena)
Console.WriteLine()
End While
conn.Close()
End Sub
Private Sub BtnAgregar_Click(sender As Object, e As EventArgs) Handles
BtnAgregar.Click
Try
conn.Open()
codalumno = txtCodAlumno.Text
nombrealumno = txtNombre.Text
FechaNac = TxtFechaNac.Text

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -427

comando.CommandText = " INSERT INTO ALUMNOS


( Codalumno,nombrealumno,fechanac) values ('" & codalumno & "' , '" & nombrealumno &
"' , '" & FechaNac & "')"
comando.ExecuteNonQuery()
conn.Close()
MsgBox(" se agrego registro en forma satisfactoria")
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Private Sub BtnEditar_Click(sender As Object, e As EventArgs) Handles BtnEditar.Click
Try
conn.Open()
codalumno = txtCodAlumno.Text
nombrealumno = txtNombre.Text
FechaNac = TxtFechaNac.Text
comando.CommandText = " UPDATE ALUMNOS SET NOMBREALUMNO ='" &
nombrealumno & " ', FECHANAC=' " & FechaNac & "' WHERE CODALUMNO ='" &
codalumno & " ' "
comando.ExecuteNonQuery()
MsgBox("ACTUALIZACION SATISFACTORIA")
Catch ex As Exception
MsgBox(ex.Message)
End Try
conn.Close()
End Sub
Private Sub btnEliminar_Click(sender As Object, e As EventArgs) Handles
btnEliminar.Click
Try
conn.Open()
codalumno = txtCodAlumno.Text
comando.CommandText = " DELETE FROM ALUMNOS WHERE CODALUMNO
= '" & codalumno & "' "
comando.ExecuteNonQuery()
conn.Close()
MsgBox(" eliminacion satisfactoria")
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
End Class
MENU MODO DESCONECTADO

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -428

CODIGO DEL MODULO 2


Imports System.Data.SqlClient
Imports System.IO
Module Module2
Sub Listar()
dt = ds.Tables("alumnos")
Dim fila, col As Integer
nreg = ds.Tables(0).Rows.Count
ncol = ds.Tables(0).Columns.Count
Console.WriteLine(" nombre de la tabla {0} ", dt.TableName)

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -429

For col = 0 To ncol - 1


Console.Write(" {0} ", dt.Columns(col).ColumnName)
Next
Console.WriteLine()
For fila = 0 To nreg - 1
For col = 0 To ncol - 1
Console.Write(" {0} ", dt.Rows(fila).Item(col))
Next
Console.WriteLine()
Next
End Sub
Sub basededatos()
Try
da.SelectCommand.CommandText = "SELECT * FROM ALUMNOS "
da.Fill(ds, "ALUMNOS")
dt = ds.Tables("alumnos")
Do
Console.WriteLine(" 1. listar 2. modificar 3 Agregar 4 Eliminar 5 Enviar Cambios 6
salir ")
Console.WriteLine(" Ingrese opcion ")
Opcion = Console.ReadLine()
Select Case Opcion
Case 1
Listar()
Case 2 ' modificar
Console.WriteLine("Ingrese la fila de la tabla a modificar")
Pos = Console.ReadLine
Console.WriteLine("Ingrese codigo de alumno a modifcar ")
codalumno = Console.ReadLine()
Console.WriteLine("Ingrese NOMBRE del alumno a insertar")
nombrealumno = Console.ReadLine()
Console.WriteLine("Ingrese fecha de nacimiento '1/'1/1988'")
FechaNac = Console.ReadLine()
ds.Tables(0).Rows(Pos).Item(0) = codalumno
ds.Tables(0).Rows(Pos).Item(1) = nombrealumno
ds.Tables(0).Rows(Pos).Item(2) = FechaNac
Case 3 ' adicionar
Console.WriteLine("Ingrese el codigo del alumno a Agregar")
codalumno = Console.ReadLine()
Console.WriteLine("Ingrese NOMBRE del alumno a insertar")
nombrealumno = Console.ReadLine()
Console.WriteLine("Ingrese fecha de nacimiento '1/'1/1988'")
FechaNac = Console.ReadLine()
filaReg = dt.NewRow()
filaReg("Codalumno") = codalumno
filaReg(1) = nombrealumno
filaReg(2) = FechaNac
dt.Rows.Add(filaReg)

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -430

Case 4
Console.WriteLine("Ingrese la fila a eliminar")
Pos = Console.ReadLine
filaReg = ds.Tables(0).Rows(Pos)
filaReg.Delete()
Case 5
conn.Open()
Dim cbd As New SqlCommandBuilder(da)
da.Update(ds, "alumnos")
conn.Close()
End Select
Loop Until Opcion = 6
Catch ex As SqlException
Console.WriteLine(ex)
Finally
conn.Close()
Console.WriteLine("Conneccion cerrada.")
End Try
Console.ReadLine()
End Sub
Public Sub RecuperarDeMatriz(ByVal nombrearchivo As String, ByRef A(,) As String,
ByRef nf As Integer, ByVal nc As Integer)
Dim srLector As StreamReader
srLector = New StreamReader(nombrearchivo)
Dim fila As Integer = 0, col As Integer
Dim cadena As String = ""
Dim subcadena As String
Dim pos As Integer = 0
Dim inicio As Integer = 1
cadena = srLector.ReadLine()
' recupera a partir de la segunda fila
cadena = srLector.ReadLine()
Do While Not (cadena Is Nothing)
cadena = cadena & Chr(9)
inicio = 1
For col = 0 To nc - 1
pos = InStr(inicio, cadena, Chr(9))
subcadena = Mid(cadena, inicio, pos - inicio)
A(fila, col) = subcadena
inicio = pos + 1
Next
fila = fila + 1
cadena = srLector.ReadLine()
Loop
nf = fila
Console.WriteLine("Archivo leido satisfactoriamente")
srLector.Close()
End Sub

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -431

Sub ObtenerdeMatriz(A(,) As String, nf As Integer, nc As Integer)


Dim fila As Integer
Dim cbd As New SqlCommandBuilder(da)
Console.WriteLine(" nombre de la tabla {0} ", ds.Tables(0).TableName)
Dim fila1 As DataRow
For fila = 0 To nreg - 1
fila1 = ds.Tables(0).NewRow
fila1(0) = A(fila, 0)
fila1(1) = A(fila, 1)
fila1(2) = (A(fila, 2))
ds.Tables(0).Rows.Add(fila1)
Next
End Sub
Sub MostraMatriz(A(,) As String, nf As String, nc As String)
Dim fila, col As Integer
For fila = 0 To nf - 1
For col = 0 To nc - 1
Console.Write("{0}{1}", A(fila, col), vbTab)
Next
Console.WriteLine()
Next
End Sub
Sub grabar(NombreArchivo As String)
Dim fila, col As Integer
Dim Archivo As StreamWriter
Archivo = New StreamWriter(NombreArchivo)
Try
nreg = ds.Tables(0).Rows.Count
ncol = ds.Tables(0).Columns.Count
For col = 0 To ncol - 1
Archivo.Write("{0}{1}", ds.Tables(0).Columns(col).ColumnName, vbTab)
Next
Archivo.WriteLine()
For fila = 0 To nreg - 1
For col = 0 To ncol - 1
Archivo.Write("{0}{1}", ds.Tables(0).Rows(fila).Item(col), vbTab)
Next
Archivo.WriteLine()
Next
MsgBox("Grabado satisfactoriamente")
Archivo.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
End Module

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -432

CODIGO DEL MODULO 1


Imports System.Data.SqlClient
Module Module1
Public maxfilas As Integer = 10
Public maxcol As Integer = 5
Public cadenaconexion As String = " Data
Source=(LocalDB)\v11.0;AttachDbFilename=E:\Datos\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30"
Public conn As SqlConnection = New SqlConnection(cadenaconexion)
Public Opcion As Integer, Pos As Integer
Public codalumno As String
Public nombrealumno As String
Public FechaNac As String
Public ncol As Integer = 3
Public fila, col As Integer
Public da As SqlDataAdapter = New SqlDataAdapter("", conn)
Public ds As DataSet = New DataSet
Public dt As DataTable = New DataTable
Public filaReg As DataRow
Public nreg As Integer = 10
Public nombrearchivo As String = "E:\datos\alumnos1.txt"
Public A(maxfilas, maxcol) As String
Sub Main()
basededatos()
'RecuperarDeMatriz(nombrearchivo, A, nreg, ncol)
'MostraMatriz(A, nreg, ncol)
'ObtenerdeMatriz(A, nreg, ncol)
'Listar()
Console.ReadLine()
End Sub
End Module
CODIGO DEL FORMULARIO
Imports System.Data.SqlClient
Public Class Form1
Private Sub MostrarAlumno()
txtCodigo.Text = ds.Tables(0).Rows(Pos).Item(0)
txtNombre.Text = ds.Tables(0).Rows(Pos).Item(1)
TxtFechaNac.Text = ds.Tables(0).Rows(Pos).Item(2)
lblCont.Text = (Pos).ToString & " de " & ds.Tables(0).Rows.Count
End Sub
Private Sub btnListar_Click(sender As Object, e As EventArgs) Handles btnListar.Click
da.SelectCommand.CommandText = "SELECT * FROM ALUMNOS "
da.Fill(ds, "ALUMNOS")
DataGridView1.DataSource = ds.Tables(0)

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -433

End Sub
Private Sub btnenviar_Click(sender As Object, e As EventArgs) Handles btnenviar.Click
Try
conn.Open()
Dim cbd As New SqlCommandBuilder(da)
da.Update(ds, "alumnos")
conn.Close()
MsgBox("MODIFICACION CORRECTA")
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Private Sub btnEliminar_Click(sender As Object, e As EventArgs) Handles
btnEliminar.Click
Try
Dim res As Integer
Pos = DataGridView1.CurrentCell.RowIndex
MostrarAlumno()
'
Pos = InputBox("Ingrese la fila a eliminar", "INGRESO", 2)
res = MsgBox("Realmente desea eliminar s/n", MsgBoxStyle.OkCancel)
If res = 1 Then
filaReg = ds.Tables(0).Rows(Pos)
filaReg.Delete()
MsgBox("ELIMINACION CORRECTA")
Else
MsgBox("Eliminacion cancelada ")
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Private Sub btnEditar_Click(sender As Object, e As EventArgs) Handles btnEditar.Click
'
Pos = DataGridView1.CurrentRow.Index
Dim res As Integer
res = MsgBox("Realmente desea modificar s/n", MsgBoxStyle.OkCancel)
If res = 1 Then
codalumno = txtCodigo.Text
nombrealumno = txtNombre.Text
FechaNac = TxtFechaNac.Text
ds.Tables(0).Rows(Pos).Item(0) = codalumno
ds.Tables(0).Rows(Pos).Item(1) = nombrealumno
ds.Tables(0).Rows(Pos).Item(2) = FechaNac
MsgBox("Modificacion realizada ")
Else
MsgBox("Modificacion cancelada ")
End If
End Sub
Sub Limpiar()

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -434

txtCodigo.Text = ""
txtNombre.Text = ""
TxtFechaNac.Text = ""
txtCodigo.Focus()
End Sub
Private Sub btnAgregar_Click(sender As Object, e As EventArgs) Handles
btnAgregar.Click
Try
codalumno = txtCodigo.Text
nombrealumno = txtNombre.Text
FechaNac = TxtFechaNac.Text
filaReg = ds.Tables(0).NewRow()
filaReg(0) = codalumno
filaReg(1) = nombrealumno
filaReg(2) = FechaNac
ds.Tables(0).Rows.Add(filaReg)
MsgBox("SE AGREGO CORRECTAMENTE")
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Private Sub btnNuevo_Click(sender As Object, e As EventArgs) Handles btnNuevo.Click
Limpiar()
End Sub
Private Sub DataGridView1_CellClick(sender As Object, e As
Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
Pos = DataGridView1.CurrentRow.Index
MostrarAlumno()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
da.SelectCommand.CommandText = "SELECT * FROM ALUMNOS"
da.Fill(ds, "ALUMNOS")
DataGridView1.DataSource = ds.Tables(0)
End Sub
Private Sub EliminarTodoToolStripMenuItem_Click(sender As Object, e As EventArgs)
Handles EliminarTodoToolStripMenuItem.Click
With ds.Tables(0)
Dim fila As Integer
Dim filareg As DataRow
nreg = ds.Tables(0).Rows.Count
For fila = 0 To nreg - 1
filareg = ds.Tables(0).Rows(fila)
filareg.Delete()
Next
MsgBox("Operacion Realizada")
End With

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -435

End Sub
Private Sub Simular(sender As Object, e As EventArgs) Handles
SimularToolStripMenuItem.Click
Dim i As Integer
With ds.Tables(0)
Dim fila As DataRow
For i = 0 To maxfilas - 1
fila = .NewRow
fila(0) = "A" & i
fila(1) = "Nombre " & i
fila(2) = "1/1/2001"
.Rows.Add(fila)
Next
DataGridView1.DataSource = ds.Tables(0)
MsgBox("Operacion Realizada")
End With
End Sub
Private Sub mnuGrabarEnArchivo_Click(sender As Object, e As EventArgs) Handles
mnuGrabarEnArchivo.Click
SaveFileDialog1.ShowDialog()
nombrearchivo = SaveFileDialog1.ShowDialog
grabar(nombrearchivo)
End Sub
Private Sub RecuperarMatriz_Click(sender As Object, e As EventArgs) Handles
mnuRecuperarMatriz.Click
OpenFileDialog1.ShowDialog()
nombrearchivo = OpenFileDialog1.ShowDialog
RecuperarDeMatriz(nombrearchivo, A, nreg, ncol)
ObtenerdeMatriz(A, nreg, ncol)
DataGridView1.DataSource = ds.Tables(0)
End Sub
Private Sub frmNormal_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles MyBase.Load
da.Fill(ds, "Alumnos")
DataGridView1.DataSource = ds.Tables(0)
Call MostrarAlumno()
End Sub
Private Sub MoverRegistro(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnPrimero.Click, BtnAnterior.Click, BtnSiguiente.Click,
BtnUltimo.Click
Select Case sender.text
Case "<<"

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -436

Pos = 0
Case "<"
If Pos > 0 Then Pos = Pos - 1
Case ">"
If Pos < ds.Tables(0).Rows.Count - 1 Then Pos = Pos + 1
Case ">>"
Pos = ds.Tables(0).Rows.Count - 1
End Select
DataGridView1.CurrentCell = DataGridView1.Rows(Pos).Cells(0)
MostrarAlumno()
End Sub
End Class
5.

TRABAJANDO CON VISTAS.

Para realizar ciertas operaciones en el cliente no se puede hacer sobre toda la tabla , es
mejor crear una vista de datos
Las vistas son usadas para diversa tareas tales como
Filtrar o seleccionar registros de acuerdo a un criterio
Ordenar datos por uno o ms columnas
Buscar datos por un cierto campo clave
Actualizar datos de la tabla ya sea adicionando editando o eliminando registros ,etc
Clase DataView
Manejando Datos en una Vista
Creando una vista
La Vista se crea a partir de los datos de una tabla , mediante la propiedad DefaultView del
objeto DataTable que devuelve un Objeto DataView tal como se muestra en le siguiente
cdigo
Dim dvw As DataView =dst.Tables(n).DefaultView
Nota.- N Indica el ndice de la tabla de la cual se desea generar una vista
Por ejemplo para crear una vista de productos tenemos
Dim dvw As DataView =dst.tables(productos).DefaultView
Filtrando datos en una vista
Una vez creado la vista se puede filtrar datos de esta , es decir seleccionar ciertos
registros de acuerdo a un criterio de seleccin
Para filtrar registros de una vista se usa la propiedad RowFilter del objeto DataView. Tal
como se muestra en le siguiente cdigo
Dvw.RowFilter = criterio de seleccin

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -437

Nota: El Criterio de Seleccin es una instruccin SQL similar a la usada en la clusula


Where.
Por ejemplo para ver una vista de productos cuyo cdigo de categora es 1 y cuyo cdigo
de Proveedor es 2 tenemos Dvw.RowFilter= CategoryId =1 and SuplierId=2
Ejercicio 1. La siguiente aplicacin obtiene el nmero de registro actual y lo muestra en
un cuadro de texto adems muestra los valores de los dems campos en un cuadro de
lista, al presionar el botn btnPosicionar posiciona el indicador de registro en el registro
indicado en el cuadro de texto

Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim dst As New DataSet()
Dim fila As Integer, col As Integer
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("Select CODALUMNO,
NOMBREALUMNO,FECHANAC From Alumnos", con)
Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
dap.Fill(dst, "Alumnos")
DataGridView1.DataSource = dst.Tables(0)
End Sub
Private Sub DataGrid1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Handles DataGridView1.Click
Fila = DataGridView1.CurrentCell.RowIndex

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -438

col = DataGridView1.CurrentCell.ColumnIndex
TextBox1.Text = fila
TextBox2.Text = col
ListBox1.Items.Clear()
ListBox1.Items.Add("COALU ==>" & dst.Tables(0).Rows(fila).Item(0))
ListBox1.Items.Add("NOMBRE ==>" & dst.Tables(0).Rows(fila).Item(1))
ListBox1.Items.Add("FECHANAC ==>" & dst.Tables(0).Rows(fila).Item(2))
End Sub
Private Sub PosicionarRegistro(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnPosicionar.Click
fila = Val(TextBox1.Text)
col = Val(TextBox2.Text)
DataGridView1.CurrentCell = DataGridView1(col, fila)
Dim drw As DataRow = dst.Tables(0).Rows(fila)
ListBox1.Items.Clear()
ListBox1.Items.Add("COALU ==>" & dst.Tables(0).Rows(fila).Item(0))
ListBox1.Items.Add("NOMBRE ALUMNO ==>" & dst.Tables(0).Rows(fila).Item(1))
ListBox1.Items.Add("FECHANAC ==>" & dst.Tables(0).Rows(fila).Item(2))
End Sub
End Class
Nota necesariamente debe haber un campo clave
Se se usa datagrid

DataGrid1.CurrentRowIndex = pos

Ejercicio 2. Disear un formulario similar a la siguiente se mueve el cursor a una fila


especificada y la aplicacin permite modificar y eliminar registros

CODIGO DEL FORMULARIO


Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -439

Dim CadenaConexion As String = "Data


Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS1.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Public dst As New DataSet()
Public pos As Integer
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("SELECT CODALUmno,
NOMBREalumno,FECHANAC From Alumnos", con)
Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
dap.Fill(dst, "ALUMNOS")
DataGridView1.DataSource = dst.Tables(0)
End Sub
Private Sub DataGridview_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Handles DataGridView1.Click
pos = DataGridView1.CurrentCell.RowIndex
TextBox4.Text = pos
TextBox1.Text = dst.Tables(0).Rows(pos).Item(0)
TextBox2.Text = dst.Tables(0).Rows(pos).Item(1)
TextBox3.Text = dst.Tables(0).Rows(pos).Item(2)
End Sub
Private Sub Editar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnEditar.Click
Dim drw As DataRow = dst.Tables(0).Rows(pos)
dst.Tables(0).BeginInit()
drw(0) = TextBox1.Text
drw(1) = TextBox2.Text
drw(2) = TextBox3.Text
dst.Tables(0).EndInit()
End Sub
Private Sub BtnEnviarDatos_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnEnviarDatos.Click
Try
Dim cbd As New SqlCommandBuilder(dap)
dap.Update(dst, "ALUMNOS")
MessageBox.Show("Operacion Realizada", "Aviso", MessageBoxButtons.OK,
MessageBoxIcon.Information)
Catch ex As Exception
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK,
MessageBoxIcon.Error)
Finally
dst.Tables(0).Clear()
dap.Fill(dst, "ALUMNOS")
DataGridView1.DataSource = dst.Tables(0)
End Try
End Sub
Private Sub Eliminar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnEliminar.Click

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -440

Dim drw As DataRow = dst.Tables(0).Rows(pos)


drw.Delete()
End Sub
Private Sub btnAgregar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnAgregar.Click
Dim fila As DataRow
fila = dst.Tables(0).NewRow
fila(0) = TextBox1.Text
fila(1) = TextBox2.Text
fila(2) = TextBox3.Text
dst.Tables(0).Rows.Add(fila)
End Sub
End Class
DEMO 49. filtrar registros en un vista por un campo de tipo cadena de caracteres.
Se tiene la base de datos Alumnos que tiene la siguiente estructura

La tabla alumnos tiene los siguientes datos

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -441

LA TABLA CURSOS TIENE LOS SIGUIENTES DATOS

LA TABLA PAGOS TIENE LOS SIGUIENTES DATOS

Ejercicio1 (Modificacin Demo 49) Filtrar los registros de la tabla PAGOS por el campo
cdigo de alumno

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -442

CODIGO
Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Private dvw As DataView
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("Select CodAlumno ,NombreAlumno From Alumnos",
con)
Dim dst As New DataSet()
Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
dap.Fill(dst, "ALUMNOS")
With ComboBox1
.DataSource = dst.Tables(0)
.DisplayMember = "NombreAlumno"
.ValueMember = "CodAlumno"
End With
dap.SelectCommand.CommandText = "Select
nro,fechaPago,codAlumno,Monto,Codcurso from Pagos"
dap.Fill(dst, "PAGOS")
dvw = dst.Tables(1).DefaultView
DataGridView1.DataSource = dvw
End Sub
Private Sub FiltrarPorAlumno(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Try
dvw.RowFilter = "CodAlumno ='" & ComboBox1.SelectedValue & "'"
Catch ex As Exception
'MsgBox(ex.Message)
End Try
End Sub
End Class
Nota : se podria filtrar tambien usando solo sentencias sql

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -443

Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("Select CodAlumno ,NombreAlumno From Alumnos",
con)
Dim dst As New DataSet()
Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
dap.Fill(dst, "ALUMNOS")
With ComboBox1
.DataSource = dst.Tables(0)
.DisplayMember = "NombreAlumno"
.ValueMember = "CodAlumno"
End With
dap.SelectCommand.CommandText = "Select * from Pagos"
dap.Fill(dst, "PAGOS")
DataGridView1.DataSource = dst.Tables(1)
End Sub
Private Sub FiltrarPorAlumno(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Try
dst.Tables(1).Clear()
dap.SelectCommand.CommandText = "Select * from Pagos where CodAlumno ='"
& ComboBox1.SelectedValue & "'"
dap.Fill(dst, "PAGOS")
DataGridView1.DataSource = dst.Tables(1)
Catch ex As Exception
End Try
End Sub
End Class
Ejercicio 2. Filtrar por cdigo de curso
Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Private dvw As DataView
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("Select CodCurso,NombreCurso From Cursos", con)
Dim dst As New DataSet()

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -444

Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles MyBase.Load
dap.Fill(dst, "CURSOS")
With ComboBox1
.DataSource = dst.Tables(0)
.DisplayMember = "NombreCurso"
.ValueMember = "CodCurso"
End With
dap.SelectCommand.CommandText = "Select * from Pagos"
dap.Fill(dst, "PAGOS")
dvw = dst.Tables(1).DefaultView
DataGridView1.DataSource = dvw
End Sub
Private Sub FiltrarPorCurso(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Try
dvw.RowFilter = "CodCurso ='" & ComboBox1.SelectedValue & "'"
Catch ex As Exception
'MsgBox(ex.Message)
End Try
End Sub
End Class

Ejercicio 3 Filtrar por un campo numerico en este caso monto

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -445

Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Private dvw As DataView
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\SI2011B\DATOS\ALUMNOS.mdf;Integrate
d Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("Select CodAlumno ,Monto From Pagos", con)
Dim dst As New DataSet()
Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
dap.Fill(dst, " pagos1")
With ComboBox1
.DataSource = dst.Tables(0)
.DisplayMember = "Monto"
.ValueMember = "Monto"
End With
dap.SelectCommand.CommandText = "Select
nro,fechaPago,codAlumno,Monto,Codcurso from Pagos"
dap.Fill(dst, "PAGOS")
dvw = dst.Tables(1).DefaultView
DataGridView1.DataSource = dvw
End Sub
Private Sub FiltrarPorAlumno(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Try
dvw.RowFilter = "Monto =" & ComboBox1.SelectedValue
Catch ex As Exception
'MsgBox(ex.Message)
End Try
End Sub
End Class
3.2.3 ORDENANDO DATOS EN UNA VISTA
Para ordenar datos en la vista debemos usar la propiedad Sort del Objeto DataView
especificando el campo por el cual se desea realizar la ordenacin y opcionalmente
indicando en cada campo el tipo de ordenacin , que puede ser ascendente o
descendente tal como se muestra en el siguiene cdigo
dvw.Sort Campo1 [Asc|Desc] campo2 [Asc|Desc]
Nota: Por defecto si no se especifica el tipo de ordenacin , esta es ascendente
Ejemplo Ordenar la vista de productos por codigo categoria en forma ascedente y si
coinciden ordenar por codigo del proveedor en forma descendente
dws.sort= CategoryID Asc,SuplierID Desc
3.2.4 Buscando Datos en la vista

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -446

Para buscar datos en la vista primero sta debe estar ordenada por el campo por el cual
se desea buscar, luego debemos usar el mtodo Find del objeto DataView pasando
como parametro el dato a buscar tal como se muestra en el siguiente codigo
Dim pos as integer = dvw.Find(dato)
Nota: El Mtodo Find devuelve un entero indicando la posicin del registro en la vista .
Si devuelve un nmero mayor o igual que el cero es que se encontr el dato ; si
devuelve -1 significa que el dato no se encuentra en dicho campo
Ejemplo Para buscar el codigo cuyo producto es 1 tenemos
dww.Sort productoID
Dim pos As integer =dvw.Find(1)
DEMO 50 ordenar y buscar datos usando una vista de datos creada a partir de una tabla .
La bsqueda se realiza por un campo numrico y por y por otro de tipo cadena de
acaracteres, para los cual los datos de la vista deben estar previamente ordenados
Ejercicio 1. Ordenando los alumnos por su codigo y luego buscar por ese campo
La tabla debe tener la siguiente estructura

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -447

CODIGO DEL FORMULARIO


Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Dim dvw As New DataView()
Dim npos As Integer
Dim codigo As String
Dim dst As New DataSet()
Private Sub LlenarDatos()
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS1.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("Select CodAlumno,Nombrealumno,FechaNac from
alumnos", con)
dst = New DataSet
dap.Fill(dst, "Alumnos")
dvw = dst.Tables(0).DefaultView
End Sub
Private Sub EnlazarDatos()
DataGridView1.DataSource = dvw
End Sub
Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
LlenarDatos()
EnlazarDatos()
End Sub
Private Sub OrdenarPorCodigo_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles OrdenarPorCodigo.Click
dvw.Sort = "CodALumno Asc"
End Sub
Private Sub OrdenarPorNombre_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles OrdenarPorNombre.Click
dvw.Sort = "Nombrealumno Asc, FechaNac Desc"
End Sub
Private Sub BuscarPorCodigo_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BuscarPorCodigo.Click
dvw.Sort = "CodALumno Asc"
codigo = InputBox("ingrese codigo")
Dim drw() As DataRow = dvw.Table.Select("Codalumno Like '" & codigo & "'")
If drw.Length > 0 Then
DataGridView1.Rows(npos).Selected = False
npos = dvw.Find(drw(0)(0))
DataGridView1.Rows(npos).Selected = True
DataGridView1.CurrentCell = DataGridView1(0, npos)
TextBox1.Text = dvw.Table.Rows(npos).Item(0)
TextBox2.Text = dvw.Table.Rows(npos).Item(1)

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -448

TextBox3.Text = dvw.Table.Rows(npos).Item(2)
End If
End Sub
Private Sub BuscarPorNombre_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BuscarPorNombre.Click
Dim nombre1 As String
dvw.Sort = "Nombrealumno Asc"
nombre1 = InputBox("ingrese Nombre")
Dim drw() As DataRow = dvw.Table.Select("Nombrealumno Like '" & nombre1 & "%'")
If drw.Length > 0 Then
DataGridView1.Rows(npos).Selected = False
npos = dvw.Find(drw(0)(1))
DataGridView1.Rows(npos).Selected = True
DataGridView1.CurrentCell = DataGridView1(0, npos)
TextBox1.Text = dvw.Table.Rows(npos).Item(0)
TextBox2.Text = dvw.Table.Rows(npos).Item(1)
TextBox3.Text = dvw.Table.Rows(npos).Item(2)
End If
End Sub
End Class
Ejercicio en la tabla pagos buscar por nro de registro y codalumno ( Use el control
datagrid)
Imports System.Data.SqlClient
Public Class Form2
Inherits System.Windows.Forms.Form
Dim dvw As New DataView()
Dim npos As Integer
Dim pos As Integer
Private Sub LlenarDatos()
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("Select * from PAGOS ", con)
Dim dst As New DataSet()
dap.Fill(dst, "pagos")
dvw = dst.Tables(0).DefaultView
End Sub
Private Sub EnlazarDatos()
DataGrid1.DataSource = dvw
End Sub
Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
LlenarDatos()
EnlazarDatos()
npos = 1

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -449

End Sub
Private Sub OrdenarPorNro_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles OrdenarPorNro.Click
dvw.Sort = "Nro Asc"
End Sub
Private Sub OrdenarPorCodalumno_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles OrdenarPorCodalumno.Click
dvw.Sort = "CodAlumno Asc"
End Sub
Private Sub BuscarPorNro_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BuscarPorNro.Click
dvw.Sort = "Nro Asc"
pos = InputBox("ingrese nro de registro")
DataGrid1.UnSelect(npos)
npos = dvw.Find(pos)
DataGrid1.Select(npos)
DataGrid1.CurrentRowIndex = npos
End Sub
Private Sub BuscarCodalumno_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BuscarPorCodalumno.Click
Dim nombre1 As String
dvw.Sort = "CodAlumno Asc"
nombre1 = InputBox("ingrese Codalumno")
Dim drw() As DataRow = dvw.Table.Select("Codalumno = '" & nombre1 & "'")
If drw.Length > 0 Then
DataGrid1.UnSelect(npos)
npos = dvw.Find(drw(0)(1))
DataGrid1.Select(npos)
DataGrid1.CurrentRowIndex = npos
End If
End Sub
End Class
4. TRABAJANDO CON CONTROLES ENLAZADOS A DATOS
4.1 ENLAZANDO CONTROLES A DATOS
Cuando trabajamos con aplicaciones que manejan datos , stos se presentan en pantalla
mediante dos formas
Leyendo cada registro del repositorio de datos y mostrndolo en controles
Enlazando datos del repositorio de datos a los controles
El repositorio de datos puede ser un DataReader en un esquema conectado o una tabla
o vista en un esquema desconectado.
En la primera tcnica en cada momento hay que estar leyendo del repositorio de datos y
mostrando sobre controles simples como etiquetas o cuadros de texto o sobre controles
complejos como las listas o el DataGrid

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -450

En la segunda tcnica slo una vez se realiza el enlace de datos y se muestra sobre
controles simples o complejos
Creando enlace simple
Se llama enlace simple porque se enlaza un campo de un repositorio de datos, que puede
ser una tabla o vista del Dataset a un control individual , que puede ser cualquiera de los
siguientes controles

Una etiqueta (Label) o cuadro de texto (TextBox) en el caso de ser un campo


numrico, texto o de fecha y hora
Un botn de opcin (RadioButton) o cuadro de verificacin (CheckBox) en caso de ser
un campo lgico
Un cuadro de Imagen(PictureBox) en el caso de ser un campo con Imagen

Para crear un enlace simple sobre un control se usa el metodo Add de la coleccin
DataBidings que es una propiedad de cada control simple, pasando tres parmetros.
Nombre de la propiedad del control donde se mostrar el valor del campo, por
ejemplo , si es un control textbox debe ser la porpiedad Text si un control
CheckBox debe ser la propiedad Checked
Repositorio de datos donde se encuentra el campo, ste puede ser un DataSet , un
DataTable o un DataView.
Nombre del campo de repositorio de datos que se va a enlazar sobre el control
simple.
En resumen la sintaxis de un enlace simple queda como sigue:
ControlSimple.DatBinding.Add(Propiedad,repositorio,Campo)
Por ejemplo para enlazar el campo ProductName de una vista de productos dvw a un
cuadro de texto llamado txtNombre se tiene:
TxNombre.DataBinding.Add(text,dvw,ProductName)
EJERCICIO CREANDO ENLACE SIMPLE
Private Sub EnlazarDatos()
TextBox1.DataBindings.Add("Text", dvw, "Nombre")
End Sub
Creando enlace Complejo
Se llama enlace complejo porque se enlaza todos los campos de un repositorio de datos ,
que puede ser una tabla o vista del DataSet a un control que puede ser cualquiera de los
siguientes controles

Un cuadro de lista (ListBox) o lista desplegable(ComboBox), por defecto se podr


trabajar slo con dos campos: uno que se ve (Display Member) y otro que se oculta
(ValueMember).

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -451

Una rejilla de datos (DataGrid) el cual si mostrar todos los campos e inclusive
puede ocultar algunos como veremos mas adelante.

Para crear un enlace complejo sobre un control se puede hacer de dos formas
Configurar sus propiedades DataSource
especificando el DataSet
DataMember el nombre de la tabla , tal como se muestra debajo;
Controlcomplejo.Datasource= dst
Controlcomplejo:DataMember= tabla
ControlComplejo.DataSource=dst.Tables(N)

y en

Nota: Tambin podemos realizar el enlace directamente configurando en la propiedad


DataSource la tabla del DataSet
Configure el mtodo SetDataBinding pasando como parmetros el Dataset y el
nombre de la tabla a enlazar
ControlCOmplejo.SetDatBinding(dst,Tabla)
DEMO 51 enlazar el control DataGrid a tablas de un dataSet usando el mtodo
SetDataBinding, tambin se apreciar como se sincronizan dos tablas realcionadas en
dos DataGrid
Ejercicio 1. Modificar el demo 51 para el caso de los alumnos

Imports System.Data.SqlClient
Public Class Form3
Inherits System.Windows.Forms.Form
Private Sub EnlazarAlumnoPago(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS2.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("", con)
Dim dst As New DataSet()
dap.SelectCommand.CommandText = "Select CodAlumno,NombreAlumno,FechaNac
From Alumnos"
dap.Fill(dst, "Alumnos")

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -452

dap.SelectCommand.CommandText = "Select
Nro,Codalumno,Fechapago,Monto,CodCurso From pagos"
dap.Fill(dst, "Pagos")
DataGrid1.DataSource = dst.Tables(0)
DataGrid2.DataSource = dst.Tables(1)
Dim drn As New DataRelation("Relacion", dst.Tables(0).Columns(0),
dst.Tables(1).Columns(1))
dst.Relations.Add(drn)
DataGrid1.SetDataBinding(dst, "Alumnos")
DataGrid2.SetDataBinding(dst, "Alumnos.Relacion")
End Sub
End Class
Ejecutar con datagridview
4.2 DESPLAZAMIENTO EN CONTROLES ENLAZADOS A DATOS
4.2.1 Usando desplazamiento manual
En realidad para usar el dezplazamiento manual no es necesario que los controles se
enlacen a una tabla o vista de datos, sino que la tcnica consiste en leer cada registro e
ir mostrndolo cada vez que se realiza el desplazamiento.
Para usar el desplazamiento manual por uan vista realice los siguientes pasos:
1. Definir un objeto de tipo DataView para la vista de datos
Dim dvw As DataView
2. Definir una variable de tipo entero que guarde la posicin del registros actual o
registro que se desea moastrar
Dim pos as integer
3. Crear un procedimiento general que permita mostrar los datos del registro actual en
controles simples
Private Sub MostrarDatos()
Control1.text = dvw(pos)(0)
Control2.text= dvw(pos)(1)
Control2.text= dvw(pos)(2)
ControlPosicion.Text = (pos + 1).ToString & " de " & dvw.Count
End Sub
Nota: En el cdigo anterior tambin mostramos la posicin la cual empieza en 0, pero
para el usuario empieza en 1, es por eso la suma de 1
4 En el evento Load del formulario llenar los datos de la vista y llamar al procedimiento
que muestra los datos del registro actual
Escribir antes del codigo para conectarse y llenar datos en una tabla
Dwn= dst.Tables(0).DefaultView
MostrarDaos()
Nota: Al llamar por primera vez al procedimiento el valor de la variable pos es por
defecto cero, lo que permitir mostrar los datos del primer registro de la vista.
5. Para mostrar el primer registro de la vista configurar el valor de la variable pos en 0 y
llamar al procedimiento que presenta los datos.

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -453

Pos =0
Mostrardatos()
6. Para mostrar el registro anterior al actual, primero verficar que no estamos sobre el
primer registro, si se cumple esta condicin disminuir en 1 el valor de la variable pos y
llamar al procedimiento que presenta los datos
If pos A 0 then
Pos = pos-1
MostrarDatos()
End if
Nota:- Si no incorporamos la condicin y retrocedieramos se genera una Excepcin al
tratar de leer una posicin negativa en la vista y mostrarla sobre el control en el
procedimietno MostrarDatos
7. Para mostrar el siguiente registro al actual , primero verificar que no estemos
sobre el ltimo regisro, si se cumple rsta condicin aumentar en 1 el valor de la
variable pos y llamar al procedimeitno que presenta los datos
If pos < dwn.Count-1 then
Pos =pos +1
MostrarDatos
End if
Nota:- Si no incorporamos la condicin y avanzariamos se genera una Excepcin al tratar
de leer una posicin inexistente en la vista y mostrarla sobre el control en el
procedimietno MostrarDatos
8. Para mostrar el ltimo registro de la vista configurar el valor de la variable pos en el
indice del ltimo regitro y llamar al procedimeitno que presenta los datos
Pos =dvw.count-1
MostrarDatos()
DEMO 52 presentar datos desde una vista en forma manual, es decir leyendo cada
registro de la vista y mostrndolo sobre controles simples ( no enlazados)
Ejercicio 1 modificar el demo 52 para el caso de los alumnos

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -454

CODIGO DEL FORMULARIO


Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Dim cadenaconexion = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS1.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim Conexion As New SqlConnection(cadenaconexion)
Dim DAlumnos As New SqlDataAdapter("SELECT * FROM Alumnos", Conexion)
Dim DataSet As New DataSet()
Dim pos As Integer
Private Sub frmNormal_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles MyBase.Load
DAlumnos.Fill(DataSet, "consulta")
Me.DataGridView1.DataSource = DataSet.Tables(0)
Call MostrarDatos()
End Sub
Private Sub MostrarDatos()
TextBox1.Text = DataSet.Tables(0).Rows(pos).Item(0)
TextBox2.Text = DataSet.Tables(0).Rows(pos).Item(1)
TextBox3.Text = DataSet.Tables(0).Rows(pos).Item(2)
lblCont.Text = (pos).ToString & " de " & DataSet.Tables(0).Rows.Count
End Sub
Private Sub MoverRegistro(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnPrimero.Click, BtnAnterior.Click, BtnSiguiente.Click,
BtnUltimo.Click
Select Case sender.Tag
Case "1"
pos = 0
Case "2"
If pos > 0 Then pos = pos - 1
Case "3"
If pos < DataSet.Tables(0).Rows.Count - 1 Then pos = pos + 1
Case "4"
pos = DataSet.Tables(0).Rows.Count - 1
End Select
DataGridView1.CurrentCell = DataGridView1.Rows(pos).Cells(0)
MostrarDatos()
End Sub
End Class
Usando desplazamiento manual con el control datgridview
Reemplace
DataGrid1.CurrentRowIndex = pos
Con
DataGridView1.CurrentCell = DataGridView1(0, pos)
4.2.2 Usando Desplazamiento Automtico

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -455

En versiones anteriores de ADO la clase recordset vena con mtodos (MoveFirst,


MoveLast, MovePrevius, MoveNext y Move) que permitin el desplazamiento en registros
y por tanto se visualizabana en controles enlazados.
En cambo en ADO.NET existe unobjeto llamdo CurrencyManager que permite realizar el
desplazamiento en Controles Windows enlazados a datos
Para usar el desplazamiento automtico con el CurrencyManager por una vista realice
los siguientes pasos.
1. Definir un objeto de tipo DataView para la vista de datos:
Private dvw as Dataview
2. Definir un Objeto currencyManager que permite el desplazamiento
Private cmr As CurrencyManager
3. Crear un procedimiento general que permite enlazar los datos del registro actual en
controles simples usando el metodo Add de la coleccin DataBinding de cada control
Private sub enlazarDatos()
Control1.DataBinding.Add(Text,dvw, campo1)
Control1.DataBinding.Add(Text,dvw, campo2)
Control1.DataBinding.Add(Text,dvw, campo3
End Sub
4. En el evento Load del formulario llenar los datos de la vista ,llamar al procedimiento
que enlaza los datos y asociar los controles enlazados a la vista al CurrencyManager
mediante el mtodo BindingContext el formulario.
Escribir antes el cdigo para conectarse y llenar datos en una tabla
dvw= dst. Tables(0).DefaultView
EnlazarDatos()
cmr= Me.BindingContext(dvw)
Nota: El Mtodo BindingContext detecta todos los controles en el formulario que
estn enlazados a la vista para que sean manejados a travs del CurrencyManager.
5. Para ir alprimer registro
de la vista configure la propiedad Position
del
CurrencyManager en 0
cmr.Position=0
6. Para ir al registro anerior primero verificar que no estemos sobre el primer registro, si
se cumple esta condicin disminuir en 1 el valor de la propiedad Position del
CurrencyManager
If cmr.Position > 0 then cmr.Position =cmr.Position -1
7. Para ir al siguiente registro primero verificar que no estemos sobre el ltimo registro si
se cumple esta condicin aumentar en 1 el valor de la proiedad Position del
CurrencyManger
If cmr.Position < cmr.count-1 then cmr.Position =cmr.Position +1
8. Par ir al ltimo registro de la vista configurar el valor de la propiedad Position del
CurrencyManager en la ltima posicin de la vista
Cmr.Position=cmr.Count-1
DEMO 53 Esta demostracion tiene por objetivo ensear a enlazar datos de un vista a
controles simples y realizar el desplazamiento en forma automtica
usando el
CurrencyManager

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -456

Ejercicio 1. Modificar el demo 53 para el caso de la BD Alumnos

Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Private dvw As DataView
Private WithEvents cmr As CurrencyManager
Private Sub EnlazarDatos()
TextBox1.DataBindings.Add("Text", dvw, "CodAlumno")
TextBox2.DataBindings.Add("Text", dvw, "NombreAlumno")
TextBox3.DataBindings.Add("Text", dvw, "FechaNac")
cmr = Me.BindingContext(dvw)
End Sub
Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS1.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("", con)
Dim dst As New DataSet()
dap.SelectCommand.CommandText = "Select codAlumno,NombreAlumno,fechaNac
From alumnos"
dap.Fill(dst, "Alumnos")
dvw = dst.Tables(0).DefaultView
DataGridView1.DataSource = dst.Tables(0)
EnlazarDatos()
lblCont.Text = cmr.Position + 1 & " de " & cmr.Count
End Sub
Private Sub MoverRegistro(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnPrimero.Click, BtnAnterior.Click, BtnSiguiente.Click,
BtnUltimo.Click

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -457

Select Case sender.Tag


Case "1"
cmr.Position = 0
Case "2"
If cmr.Position > 0 Then cmr.Position = cmr.Position - 1
Case "3"
If cmr.Position < cmr.Count - 1 Then cmr.Position = cmr.Position + 1
Case "4"
cmr.Position = cmr.Count - 1
End Select
DataGridView1.CurrentCell = DataGridView1.Rows(cmr.Position).Cells(0)
End Sub
Private Sub MostrarPosicion(ByVal sender As Object, ByVal e As System.EventArgs)
Handles cmr.PositionChanged
lblCont.Text = cmr.Position + 1 & " de " & cmr.Count
End Sub
End Class
Ejercicio 2. Buscar por el nombre de alumno

CODIGO DEL FORMULARIO


Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Private dvw As New DataView()
Private npos As Integer
Private cmr As CurrencyManager
Private Sub LlenarDatos()
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS1.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("Select * From Alumnos", con)
Dim dst As New DataSet()

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -458

dap.Fill(dst, "Alumnos")
dvw = dst.Tables(0).DefaultView
DataGridView1.DataSource = dst.Tables(0)
End Sub
Private Sub EnlazarDatos()
DataGridView1.DataSource = dvw
cmr = Me.BindingContext(dvw)
End Sub
Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
LlenarDatos()
EnlazarDatos()
End Sub
Private Sub BuscarPorNombre_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnBuscarPorNombre.Click
dvw.Sort = "NombreAlumno"
Dim pos As Integer
DataGridView1.CurrentRow.Selected = True
Dim drw() As DataRow = dvw.Table.Select("NombreAlumno Like '" & TextBox1.Text &
"%'")
If drw.Length > 0 Then
pos = dvw.Find(drw(0)(1))
If pos > -1 Then
cmr.Position = pos
'DataGridView1.Select(pos)
npos = pos
End If
End If
End Sub
End Class
Nota. Se pinta el registro seleccionado
1.3 FORMATEANDO CONTROLES ENLAZADOS A DATOS
1.3.1 Formatenado Controles simples
Cuando enlazamo datos a controles , muchas veces queremos que los datos se
presentan con un cierto formato, por ejemplo nmeros con decimales o smboles de
moneda
Para formatear un campo de control enlazado a datos realice los siguiente:
1 Definir el Nameespace para trabajar con la enumeracin NumberStyles
Imports Systems.Globalization
2. Crear un procedimiento que convierta el numero decimal a cadena
Private Sub FormtearDecimalAstring(ByVal sender As Object ,
convertEventArg)
C.value=Format(c.value,#,00)
End sub

ByVal

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -459

3. Crear un procedimiento que convierta la cadena a un nmero decimal


Private Sub ParsearStringADecimal(ByVal sender As Object ,
ConvertEventArg)
c.value= Decimal.Parse(c.value, NumberStyles.Currency)
End Sub

ByVal

c As

4 crear un objeto de la clase Binding que representa un enlace simple entre el valor de
la propiedad de un objeto (un campo de la vista) y el valor de la propiedad de un
control(Texto)
Dim ObjEnlace as New Binding(text,dvw,campo)
5 Crear dos manejadores de eventos en tiempo de ejecucin , uno para el evento Format
y otro para el evento Parse del objeto de enlace (Binding):
AddHandler.ObjEnlace.Format.AddressOf FormatearDecimalAString
AddHandler.ObjEnlace.Parse .AddressOf ParsearStringADecimal
Observaciones:
El evento Format del Objeto Binding se produce cuando la propiedad de un control
est enlazado a un valor de datos.
El Evento Parse del objeto Bindig se produce cuando cambia el valor de un control
enlazado a datos
6 Aadir al objeto de enlace sencillo creado a la coleccin de enlaces del control donde
se desea dar formato
Control.DataBinding .Add(ObjEnlace)
7 Finalmente crear el objeto CurrencyManager que apunte a todos los controles del
formulario enlazado a la vista
cmr= Me.BindngContext(dvw)
DEMO 55 formatear controles con enlace simple especificamente aprenderemos a dar
formato decimal a un nmero de un campo enlazado a un control simple
Ejercicio 1. Modificar el demo 55 para el caso de los alumnos

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -460

Imports System.Data.SqlClient
Imports System.Globalization
Public Class Form1
Inherits System.Windows.Forms.Form
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Private dvw As DataView
Private WithEvents cmr As CurrencyManager
Private Sub FormatearDecimalAString(ByVal sender As Object, ByVal c As
ConvertEventArgs)
c.Value = Format(c.Value, "#.00")
End Sub
Private Sub ParsearStringADecimal(ByVal sender As Object, ByVal c As
ConvertEventArgs)
c.Value = Decimal.Parse(c.Value, NumberStyles.Currency)
End Sub
Private Sub FormatearFechaaCadena(ByVal sender As Object, ByVal c As
ConvertEventArgs)
c.Value = Format(c.Value, DateAndTime.DateString)
End Sub
Private Sub EnlazarDatos()
TextBox1.DataBindings.Add("Text", dvw, "Nro")
TextBox2.DataBindings.Add("Text", dvw, "CodAlumno")
TextBox3.DataBindings.Add("text", dvw, "FechaPago")
TextBox4.DataBindings.Add("text", dvw, "Monto")
Dim pre As New Binding("Text", dvw, "Monto")
AddHandler pre.Format, AddressOf FormatearDecimalAString
AddHandler pre.Parse, AddressOf ParsearStringADecimal
TextBox4.DataBindings.Add(pre)
cmr = Me.BindingContext(dvw)
End Sub
Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim con As New SqlConnection(CadenaConexion)
Dim dap As New SqlDataAdapter("", con)
Dim dst As New DataSet()
dap.SelectCommand.CommandText = "Select Nro , FechaPago, Codalumno,
Monto,Codcurso FechaNac From Pagos"
dap.Fill(dst, "Pagos")
dvw = dst.Tables(0).DefaultView
DataGrid1.DataSource = dst.Tables(0)
EnlazarDatos()
Label4.Text = cmr.Position + 1 & " de " & cmr.Count
End Sub
Private Sub MoverRegistro(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnPrimero.Click, BtnAnterior.Click, BtnSiguiente.Click,
BtnUltimo.Click
Select Case sender.Tag

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -461

Case "1" :
cmr.Position = 0
Case "2":
If cmr.Position > 0 Then cmr.Position = cmr.Position - 1
Case "3":
If cmr.Position < cmr.Count - 1 Then cmr.Position = cmr.Position + 1
Case "4":
cmr.Position = cmr.Count - 1
End Select
DataGrid1.CurrentRowIndex = cmr.Position
End Sub
Private Sub MostrarPosicion(ByVal sender As Object, ByVal e As System.EventArgs)
Handles cmr.PositionChanged
Label4.Text = cmr.Position + 1 & " de " & cmr.Count
End Sub
End Class
Como formatear campo fecha
4.3.2 FORMATEANDO EL DATAGRID
El Control Datagrid quiz see el control ms usado en las plicaciones Windows para
presentar datos en un tabla , vista o estructura matricial, pero por defecto ya viene con un
formato o estiilo predefinido
Hay tres aspectos del formato del Control DataGrid que son:

Definir propiedades para establecer un estilo predeteminado con el que mostrar los
datos
Personalizar el modo en que se muestran determinadas tablas en tiempo de ejecucin
Modificar las columnas que se muestran en el DataGrid asi como los colores y otros
aspecto del formato mostrado
El Primer tipo de formato , se logra configurando propiedades en tiempo de diseo y los
otros dos se logran en tiempo de ejecucin mediante cdigo.
Clase DataGrid
Para ambos caso necesitamos conocer los miembros de la clase Datagrid que
describiremos a continuacin
Ejercicio 1. Modificacin del demo 56 formateara al DataGrid para el caso de los alumnos

Imports System.Data.SqlClient

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -462

Public Class Form1


Inherits System.Windows.Forms.Form
Private dvw As DataView
Private cboProveedor As New ComboBox()
Private c3 As New DataGridTextBoxColumn()
Private Sub FormatearDataGrid()
Dim dts As New DataGridTableStyle()
dts.MappingName = dvw.Table.TableName
Dim c1 As New DataGridTextBoxColumn()
c1.MappingName = "Nro"
c1.HeaderText = "Nro"
c1.ReadOnly = True
c1.TextBox.BackColor = Color.Red
c1.TextBox.ForeColor = Color.Green
c1.Width = 40
dts.GridColumnStyles.Add(c1)
Dim c2 As New DataGridTextBoxColumn()
c2.TextBox.BackColor = Color.GreenYellow
c2.TextBox.ForeColor = Color.Gold
c2.MappingName = "FechaPago"
c2.HeaderText = "FechaPago"
c2.Width = 100
dts.GridColumnStyles.Add(c2)
c3.MappingName = "CodALumno"
c3.HeaderText = "CodALumno"
c3.Width = 40
c3.TextBox.BackColor = Color.Goldenrod
c3.TextBox.ForeColor = Color.DarkGreen
dts.GridColumnStyles.Add(c3)
Dim c4 As New DataGridTextBoxColumn()
c4.MappingName = "Monto"
c4.HeaderText = "Monto"
c4.Alignment = HorizontalAlignment.Right
c4.Format = "c4"
c4.Width = 80
dts.GridColumnStyles.Add(c4)
Dim c5 As New DataGridTextBoxColumn()
c5.MappingName = "CodCurso"
c5.HeaderText = "CodCurso"
c5.Width = 60
dts.GridColumnStyles.Add(c5)
DataGrid1.TableStyles.Add(dts)
End Sub
Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\SI2011B\DATOS\ALUMNOS.mdf;Integrate
d Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -463

Dim dap As New SqlDataAdapter("", con)


Dim dst As New DataSet()
dap.SelectCommand.CommandText = "Select CodAlumno,NombreAlumno
,FechaNac from alumnos"
dap.Fill(dst, "Alumnos")
dap.SelectCommand.CommandText = "Select
nro,fechaPago,codalumno,Monto,codcurso from pagos"
dap.Fill(dst, "Pagos")
dvw = dst.Tables(1).DefaultView
With ComboBox1
.DataSource = dst.Tables(0)
.DisplayMember = "NombreAlumno"
.ValueMember = "CodAlumno"
End With
DataGrid1.DataSource = dvw
FormatearDataGrid()
End Sub
Private Sub FiltrarPorAlumno(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Try
dvw.RowFilter = "CodALumno = '" & ComboBox1.SelectedValue & "'"
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
End Class
Elaborar la aplicacion

Ejercicio de datagridview elaborar una aplicacin como la mostrada

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -464

Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Dim cadenaconexion = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS1.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim Conexion As New SqlConnection(cadenaconexion)
Dim DAlumnos As New SqlDataAdapter("SELECT * FROM Alumnos", Conexion)
Dim DataSet As New DataSet()
Private Sub frmNormal_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles MyBase.Load
DAlumnos.Fill(DataSet, "consulta")
DataGridView1.DataSource = DataSet.Tables(0)
End Sub
Private Sub Btnformatear_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Btnformatear.Click
'DataGridView1.Columns(1).DefaultCellStyle.Font
Dim cellStyle As New DataGridViewCellStyle
Dim fila As Integer
cellStyle.Font = New Font("ARIAL", 11, FontStyle.Bold)
Me.DataGridView1.ColumnHeadersDefaultCellStyle = cellStyle
DataGridView1.DefaultCellStyle.Font = New Font("ARIAL", 10)
DataGridView1.Columns(1).DefaultCellStyle.Font = New Font("ARIAL Black", 10)
For fila = 0 To DataSet.Tables(0).Rows.Count - 1
DataGridView1.Rows(fila).Cells(0).Style.BackColor = Color.FromArgb(0, 255, 0)
DataGridView1.Rows(fila).Cells(1).Style.BackColor = Color.FromArgb(255, 255, 0)
DataGridView1.Rows(fila).Cells(2).Style.BackColor = Color.FromArgb(0, 255, 255)
DataGridView1.Rows(fila).Cells(0).Style.ForeColor = Color.FromArgb(255, 0, 0)
Next
End Sub
End Class
EJERCICIO CON BINDING NAVIGATOR

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -465

Vea las propiedades del control BidingNavegator en enlace controles

Enlazando el control datagrid

Objeto
BindingNavigato
r
DataGridView

propiedad
DataSource

Valor
TbAlumnosBindingSource

DataSource

TbAlumnosBindingSource

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -466

Ejemplo mostrar el elemento de la fila y columna determinada

Imports System.Data.SqlClient
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim connstring As String = "Data Source=.\sqlexpress;Integrated
Security=True;database=alumnos"

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -467

Dim sql As String = "SELECT * FROM PAGOS "


Dim conn As SqlConnection = New SqlConnection(connstring)
Try
conn.Open()
Dim cmd As SqlCommand = New SqlCommand(sql, conn)
Dim da As SqlDataAdapter = New SqlDataAdapter(sql, conn)
Dim ds As DataSet = New DataSet
da.Fill(ds, "pagos")
Dim dt As DataTable = ds.Tables("pagos")
DataGridView1.DataSource = ds.Tables(0)
Dim row As DataRow
ListBox1.Items.Add("Nombre de la consulta:" & sql)
ListBox1.Items.Add("nombre de la tabla: " & ds.Tables(0).ToString)
ListBox1.Items.Add("Numero de filas: " & ds.Tables(0).Rows.Count)
ListBox1.Items.Add("numero de columnas: " & ds.Tables(0).Columns.Count)
ListBox1.Items.Add("nombre de la primera columna: " &
ds.Tables(0).Columns(0).ColumnName)
ListBox1.Items.Add("tipo de dato de la primera columna: " &
ds.Tables(0).Columns(0).DataType.ToString)
ListBox1.Items.Add(" elemnto de la tercera fila y segunda columna " &
ds.Tables(0).Rows(2).Item(1))
Catch ex As Exception
ListBox1.Items.Add("Error Occurred:" & ex.ToString)
Finally
conn.Close()
End Try
End Sub
End Class
Obtener esquema

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -468

Imports System.Data.SqlClient
Public Class Form1
Private Sub btnEsquema_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnEsquema.Click
Dim Conexion As New SqlConnection()
Conexion.ConnectionString = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim DataSet As New DataSet()
' crear adaptadores de datos para las tablas
' y aadir cada tabla al dataset con el adaptador
Dim DataAdapter As SqlDataAdapter
DataAdapter = New SqlDataAdapter("SELECT * FROM ALUMNOS", Conexion)
DataAdapter.Fill(DataSet, "alumnos")
DataAdapter = Nothing
DataAdapter = New SqlDataAdapter("SELECT * FROM CURSOS", Conexion)
DataAdapter.Fill(DataSet, "CURSOS")
DataAdapter = Nothing
DataAdapter = New SqlDataAdapter("SELECT * FROM PAGOS", Conexion)
DataAdapter.Fill(DataSet, "PAGOS")
DataAdapter = Nothing
' crear un objeto tabla y columna para mostrar
' la informacin del esquema que el dataset contiene
Dim DataTable As DataTable
Dim DataColumn As DataColumn
Me.ListBox1.Items.Add("Estructura del DataSet")
' recorrer la coleccin de tablas del DataSet
For Each DataTable In DataSet.Tables
Me.ListBox1.Items.Add("Tabla: " & DataTable.TableName)
' recorrer la coleccin de columnas de la tabla
For Each DataColumn In DataTable.Columns
Me.ListBox1.Items.Add("Campo: " & _
DataColumn.ColumnName & " --- " & _
"Tipo: " & DataColumn.DataType.Name)
Next
Next
End Sub
End Class
Configurar un control combobox

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -469

Public Class Form1


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
'TODO: esta lnea de cdigo carga datos en la tabla 'ALUMNOSDataSet.ALUMNOS'
Puede moverla o quitarla segn sea necesario.
Me.ALUMNOSTableAdapter.Fill(Me.ALUMNOSDataSet.ALUMNOS)
'TODO: esta lnea de cdigo carga datos en la tabla 'ALUMNOSDataSet.PAGOS'
Puede moverla o quitarla segn sea necesario.
Me.PAGOSTableAdapter.Fill(Me.ALUMNOSDataSet.PAGOS)
End Sub
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
ListBox1.Items.Clear()
ListBox1.Items.Add("SelectedValue " & ComboBox1.SelectedValue)
ListBox1.Items.Add("SelectedIndex " & ComboBox1.SelectedIndex)
ListBox1.Items.Add("Text " & ComboBox1.Text)
ListBox1.Items.Add(" ValueMember " & ComboBox1.ValueMember)
ListBox1.Items.Add(" DisplayMember " & ComboBox1.DisplayMember)
End Sub
End Class
Los nombres y fechas de nacimiento pueden ser en forma aleatorio
C.VALUE=FORMAT(C.VALUE,M/d/yy) probar esto

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -470

En el siguiente ejrcicio el codigo del alumno se selecciona de un combobox

Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\datos\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(CadenaConexion)
Private Sub BtnmostrarSQL_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnmostrarSQL.Click
Dim dst As New DataSet
Dim cadena As String
cadena = TextBox2.Text
Dim CADENASQL As String
CADENASQL = " SELECT * FROM PAGOS WHERE CODALUMNO='" &
TextBox2.Text & "'"
TextBox1.Text = CADENASQL
Dim dap As New SqlDataAdapter(cadenasql, con)
dap.Fill(dst, "PAGOS")
DataGridView1.DataSource = dst.Tables(0)
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim dst As New DataSet
Dim NREG As Integer
Dim dap As New SqlDataAdapter("SELECT * FROM ALUMNOS ", con)
dap.Fill(dst, "ALUMNOS")
DataGridView1.DataSource = dst.Tables(0)
NREG = dst.Tables(0).Rows.Count
For I = 0 To NREG - 1
ComboBox1.Items.Add(dst.Tables(0).Rows(I).Item(0))
Next
End Sub

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -471

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object,


ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Dim cadena As String
cadena = ComboBox1.Items(ComboBox1.SelectedIndex).ToString()
TextBox2.Text = cadena
Dim dst As New DataSet
Dim CADENASQL As String
CADENASQL = " SELECT * FROM PAGOS WHERE CODALUMNO='" &
TextBox2.Text & "'"
TextBox1.Text = CADENASQL
Dim dap As New SqlDataAdapter(CADENASQL, con)
dap.Fill(dst, "PAGOS")
DataGridView1.DataSource = dst.Tables(0)
End Sub
End Class
Propuestas de trabajo de investigacin
Los trabajos tienen que ser en modo visual . se deben presentar en grupos de 3
1. Aplicacin de fractales y recursividad
2. Aplicacin de autmatas celulares y computacin universal. Juego de la vida en 2d
y 3D
3. Aplicacin del programa del buscador en optimizacin en modo grafico
4. Manejo del puerto USB
5. Programacin de ADN manejo de secuencias cadenas
6. Programacin genrica plantillas ( Templates)
7. Base de datos biolgica
8. Aplicacin 3d en opengl y visual estudio 2010, Simulacin 3D
9. Aplicaciones Web Lenguaje HTML, Java, etc. y su importancia
10. Temas de inteligencia artificial como programacin evolutiva , redes neuronales,etc
11. Sistemas de informacin en Office Excel
12. My sql
13. Automatizacin industrial plc, sensores,
14. Aplicaciones de sistemas de informacin para optimizacin
15. Simulacin 3d, ejemplo simio.etc
16. Programacin en Windows. Uso de otros controles como por ejemplo el Microsoft
char
17. Programacin genrica plantillas ( Templates)
18. Seguridad de base de datos en sqlserver
19. Otros temas relacionados al curso de sistemas de informacin
20. 21 realizar un programa de animacin ejemplo un barquito que pasa y no borra el
fondo

Demostracin del uso de BindingSource y BindingNavigator

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -472

Para ello, crearemos un proyecto nuevo e insertaremos un control BindingSource y un


control BindingNavigator dentro del formulario.
Tambin insertaremos un control TextBox al formulario, dnde presentaremos la
informacin sobre la que navegaremos.
Nuestro formulario con los controles insertados en l, tendr un aspecto similar al que se
presenta en la figura 1.

Controles de navegacin y acceso a datos dispuestos en el formulario


Figura 1
Una vez llegado a este punto, lo que tendremos que hacer a continuacin ser escribir el
cdigo fuente necesario para poder representar los datos de la sentencia SQL en el
control BingindNavigator, para que a su vez los presente en el control TextBox.
A continuacin se indica el cdigo fuente de esta parte de demostracin de la aplicacin.
Imports System.Data
Imports System.Data.SqlClient
Imports System.Xml
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
' Declaramos las variables a utilizar
Dim
Conexion
As
String
=
"Data
Source=.\MSSMLBIZ;AttachDbFilename=C:\DATOS\ALUMNOS.mdf;Integrated
Security=True;Connect Timeout=30;User Instance=True"
Dim strSQL As String = "SELECT * FROM ALUMNOS"
Dim MiConexion As New SqlConnection(Conexion)
Dim MiDataReader As SqlDataReader
Dim MiDataTable As New DataTable
Dim Comando As SqlCommand
' Establecemos la Conexin con la base de datos
Comando = New SqlCommand(strSQL, MiConexion)
' Abrimos la Conexin
MiConexion.Open()
' Ejecutamos la sentencia SQL
MiDataReader = Comando.ExecuteReader()

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -473

' Cargamos los resultados en el objeto DataTable


MiDataTable.Load(MiDataReader, LoadOption.OverwriteChanges)
' Volcamos los datos en el control TextBox
BindingSource1.DataSource = MiDataTable
BindingNavigator1.BindingSource = BindingSource1
TextBox1.DataBindings.Add(New Binding("Text", BindingSource1, "Nombrealumno",
True))
' Cerramos la Conexin
Comando = Nothing
MiConexion.Close()
End Sub
End Class

Ejemplo anterior en ejecucin

Categories
CustomerCustomerDemo
EmploerDemographics
Custumers
Employees
Products
Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Dim CadenaConexion As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\SI2013B\CDSI2013B\DATOS\northwnd.m
df;Integrated Security=True;Connect Timeout=30;User Instance=True"
Dim dst As DataSet

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -474

Dim con As New SqlConnection


Dim dap As SqlDataAdapter
Private Sub ListarAlumnos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
' LLENAR CUADRO DE LISTA
ListBox1.Items.Add("Categories")
ListBox1.Items.Add("CustomerCustomerDemo")
ListBox1.Items.Add("EmploerDemographics")
ListBox1.Items.Add("Employees")
ListBox1.Items.Add("Products")
con = New SqlConnection(CadenaConexion)
dst = New DataSet
dap = New SqlDataAdapter("Select * From CATEGORIES", con)
dap.Fill(dst, "CONSULTA1")
DataGridView1.DataSource = dst.Tables(0)
End Sub
Private Sub Lisbre1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles ListBox1.SelectedIndexChanged
Dim nombre As String
Dim nombretabla As String
dst.Clear()
TextBox1.Text = ListBox1.SelectedItem
nombre = TextBox1.Text
nombretabla = "select * from " & TextBox1.Text
dap.SelectCommand.CommandText = nombre
dap.Fill(dst, "consulta")
DataGridView1.DataSource = dst.Tables(0)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
dst = New DataSet
End Sub
End Class

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -475

Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
' variables a nivel de clase para la manipulacin de datos
Private DataAdapter As SqlDataAdapter
Private DataSet As DataSet
Private Sub frmNormal_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles MyBase.Load
' crear conexin
Dim Conexion As New SqlConnection()
Conexion.ConnectionString = "Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\SI2013B\CDSI2013B\DATOS\northwnd.m
df;Integrated Security=True;Connect Timeout=30;User Instance=True"
' crear adaptadores
Dim DCATEGORIES As New SqlDataAdapter("SELECT * FROM CATEGORIES",
Conexion)
Dim DORDER As New SqlDataAdapter("SELECT * FROM ORDERS", Conexion)
Dim DPRODUCTS As New SqlDataAdapter("SELECT * FROM PRODUCTS",
Conexion)
Dim DSUPPLIERS As New SqlDataAdapter("SELECT * FROM SUPPLIERS",
Conexion)
' crear dataset
Dim DataSet As New DataSet()
DCATEGORIES.Fill(DataSet, "CATEGORIAS")

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -476

DORDER.Fill(DataSet, "ORDENES")
DPRODUCTS.Fill(DataSet, "PRODUCTOS")
DSUPPLIERS.Fill(DataSet, "PROVEEDORES")
' asignar dataset a datagrid
Me.DataGrid1.DataSource = DataSet
End Sub
End Class
TAREA PARA LOS ALUMNOS DE SISTEMAS DE INFORMACION 2015A
Cada grupo debe armar su sistema de base de datos en el software que prefiera por
ejemplo en Excel, Access, Visual Basic 2010,2012 , SQL server Etc
Bajar su sistema y un Pc y demostrar
Jugar con la base de datos , como realizar consultas, de seleccin , actualizacin de datos
etc.
EJEMPLO SIMPLE DE BASE DE DATOS
Se tiene el sistema Segunda especialidad
Compuesto por las siguientes tablas
TABLA ALUMNOS
CODALUMN
O
A1
A2
A3
A4
A5
A6

FECHANA
NOMBRE C
JUAN
01/01/1970
KAREN
01/01/1977
CARLOS
01/01/1980
JORGE
01/01/1990
MARIA
01/01/1993
JORGE
30/04/1980

SEXO
H
M
H
H
M
H

PROFESION
INGENIERO GEOLOGO
INGENIERO INDUSTRIAL
INGENIERO CIVIL
ARQUETECTO
ENFERMERA
PROFESOR

TABLA CURSOS
CODCURSO
AD
M1
C1
C2
C3
C4

NOMBRECURSO
Admision
Matrcula 1
Ergonomia
Gestin de Recursos Humanos
Condiciones de Seguridad
Salud Ocupacional

TABLA PAGOS
NR

CODALUMN

FECHAPAG

TIPO

NRODO

RUNS

MONT

CODCURS

OB

TBD2015B \ 7

O
1 A1
2
3
4
5

Base de datos en modo formulario\ Ismael Vliz Vilca -477

01/04/2007 RECIBO

A2
A1
A3
A2

01/12/2007
01/02/2008
01/03/2008
01/02/2009

FACTURA
VOUCHER
RECIBO
RECIBO
TRANSFERENCI
02/04/2009 A

6 A1
7 A4
8 A4

03/05/2009 FACTURA
04/08/2009 VOUCHER

O
100

O
100 AD

F1
V1
2
3

100
200
300
400

100
200
100
200

T1

500

200 C2

F2
V2

500
600

AD
C1
AD
C2

200 AD
200 C1

TABLA NOTAS
I
D
1
2
3
4
5
6
7
8

CODALUMN
O
A1
A1
A1
A2
A2
A2
A3
A4

CODCURSO NOTA FECHAUEVALUACION COD PROFESOR


AD
18
01/04/2007 P1
M1
0
01/12/2007 P1
C1
11
01/02/2008 P1
AD
12
01/03/2008 P2
C1
13
01/02/2009 P2
C4
14
02/04/2009 P3
C1
10
03/05/2009 P4
C2
17
04/02/2010 P5

TABLA PROFESORES
CODPROFE NOMBREPROFE
SOR
SOR
PROFESION
INGENIERO
P1
GOMEZ
CIVIL
INGENIERO DE
P2
RIOS
SEGURIDAD
P3
PEREZ
MEDICO
P4
LOPEZ
MINAS
INGENIERO
P5
TORRES
INDUSTRIAL
TABLA EGRESOS
ID
FECHA
1 01/01/2006
2 02/02/2007
3 02/03/2008
4 02/04/2009

MOTIVO
Pago profesores
pago proveedores
pago Profesores
Gastos varios

PROCEDEN
CIA
AREQUIPA
LIMA
AREQUIPA
TACNA
PUNO

MONTO
100
150
500
300

COD CURSO
C1
C1
C2
C4

CE
VE

SH
R

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -478

Su base de datos podra tener las siguientes consultas


LISTADOS
Listar la tabla alumnos
Listar la tabla alumnos con todos los campos
Listar la tabla alumnos que aparezcan solo los campos, codalumno , nombre y
ordenado por nombre
Listar la tabla Cursos
Listar la tabla pagos
Listar todos los registros
Que aparezca solamente el cdigo del alumno y el monto y ordenado por monto
Listar la tabla notas
Listar la tabla Profesores
Todos los registros
Solo cdigo del profesor y Nombre
Listar la tabla egresos
Todos los campos
Solo los campos fecha y monto
Listar la tablas , por todos los campos, solo los campos deseados, ordenado por algn
campo,
FILTRADOS
TABLA ALUMNOS
Listar la relacin de Ingenieros
Listar la relacin de mujeres
Listar todos los varones mayores a 25 aos
Listar todos los alumnos que cuyo nombre comienza con P
Listar los alumnos que pagaron mas de 1000 soles
TABLA CURSOS
Listar todos los cursos que contienen el texto Salud
TABLA PAGOS
Listar todos los alumnos que pagaron con recibo
Listar todos los registros cuyo pago es mayor a 200
Listar todos los registros dado el cdigo del alumno
Listar los registros en la tabla pagos dado el cdigo del curso
Listar los registros generados en un ao dado
Listar los registros generados en un mes dado
Listar los registros dado un intervalo de dos fechas
TABLA NOTAS
Listar todos los alumnos aprobados
Listar las notas dado el cdigo de un alumno
Listar las notas dado el cdigo del curso
Elaborar un listado dado una fecha de evaluacin y curso(planilla de notas)
Elaborar un listado del tercio superior

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -479

TABLA PROFESORES
Elaborar un listado de profesores procedentes de LIMA
Elaborar un listado de Profesores cuyo nombre contenga contiene la palabra TORRES
TABLA EGRESOS
Listado de tabla egresos
Listado de tabla de egreso por fecha
SUBTOTALES
TABLA NOMBRES
Cantidad de registros de la tabla nombres
Cantidad de mujeres
Cantidad de varones mayores de 25 aos
Cantidad de Ingenieros
Subtotales por profesin
Cantidad de alumnos por ao
TABLA CURSOS
Cantidad de registros de la tabla cursos
TABLA PAGOS
Cantidad de registros de la tabla pagos
Subtotales por tipo de pago
Subtotales por alumno
Subtotales por curso
Subtotales por ao
Cantidad de pagos por ao
Promedio de pagos por curso
Promedio de pagos por alumnos
TABLA NOTAS
Subtotales de cantidad de aprobados y desaprobados y porcentaje
Promedio de notas por curso
Mostrar el cdigo del alumno que tiene la mas alta nota
Mostrar el cdigo del curso donde esta la minima nota
Mostra el nombre del alumno que tiene la mas alta nota
TABLA PROFESORES
Cantidad de profesores
Subtotales de profesores por profesin
Subtotales de profesores por procedencia
Cuantos profesores son de LIMA
FILTROS EN VARIAS TABLAS
Dado el nombre de un alumno que muestre sus notas
Dado el nombre del alumno que muestre sus pagos

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -480

Dado el nombre del curso que liste la cantidad de alumnos que llevaron el curso y cuanto
pagaron
Elaborar un listado donde figure el cdigo del alumno, el nombre del alumno , y total de
sus pagos
Dado el nombre del profesor que liste en que cursos ha enseado
CUADRICULAS
Cuadricula de notas de alumnos cursos
Cuadricula de pagos aos meses
Cuadriculas de pagos alumnos meses
Dado el nombre del alumno elaborar una cuadricula que muestre sus pagos ao mes
Cuadricula alumno y tipo de pago
Cuadricula de ao tipo de pago
Cantidad y total de pagos por aos
Cantidad y total de pagos por alumno
Subtotal alumnos pagos
Elabore unin de tablas
OTROS
Encontrar la edad de los alumnos en la tabla Nombres
SELECT CODALUMNO,NOMBRE ,FECHANAC, (NOW-FECHANAC)/365.24219879 AS
EDAD FROM [ALUMNOS$]
Listado de alumnos que no pagaron
Dado el cdigo del alumno , elaborar un listado de sus notas y sus pagos
Listado de alumnos que no tienen notas
Listar alumnos que cuya ultima fecha de pago es mas de dos aos
Elaborar balance por aos
Balance por curso
Saldos de alumnos
Permanencia de alumno en la especialidad
ultima fecha que aparece el nombre del alumno
Listar los alumnos por aos ( en la tabla pagos)
CONSULTAS DE ACTUALIZACION
Adicionar un nuevo registros a la tabla alumnos
Adicionar un nuevo registros a la Cursos
Actualizar los pagos
Eliminar un registro de la tabla notas
Eliminar todos los registros de la tabla notas de alumnos que no pagaron
Aumentar el pago de profesores en un 10 %

TBD2015B \ 7

Base de datos en modo formulario\ Ismael Vliz Vilca -481

You might also like