Bd en Windows Forms

125
TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 CONEXIÓN conectarse a SQL Server usando el proveedor de datos de SQL, para lo cual veremos algunas propiedades y métodos de la clase SqlConnection. Para ello arrastre un botón 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"

Transcript of Bd en Windows Forms

Page 1: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 CONEXIÓNconectarse a SQL Server usando el proveedor de datos de SQL, para lo cual veremos algunas propiedades y métodos de la clase SqlConnection. Para ello arrastre un botón de comando y un cuadro de lista

Imports System.Data.SqlClientPublic Class Form1 Private Sub Btnconectar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConectar.Click

Page 2: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -384 –

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) ListBox1.Items.Add("Version del servidor de datos =" & .ServerVersion) ListBox1.Items.Add("Nombre de la base de datos =" & .Database) ListBox1.Items.Add("Tamaño 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 SubEnd Class

Use intelligence sense para ver los propiedades y métodos 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

Page 3: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -385 –

USANDO EL PROVEEDOR DE OLEDB

1.1.1 Clase OleDbConnectionEsta 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 también 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 OleDbCódigo

Imports System.Data.OleDbPublic 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 SubEnd Class

Page 4: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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.OdbcPublic 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

Page 5: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -387 –

1.2 CONTROLANDO ERRORES DE CONEXIÓN A SQL SERVER

Cuando ejecutamos una aplicación pueden ocurrir errores en tiempo de ejecución 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 genérico, ya que fue diseñada para informar sobre cualquier tipo de error en tiempo de ejecución, para lo cual tiene propiedades como Message que da la descripción del error y Source quien dice el origen del error.

Si la aplicación trabaja con SQL Server lo mejor sería controlar el error usando la clase SqlException que fue diseñado 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 ejecución al acceder a SQL Server , ya sea al tratar de conectarse o al realizar una operación sobre una Base de datos de SQL Server , tal como ejecutar una instrucción SQL, ejecutar un procedimiento almacenado, etc

1.2.1 Clase SQlError La clase SQlException tiene una colección de errores donde cada error es de tipo SqlError, éste último tiene información sobre un solo error en tiempo de ejecución.

Ejemplo 1 Try catch finally

Imports System.Data.SqlClientPublic 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()

Page 6: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -388 –

End Try End SubEnd 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 = 1El 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 aplicación.

CODIGO DEL FORMULARIO

Imports System.Data.SqlClientImports System.IOPublic Class Form1

Page 7: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 SubEnd Class

Si no hay errores muestra la cantidad de registros que hay en la tabla

Page 8: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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.3MANEJANDO EVENTOS DE CONEXIÓN A SQL SERVER

Los eventos de conexión permiten saber que está sucediendo a la conexión en el transcurso de la ejecución de la aplicación la clase SqlConnection tiene dos eventos de conexión que son el StateChange y el InfoMessage.

1.3.1 Manejando el cambio de estado de la conexión (opcional)

Para manejar el cambio de estado de la conexión se usa el evento StateChange del objeto SqlConnection, éste tiene un parámetro “e” de tipo StateChangeEventArg, el cual tiene dos propiedades:

CurrentState Devuelve el estado actual de la conexiónOriginalState Devuelve el estado anterior de la conexión

1.4.2. Manejando el Envió de Notificaciones SQL a los Clientes

DEMO 38 ( manejar eventos de conexión sobre todo para controlar el cambio de estado de la conexión que puede afectar a la ejecución de la aplicación.

Imports System.Data.SqlClientPublic 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()

Page 9: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -391 –

btnModificarConexion.Text = "Conectar" End If End SubEnd 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 específica como: recuperar registros, insertar, actualizar o eliminar registros sobre el origen de datos.

2.1.2 Tipos de comandos

De acuerdo al tipo de acción 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 SQLCOMMANDPara 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 formularioImports System.Data.SqlClientPublic Class Form1 Dim CadenaConexion As String = "Data Source=(LocalDB)\v11.0;AttachDbFilename=E:\DATOS\ALUMNOS1.mdf;Integrated Security=True;Connect Timeout=30" Private Sub MostrarEstadistica(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim con As New SqlConnection(CadenaConexion)

Page 10: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -392 –

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 SubEnd Class

Page 11: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -393 –

2 TRABAJANDO CON COMANDOS DE SELECCIÓN

3.1 CLASE SQLDATAREADER

Todos los comandos de selección usan el objeto DataReader para almacenar los datos recuperados por la instrucción SQL.El objeto DataReader tiene las siguientes características:

Este es muy rápido 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 métodos GetSql de acuerdo al tipo de datos a leer y el índice de campo en la instrucción Select , por ejemplo para un Select de 3 columnas , una entera , otra cadena, y otra moneda, tenemos:Dim valor1 as integer = drd: getSqlInt32(0).ValueDim valor2 as Stringr = drd: getSqlString(1).ValueDim valor3 as Decimal = drd: getSqlMoney(2).Value

Consejos

Page 12: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 código 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 métodos GetSql. Por ejemplo, para el caso anterior tendríamos:

If Not drd.GetSqlInt32(0).IsNull Then valor1= drd:GetSqlInt32(0).ValueIf Not drd.GetSqlString(1).IsNull Then valor2= drd:GetSqlString(1).ValueIf Not drd.GetSqlMoney(2).IsNull Then valor2= drd:GetSqlMoney(2).Value

DEMO 40 (Obtener el campo nombre de la tabla alumnos)

Imports System.Data.SqlClientPublic 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 SubEnd Class

Tarea. Listar el campo deseado de una base de datos

Page 13: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -395 –

Modifique y pruebePuede listar dos campos de texto a la vez nombre y códigoPara el campo tipo fecha seria ListBox1.Items.Add(drd.GetDateTime(0))

DEMO 41 comandos de selección que recuperen varios campos de un conjunto de datos.Ejercicio 1 .Devolver todos los campos de la tabla alumnos

Imports System.Data.SqlClientPublic 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 SubEnd Class

Page 14: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -396 –

Puede usar el signo + en vez de &

Ejercicio 3 . Combinar tabla pagos con tabla alumnos como se muestra

Imports System.Data.SqlClientPublic Class Form1 Inherits System.Windows.Forms.Form Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\SI2011B\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 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 SubEnd Class

Page 15: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -397 –

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.SqlClientPublic 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) con.Close()

Page 16: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -398 –

End SubEnd Class

3.3 RECUPERANDO MULTIPLES CONJUNTOS DE DATOS

Para ejecutar comandos que devuelven múltiples conjuntos de datos también se usa el método ExecuteReader del objeto SqlCommand,

Ejercicio 1. Generar dos tablas uno de códigos de alumnos y otro de los nombres de alumnos y luego mostrarlos su contenido

Imports System.Data.SqlClientPublic 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 ListBox1.Items.Clear()

Page 17: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -399 –

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 SubEnd Class

Ejercicio 2. Mostrar datos de las todas las tablas de base de datos Alumnos

Imports System.Data.SqlClientPublic 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)

Page 18: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 SubEnd Class

1.4RECUPERANDO IMÁGENES DESDE UNA BASE DE DATOS SQL

Las imágenes 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 método GetBytes del DataReader.Para recuperar imágenes desde una base de datos de SQL Server realice los siguientes pasos:1. Definir el Namespace del proveedor de SQl

Imports System.Data.SqlClient2. Declarar una variable de tipo SqlConecction pasando como parámetro en el

constructor la cadena de conexión:Dim con as new sqlConnection(“cadena de conexión”)

Page 19: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -401 –

3. Declarar una variable de tipo SqlCommand pasando como parámetros en el constructor la instrucción Select y la conexión usada:Dim cmd as New SqlCommand (“Select Lista_Campos From Tabla”, con)

4. Abrir la conexión mediante el método Open del objeto de conexión5. Ejecutar la instrucción mediante el método ExecuteReader pasando como parámetro

CommandBehavior.SequentialAccess y almacenar los datos en objeto de tipo SqlDataReaderDim drd As SqlDataReader=cmd.ExecuteReader

(CommandBehavior.SequentialAccess)

Nota.- El parámetro 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 Método 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 métodos GetSql para leer una imagen o dato BLOB usar la propiedad value del Método GetSqlBinary que devuelve una array de bytesDim Valor as Integer = drd.GetSqlInt32(0).ValueDim Img() as Byte =drd.GetSqlBinary(1).value

Nota.- Cuando usamos el parámetro CommandBehavior .SequentialAccess es necesario leer en orden los campos de DataReader

8. Declarar una variable de tipo MemoryStream que almacena la imagen en memoriaDim ms as new MemoryStream

9. Escribir el array de bytes en el flujo de memoria usando el método Write del objeto Memory Stream:Ms.Write(img, o, img.Length()

10.Cargar el flujo de memoria en la imagen de algún control como el PictureBox usando el método FromStream de la clase ImagePicFigura.Image = Image.FromStream(ms)

11.Cerrar el Flujo de memoria abierto usando el método Close:Ms.Close()

12.Después de leer todos los registros de DataReader cerrar el objeto con el método CloseDrd.close()

13.Cerrar la conexión mediante el método Close del objeto Conexión:Con.Close()

DEMO 43 Recuperar imágenes desde una base de datos usando el objeto SqlDataReader y mostrar la imágenes en un PictureBox

Page 20: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -402 –

Cargar una imagen en tiempo de ejecuciónAgreguemos un campo de camino de la fotoImports system.ioPublic 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 SubEnd Class

Mostrar fotos en la base de datos de alumnos

Imports System.Data.SqlClientPublic 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

Page 21: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 SubEnd Class

Nota. Para mostrar las fotos agregue un campo a la tabla alumnos de la siguiente forma

Todos estos comandos tienen la característica 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 método ExecuteNonQuery el objeto Command.

1.1INSERTANDO REGISTROSPara insertar registros se usa la instrucción “Insert” de SQL

1.2ACTUALIZANDO REGISTROS Para actualizar registros se usa la instrucción “Update” de SQL,

1.3ELIMINANDO REGISTROS Para eliminar registros se usa la instrucción “Delete” de SQLEjercicio 1. (demo 44) Usando la base de datos alumnos elabore una aplicación para el mantenimiento de la tabla alumnos donde se permita agregar, actualizar y eliminar registros

Page 22: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -404 –

Imports System.Data.SqlClient 'Para Usar SqlConnection, SqlCommand,SqlDataReaderImports System.Text 'Para usar StringBuilderImports System.IO 'Para usar StreamWriterPublic 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)

Page 23: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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)

Page 24: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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

Page 25: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 SubEnd 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 = "" LoopRecupera 15 caracteres de la posicion 30TextBox3.Text = .Substring(30, 15).Trim REM FechaNac

Page 26: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -408 –

TRABAJANDO EN FORMA DESCONECTADA

1. TRABAJANDO CON EL CONTROL DATA SET

1.1Clase DataSetLa principal clase del modelo ADO.NET sin duda es el Dataset , que es el repositorio de datos desconectado , el cual tiene las siguientes características:

Se encuentra en la memoria del cliente , es decir donde se ejecuta la aplicación (Client Side)

Consume bastantes recursos de memoria ya que mantiene cargados todos los datos

Permite el desplazamiento hacia cualquier dirección 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 DatasSetEl 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 método Fill del objeto SqlDataAdapter.

Ejercicio 1 Mostrar la Tabla Pagos en un Datagridview

imports System.Data.SqlClientPublic 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 SubEnd Class

Page 27: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -409 –

Con procedimientos almacenados seria asiImports System.Data.SqlClientPublic 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 SubEnd Class

Ejercicio 2 . Mostrar una tabla de Access OLDBImports System.Data.OleDbPublic 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 SubEnd Class

Page 28: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -410 –

Ejercicio 2 Mostrar una sentencia SQL ingresada por el teclado

Imports System.Data.SqlClientPublic Class Form1 Inherits System.Windows.Forms.Form Dim CadenaSQL As String Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\SI2011\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 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 SubEnd Class

Page 29: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -411 –

Pruebe con estas sentencias y otras

SELECT YEAR(fechapago) as año,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

CODIGOImports System.Data.SqlClientPublic Class Form1 Inherits System.Windows.Forms.Form ' variables a nivel de clase para la manipulación 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 conexión 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) Dim DCursos As New SqlDataAdapter("SELECT * FROM Cursos", Conexion)

Page 30: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -412 –

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 SubEnd Class

1.3 AGREGANDO RELACIONES ENTRE TABLAS DATASET

Una DataSet no solo puede contener una tabla sino varias y estos pueden estar relacionadas . Dicha relación 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 foránea) al momento de trabajar con datos en el cliente. 1.3.1 Clase DataRelation1.3.2 Creando y agregando una Relación en el DataSet

Para crear una relación entre dos tablas se usa el objeto DataRelation y para agregarlo al DataSet se usa el método Add de la colección 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 relación , 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 parámetro 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 relación creada a la colección de relaciones del Dataset mediante el método Add de la colecció Relations:dst.relatons.Add(drn)

9. Enlazar la tabla padre a algún control como el datagriddgdControl.DatSource=dst.tables(0)

DEMO 46 crear dos tablas en un DataSet, luego crear una relación entre dichas tablas y agregar la relación al DataSet .

Ejercicio 1. Se tiene la base de datos Alumnos que tiene tres tablas Alumnos , pagos y cursos que tienen la siguiente estructura

Page 31: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -413 –

Page 32: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -414 –

CODIGOImports System.Data.SqlClientPublic 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)

Page 33: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 SubEnd 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.SqlClientPublic 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()

Page 34: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 SubEnd Class

TAREA como obtener la relacion alumnos con cursos, dado un alumno listar que cursos llevaNotaDataGrid1.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 más 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 métodos que permiten realizar operaciones con los registros de la tabla, tales como inserción de nuevos registros, actualización de datos o eliminación 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 método NewRow del Objeto DataTable

Luego debe llenarse los datos del DataRow y finalmente agregarse a la colección de Rows del DataTable mediante el método Add.

4 Crear un objeto DataRow que tome la estructura de una fila de la tabla mediante el método NewRowDim drw as datrow= dst.tables(0).NewRow

Page 35: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -417 –

5 Llenar los campos del DataRow con los valores deseados , por ejemplo ,para una tabla con 3 columnas tenemosDrw(0)= valor1Drw(1)= valor2Drw(2)= valor3

3 Finalmente agregar el dataRow a la colección de filas de la tabla mediante el métodos Add de la colección Rows de DataTableDst.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 edición debe usarse el Método BeginInt del DataTable, luego debe llenarse los datos del DataRow y finalmente debe llamarse al método EndInitA continuación 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 modificarDim drw as DataRow= dst.tables(0),rows(N)Nota.- El Prámetro N indica el indice de la fila que se desea modificar

5 Llamar al método BeginInit del DataTable para empezar la edición de un registro de la tablaDst.tables(0).BeginInt()

6. Actualizar los campos de DataRow con los valores desados , por ejemplo , para una tabla con 3 columnas tenemosDrw(0)= valor1Drw(1)= valor2Drw(2)= valor3

7. Finalmente llamar al método EndInit del Datatable para finalizar la edición del registro de la tablaDst.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 método Delete del Objeto DataRow para eliminar dicha fila del DataTable4 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 método Delete del DataRow para elimnar el registro

drw.Delete()

Nota.- En realidad el registro sólo se marca para después ser borrado físicamente al enviar cambios desde la tabla hacia la base de datos.

2.3 Actualizando la Base de Datos

Page 36: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -418 –

Después 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 método Fill del DataAdapter que ejecutó el Select Command , para que estos cambios sean regresados o enviados hacia la base de datos se usa el método Update del DataAdapter

Para que se pueda usar el método 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 código escritoDap.InsertComand.ComandText =”Insert Into Tabla(lista_campos) Values (lista_valores)Dap.updatecommand.Commadtext(“update tabla set campo1=valor1, campo2=valor2,…. Where (expresion lógica)”Dap.Deletecommand.CommadText= “delete from tabla where (exp.)

2. Automáticamente

Usando el objeto CommandBuilder que se analiza a continuación

2.3.2 Clase SqlCommandBuilder

El Objeto CommandBuilder se utiliza para generar comandos de actualización en forma automática

Para esto el CommandBuilder toma el SelectCommand del DataAdapter y crea automáticamente 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 método Update de DataAdapter

A continuación presentamos la forma de enviar cambios hacia la base de datos.1. Crear una instrucción try.. catch Finally

TryEnd Try

Page 37: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -419 –

2. Dentro del Try crear un objeto SqlCommandBuilder pasando como parámetro el SqlDataAdapter Dim cbd As New SqlCommandBuilder(dap)

2. Dentro del Try enviar los cambios usando el método Update del objeto SqlDataAdapater pasando como parámetro el DataSet y la tablaDap.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 SqLCatch dvcEx As DbConcurrencyExxeption‘Controlar errores de concurrencia de base de datosCatch 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 llenándolos nuevamente con el método Fill del SqlDataAdapterFinallyDst.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 Propiedad ValorForm1 Text Mantenimiento de base de

datos de alumnosDataGridView ReadOnly TrueButton1 Name

TagText

BtnNuevo1Nuevo

Button2 NameTagText

BtnEditar2Editar

Button3 NameTagText

BtnEliminar3Eliminar

Button4 NameText

BtnEnviarCambiosEnviar cambios

Page 38: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -420 –

Agregue un segundo formulario con siguientes propiedades

En botón aceptar en dialog result OkEn botón cancelar en dialog result Cancel

CODIGO DEL PRIMER FORMULARIO

Imports System.Data.SqlClient

Page 39: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 SubEnd Class

CODIGO DEL SEGUNDO FORMULARIO

Imports System.Data.SqlClientPublic Class Form2 Inherits System.Windows.Forms.Form Private Sub LimpiarTextos() TextBox1.Clear() TextBox2.Clear() TextBox3.Clear() End Sub

Page 40: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 SubEnd Class

CODIGO DEL MODULO

Page 41: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 EnumEnd Module

NOTA pos = DataGridView1.CurrentCell.RowIndex pos = DataGrid1.CurrentRowIndexpos = DataGridView1.CurrentRow.Index

APLICACION PARA DIFERENCIAR MODO CONECTADO DEL DESCONECTADO

MENU MODO CONECTADO EN MODO CONSOLA Y MODO FORMULARIO

Page 42: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -424 –

CODIGO DEL MODULO 2Module 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)

Page 43: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 SubEnd Module

CODIGO DEL MODULO 1

Imports System.Data.SqlClientModule 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()

Page 44: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 SubEnd 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

Page 45: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 SubEnd Class

MENU MODO DESCONECTADO

Page 46: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -428 –

CODIGO DEL MODULO 2

Imports System.Data.SqlClientImports System.IOModule 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)

Page 47: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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)

Page 48: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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

Page 49: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 SubEnd Module

Page 50: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -432 –

CODIGO DEL MODULO 1

Imports System.Data.SqlClientModule 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 SubEnd Module

CODIGO DEL FORMULARIO

Imports System.Data.SqlClientPublic 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)

Page 51: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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()

Page 52: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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

Page 53: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 "<<"

Page 54: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 SubEnd 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 más 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 VistaCreando 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 códigoDim 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 selección

Para filtrar registros de una vista se usa la propiedad RowFilter del objeto DataView. Tal como se muestra en le siguiente códigoDvw.RowFilter = “criterio de selección”Nota: El “Criterio de Selección” es una instrucción SQL similar a la usada en la cláusula Where.

Page 55: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -437 –

Por ejemplo para ver una vista de productos cuyo código de categoría es 1 y cuyo código de Proveedor es 2 tenemos Dvw.RowFilter= “CategoryId =1 and SuplierId=2”

Ejercicio 1. La siguiente aplicación obtiene el número de registro actual y lo muestra en un cuadro de texto además muestra los valores de los demás campos en un cuadro de lista, al presionar el botón btnPosicionar posiciona el indicador de registro en el registro indicado en el cuadro de texto

Imports System.Data.SqlClientPublic 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 col = DataGridView1.CurrentCell.ColumnIndex TextBox1.Text = fila

Page 56: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -438 –

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 SubEnd Class

Nota necesariamente debe haber un campo clave

Se se usa datagrid DataGrid1.CurrentRowIndex = pos

Ejercicio 2. Diseñar un formulario similar a la siguiente se mueve el cursor a una fila especificada y la aplicación permite modificar y eliminar registros

CODIGO DEL FORMULARIO

Imports System.Data.SqlClientPublic Class Form1 Inherits System.Windows.Forms.Form

Page 57: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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

Page 58: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 SubEnd 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

Page 59: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -441 –

LA TABLA CURSOS TIENE LOS SIGUIENTES DATOS

LA TABLA PAGOS TIENE LOS SIGUIENTES DATOS

Ejercicio1 (Modificación Demo 49) Filtrar los registros de la tabla PAGOS por el campo código de alumno

Page 60: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -442 –

CODIGOImports System.Data.SqlClientPublic 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 SubEnd Class

Nota : se podria filtrar tambien usando solo sentencias sql

Page 61: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -443 –

Imports System.Data.SqlClientPublic 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 SubEnd Class

Ejercicio 2. Filtrar por código de curso

Imports System.Data.SqlClientPublic 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()

Page 62: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 SubEnd Class

Ejercicio 3 Filtrar por un campo numerico en este caso monto

Page 63: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -445 –

Imports System.Data.SqlClientPublic Class Form1 Inherits System.Windows.Forms.Form Private dvw As DataView Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\SI2011B\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 ,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 SubEnd 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 ordenación y opcionalmente indicando en cada campo el tipo de ordenación , que puede ser ascendente o descendente tal como se muestra en el siguiene códigodvw.Sort “Campo1 [Asc|Desc] campo2 [Asc|Desc]

Nota: Por defecto si no se especifica el tipo de ordenación , esta es ascendenteEjemplo Ordenar la vista de productos por codigo categoria en forma ascedente y si coinciden ordenar por codigo del proveedor en forma descendentedws.sort= “CategoryID Asc,SuplierID Desc”

3.2.4 Buscando Datos en la vista

Page 64: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 método Find del objeto DataView pasando como parametro el dato a buscar tal como se muestra en el siguiente codigoDim pos as integer = dvw.Find(dato)Nota: El Método Find devuelve un entero indicando la posición del registro en la vista . Si devuelve un número 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 tenemosdww.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 búsqueda se realiza por un campo numérico 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 campoLa tabla debe tener la siguiente estructura

Page 65: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -447 –

CODIGO DEL FORMULARIO

Imports System.Data.SqlClientPublic 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)

Page 66: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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.SqlClientPublic 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

Page 67: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 SubEnd 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 mostrándolo 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 técnica 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

Page 68: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -450 –

En la segunda técnica sólo 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 numérico, texto o de fecha y hora

Un botón de opción (RadioButton) o cuadro de verificación (CheckBox) en caso de ser un campo lógico

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 colección DataBidings que es una propiedad de cada control simple, pasando tres parámetros. 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 sólo con dos campos: uno que se ve (Display Member) y otro que se oculta (ValueMember).

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

Page 69: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -451 –

Para crear un enlace complejo sobre un control se puede hacer de dos formas Configurar sus propiedades DataSource especificando el DataSet y en

DataMember el nombre de la tabla , tal como se muestra debajo;Controlcomplejo.Datasource= dstControlcomplejo:DataMember= “tabla”ControlComplejo.DataSource=dst.Tables(N)

Nota: También podemos realizar el enlace directamente configurando en la propiedad DataSource la tabla del DataSet

Configure el método SetDataBinding pasando como parámetros 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 método SetDataBinding, también 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.SqlClientPublic 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") dap.SelectCommand.CommandText = "Select Nro,Codalumno,Fechapago,Monto,CodCurso From pagos"

Page 70: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -452 –

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 SubEnd ClassEjecutar 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 técnica consiste en leer cada registro e ir mostrándolo 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 posición del registros actual o registro que se desea moastrarDim 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 código anterior también mostramos la posición 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 tablaDwn= dst.Tables(0).DefaultViewMostrarDaos()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.Pos =0Mostrardatos()

Page 71: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -453 –

6. Para mostrar el registro anterior al actual, primero verficar que no estamos sobre el primer registro, si se cumple esta condición disminuir en 1 el valor de la variable pos y llamar al procedimiento que presenta los datosIf pos A 0 then

Pos = pos-1MostrarDatos()

End ifNota:- Si no incorporamos la condición y retrocedieramos se genera una Excepción al tratar de leer una posición 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 condición aumentar en 1 el valor de la variable pos y llamar al procedimeitno que presenta los datos

If pos < dwn.Count-1 thenPos =pos +1MostrarDatos

End ifNota:- Si no incorporamos la condición y avanzariamos se genera una Excepción al tratar de leer una posición 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 datosPos =dvw.count-1MostrarDatos()

DEMO 52 presentar datos desde una vista en forma manual, es decir leyendo cada registro de la vista y mostrándolo sobre controles simples ( no enlazados)

Ejercicio 1 modificar el demo 52 para el caso de los alumnos

CODIGO DEL FORMULARIOImports System.Data.SqlClient

Page 72: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -454 –

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 SubEnd Class

Usando desplazamiento manual con el control datgridviewReemplace

DataGrid1.CurrentRowIndex = posCon DataGridView1.CurrentCell = DataGridView1(0, pos)

4.2.2 Usando Desplazamiento Automático

Page 73: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -455 –

En versiones anteriores de ADO la clase recordset venía con métodos (MoveFirst, MoveLast, MovePrevius, MoveNext y Move) que permitián 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 automático 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 desplazamientoPrivate 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 colección DataBinding de cada controlPrivate sub enlazarDatos()

Control1.DataBinding.Add(“Text”,dvw, “campo1”)Control1.DataBinding.Add(“Text”,dvw, “campo2”)Control1.DataBinding.Add(“Text”,dvw, “campo3

End Sub4. 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 método BindingContext el formulario.‘Escribir antes el código para conectarse y llenar datos en una tabladvw= dst. Tables(0).DefaultViewEnlazarDatos()cmr= Me.BindingContext(dvw)Nota: El Método BindingContext detecta todos los controles en el formulario que están enlazados a la vista para que sean manejados a través del CurrencyManager.

5. Para ir alprimer registro de la vista configure la propiedad Position del CurrencyManager en 0cmr.Position=0

6. Para ir al registro anerior primero verificar que no estemos sobre el primer registro, si se cumple esta condición disminuir en 1 el valor de la propiedad Position del CurrencyManagerIf 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 condición aumentar en 1 el valor de la proiedad Position del CurrencyManger

If cmr.Position < cmr.count-1 then cmr.Position =cmr.Position +18. Par ir al último registro de la vista configurar el valor de la propiedad Position del

CurrencyManager en la última posición de la vistaCmr.Position=cmr.Count-1

DEMO 53 Esta demostracion tiene por objetivo enseñar a enlazar datos de un vista a controles simples y realizar el desplazamiento en forma automática usando el CurrencyManager

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

Page 74: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -456 –

Imports System.Data.SqlClientPublic 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 Select Case sender.Tag

Page 75: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -457 –

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 SubEnd Class

Ejercicio 2. Buscar por el nombre de alumno

CODIGO DEL FORMULARIO

Imports System.Data.SqlClientPublic 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() dap.Fill(dst, "Alumnos")

Page 76: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -458 –

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 SubEnd Class

Nota. Se pinta el registro seleccionado

1.3FORMATEANDO 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 nùmeros con decimales o símboles de monedaPara formatear un campo de control enlazado a datos realice los siguiente:

1 Definir el Nameespace para trabajar con la enumeración NumberStylesImports Systems.Globalization

2. Crear un procedimiento que convierta el numero decimal a cadenaPrivate Sub FormtearDecimalAstring(ByVal sender As Object , ByVal c A convertEventArg)

C.value=Format(c.value,”#,00”)End sub

3. Crear un procedimiento que convierta la cadena a un número decimal

Page 77: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -459 –

Private Sub ParsearStringADecimal(ByVal sender As Object , ByVal c As ConvertEventArg)

c.value= Decimal.Parse(c.value, NumberStyles.Currency)End Sub

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 ejecución , uno para el evento Format y otro para el evento Parse del objeto de enlace (Binding):AddHandler.ObjEnlace.Format.AddressOf FormatearDecimalAStringAddHandler.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 datos6 Añadir al objeto de enlace sencillo creado a la colección de enlaces del control donde

se desea dar formatoControl.DataBinding .Add(ObjEnlace)

7 Finalmente crear el objeto CurrencyManager que apunte a todos los controles del formulario enlazado a la vistacmr= Me.BindngContext(dvw)

DEMO 55 formatear controles con enlace simple especificamente aprenderemos a dar formato decimal a un número de un campo enlazado a un control simple

Ejercicio 1. Modificar el demo 55 para el caso de los alumnos

Imports System.Data.SqlClient

Page 78: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -460 –

Imports System.GlobalizationPublic 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 Case "1" : cmr.Position = 0

Page 79: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -461 –

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 SubEnd Class

Como formatear campo fecha

4.3.2 FORMATEANDO EL DATAGRID

El Control Datagrid quizá see el control más 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 ejecución Modificar las columnas que se muestran en el DataGrid asi como los colores y otros

aspecto del formato mostradoEl Primer tipo de formato , se logra configurando propiedades en tiempo de diseño y los otros dos se logran en tiempo de ejecución mediante código.

Clase DataGridPara ambos caso necesitamos conocer los miembros de la clase Datagrid que describiremos a continuaciónEjercicio 1. Modificación del demo 56 formateara al DataGrid para el caso de los alumnos

Imports System.Data.SqlClientPublic Class Form1

Page 80: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -462 –

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;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim con As New SqlConnection(CadenaConexion) Dim dap As New SqlDataAdapter("", con)

Page 81: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -463 –

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 SubEnd Class

Elaborar la aplicacion

Ejercicio de datagridview elaborar una aplicación como la mostrada

Page 82: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -464 –

Imports System.Data.SqlClientPublic 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 SubEnd Class

EJERCICIO CON BINDING NAVIGATORVea las propiedades del control BidingNavegator en enlace controles

Page 83: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -465 –

Enlazando el control datagrid

Objeto propiedad ValorBindingNavigator DataSource TbAlumnosBindingSourceDataGridView DataSource TbAlumnosBindingSource

Page 84: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -466 –

Ejemplo mostrar el elemento de la fila y columna determinada

Imports System.Data.SqlClientPublic 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"

Page 85: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 SubEnd Class

Obtener esquema

Page 86: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -468 –

Imports System.Data.SqlClientPublic 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 añadir 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 información del esquema que el dataset contiene Dim DataTable As DataTable Dim DataColumn As DataColumn Me.ListBox1.Items.Add("Estructura del DataSet") ' recorrer la colección de tablas del DataSet For Each DataTable In DataSet.Tables Me.ListBox1.Items.Add("Tabla: " & DataTable.TableName) ' recorrer la colección 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 SubEnd Class

Configurar un control combobox

Page 87: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -469 –

Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'TODO: esta línea de código carga datos en la tabla 'ALUMNOSDataSet.ALUMNOS' Puede moverla o quitarla según sea necesario. Me.ALUMNOSTableAdapter.Fill(Me.ALUMNOSDataSet.ALUMNOS) 'TODO: esta línea de código carga datos en la tabla 'ALUMNOSDataSet.PAGOS' Puede moverla o quitarla según 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 SubEnd Class

Los nombres y fechas de nacimiento pueden ser en forma aleatorioC.VALUE=FORMAT(C.VALUE,”M/d/yy”) probar esto

Page 88: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -470 –

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

Imports System.Data.SqlClientPublic 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

Page 89: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz 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 SubEnd Class

Propuestas de trabajo de investigaciónLos trabajos tienen que ser en modo visual . se deben presentar en grupos de 3

1. Aplicación de fractales y recursividad 2. Aplicación de autómatas celulares y computación universal. Juego de la vida en 2d

y 3D3. Aplicación del programa del buscador en optimización en modo grafico4. Manejo del puerto USB5. Programación de ADN manejo de secuencias cadenas6. Programación genérica plantillas ( Templates)7. Base de datos biológica8. Aplicación 3d en opengl y visual estudio 2010, Simulación 3D9. Aplicaciones Web Lenguaje HTML, Java, etc. y su importancia10.Temas de inteligencia artificial como programación evolutiva , redes

neuronales,etc11.Sistemas de información en Office Excel12.My sql13.Automatización industrial plc, sensores, 14.Aplicaciones de sistemas de información para optimización15.Simulación 3d, ejemplo simio.etc16.Programación en Windows. Uso de otros controles como por ejemplo el Microsoft

char17.Programación genérica plantillas ( Templates)18.Seguridad de base de datos en sqlserver19.Otros temas relacionados al curso de sistemas de información20. 21 realizar un programa de animación ejemplo un barquito que pasa y no borra el

fondo

Demostración del uso de BindingSource y BindingNavigator

Page 90: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -472 –

Para ello, crearemos un proyecto nuevo e insertaremos un control BindingSource y un control BindingNavigator dentro del formulario.También insertaremos un control TextBox al formulario, dónde presentaremos la información 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 navegación y acceso a datos dispuestos en el formularioFigura 1

Una vez llegado a este punto, lo que tendremos que hacer a continuación será escribir el código 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 continuación se indica el código fuente de esta parte de demostración de la aplicación.

Imports System.DataImports System.Data.SqlClientImports System.XmlPublic 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 Conexión con la base de datos Comando = New SqlCommand(strSQL, MiConexion) ' Abrimos la Conexión MiConexion.Open() ' Ejecutamos la sentencia SQL MiDataReader = Comando.ExecuteReader() ' Cargamos los resultados en el objeto DataTable

Page 91: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -473 –

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 Conexión Comando = Nothing MiConexion.Close() End SubEnd Class

Ejemplo anterior en ejecución

CategoriesCustomerCustomerDemoEmploerDemographicsCustumersEmployeesProducts

Imports System.Data.SqlClientPublic Class Form1 Inherits System.Windows.Forms.Form Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\SI2013B\CDSI2013B\DATOS\northwnd.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim dst As DataSet Dim con As New SqlConnection

Page 92: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -474 –

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 SubEnd Class

Page 93: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -475 –

Imports System.Data.SqlClientPublic Class Form1 Inherits System.Windows.Forms.Form ' variables a nivel de clase para la manipulación 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 conexión Dim Conexion As New SqlConnection() Conexion.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\SI2013B\CDSI2013B\DATOS\northwnd.mdf;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")

Page 94: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -476 –

DORDER.Fill(DataSet, "ORDENES") DPRODUCTS.Fill(DataSet, "PRODUCTOS") DSUPPLIERS.Fill(DataSet, "PROVEEDORES")

' asignar dataset a datagrid Me.DataGrid1.DataSource = DataSet End SubEnd 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 EtcBajar su sistema y un Pc y demostrarJugar con la base de datos , como realizar consultas, de selección , actualización de datos etc.

EJEMPLO SIMPLE DE BASE DE DATOS

Se tiene el sistema Segunda especialidadCompuesto por las siguientes tablas

TABLA ALUMNOS

CODALUMNO NOMBRE FECHANAC SEXO PROFESIONA1 JUAN 01/01/1970 H INGENIERO GEOLOGOA2 KAREN 01/01/1977 M INGENIERO INDUSTRIALA3 CARLOS 01/01/1980 H INGENIERO CIVILA4 JORGE 01/01/1990 H ARQUETECTOA5 MARIA 01/01/1993 M ENFERMERAA6 JORGE 30/04/1980 H PROFESOR

TABLA CURSOS

CODCURSO NOMBRECURSOAD AdmisionM1 Matrícula 1C1 ErgonomiaC2 Gestión de Recursos HumanosC3 Condiciones de SeguridadC4 Salud Ocupacional

TABLA PAGOS

NRO

CODALUMNO

FECHAPAGO TIPO

NRODOC

RUNSA

MONTO

CODCURSO OBS

Page 95: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -477 –

1 A1 01/04/2007 RECIBO 1 100 100 AD

2 A2 01/12/2007 FACTURA F1 100 100 ADCERRO VERDE

3 A1 01/02/2008 VOUCHER V1 200 200 C14 A3 01/03/2008 RECIBO 2 300 100 AD5 A2 01/02/2009 RECIBO 3 400 200 C2

6 A1 02/04/2009TRANSFERENCIA T1 500 200 C2

7 A4 03/05/2009 FACTURA F2 500 200 ADSHOUTHER

8 A4 04/08/2009 VOUCHER V2 600 200 C1

TABLA NOTAS

ID CODALUMNO CODCURSO NOTA

FECHAUEVALUACION COD PROFESOR

1 A1 AD 18 01/04/2007 P12 A1 M1 0 01/12/2007 P13 A1 C1 11 01/02/2008 P14 A2 AD 12 01/03/2008 P25 A2 C1 13 01/02/2009 P26 A2 C4 14 02/04/2009 P37 A3 C1 10 03/05/2009 P48 A4 C2 17 04/02/2010 P5

TABLA PROFESORESCODPROFESOR

NOMBREPROFESOR PROFESION

PROCEDENCIA

P1 GOMEZINGENIERO CIVIL AREQUIPA

P2 RIOSINGENIERO DE SEGURIDAD LIMA

P3 PEREZ MEDICO AREQUIPAP4 LOPEZ MINAS TACNA

P5 TORRESINGENIERO INDUSTRIAL PUNO

TABLA EGRESOSID FECHA MOTIVO MONTO COD CURSO

1 01/01/2006 Pago profesores 100 C12 02/02/2007 pago proveedores 150 C13 02/03/2008 pago Profesores 500 C24 02/04/2009 Gastos varios 300 C4

Su base de datos podría tener las siguientes consultas

Page 96: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -478 –

LISTADOSListar 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 CursosListar la tabla pagos Listar todos los registros

Que aparezca solamente el código del alumno y el monto y ordenado por montoListar la tabla notasListar la tabla Profesores

Todos los registrosSolo código del profesor y Nombre

Listar la tabla egresosTodos los camposSolo los campos fecha y monto

Listar la tablas , por todos los campos, solo los campos deseados, ordenado por algún campo,

FILTRADOSTABLA ALUMNOS

Listar la relación de IngenierosListar la relación de mujeresListar todos los varones mayores a 25 añosListar todos los alumnos que cuyo nombre comienza con PListar los alumnos que pagaron mas de 1000 soles

TABLA CURSOSListar 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 200Listar todos los registros dado el código del alumnoListar los registros en la tabla pagos dado el código del cursoListar los registros generados en un año dadoListar los registros generados en un mes dadoListar los registros dado un intervalo de dos fechas

TABLA NOTASListar todos los alumnos aprobadosListar las notas dado el código de un alumnoListar las notas dado el código del cursoElaborar un listado dado una fecha de evaluación y curso(planilla de notas)Elaborar un listado del tercio superior

TABLA PROFESORES

Page 97: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -479 –

Elaborar un listado de profesores procedentes de LIMAElaborar un listado de Profesores cuyo nombre contenga contiene la palabra “TORRES”

TABLA EGRESOS

Listado de tabla egresosListado de tabla de egreso por fecha

SUBTOTALES

TABLA NOMBRESCantidad de registros de la tabla nombresCantidad de mujeresCantidad de varones mayores de 25 añosCantidad de IngenierosSubtotales por profesiónCantidad de alumnos por año

TABLA CURSOSCantidad de registros de la tabla cursos

TABLA PAGOSCantidad de registros de la tabla pagosSubtotales por tipo de pagoSubtotales por alumnoSubtotales por cursoSubtotales por añoCantidad de pagos por añoPromedio de pagos por cursoPromedio de pagos por alumnos

TABLA NOTASSubtotales de cantidad de aprobados y desaprobados y porcentajePromedio de notas por cursoMostrar el código del alumno que tiene la mas alta notaMostrar el código del curso donde esta la minima notaMostra el nombre del alumno que tiene la mas alta nota

TABLA PROFESORESCantidad de profesoresSubtotales de profesores por profesiónSubtotales de profesores por procedenciaCuantos profesores son de LIMA FILTROS EN VARIAS TABLAS

Dado el nombre de un alumno que muestre sus notasDado el nombre del alumno que muestre sus pagos

Page 98: Bd en Windows Forms

TBD2015B \ 7 Base de datos en modo formulario\ Ismael Véliz Vilca -480 –

Dado el nombre del curso que liste la cantidad de alumnos que llevaron el curso y cuanto pagaronElaborar un listado donde figure el código del alumno, el nombre del alumno , y total de sus pagosDado el nombre del profesor que liste en que cursos ha enseñado

CUADRICULASCuadricula de notas de alumnos cursosCuadricula de pagos años mesesCuadriculas de pagos alumnos mesesDado el nombre del alumno elaborar una cuadricula que muestre sus pagos año mesCuadricula alumno y tipo de pagoCuadricula de año tipo de pagoCantidad y total de pagos por añosCantidad y total de pagos por alumnoSubtotal alumnos – pagosElabore unión 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 pagaronDado el código del alumno , elaborar un listado de sus notas y sus pagosListado de alumnos que no tienen notasListar alumnos que cuya ultima fecha de pago es mas de dos añosElaborar balance por añosBalance por cursoSaldos de alumnosPermanencia de alumno en la especialidadultima fecha que aparece el nombre del alumnoListar los alumnos por años ( en la tabla pagos)

CONSULTAS DE ACTUALIZACIONAdicionar un nuevo registros a la tabla alumnosAdicionar un nuevo registros a la CursosActualizar los pagosEliminar un registro de la tabla notasEliminar todos los registros de la tabla notas de alumnos que no pagaronAumentar el pago de profesores en un 10 %