You are on page 1of 120

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -1

BASE DE DATOS EN WINDOWS FORMS


1. MANEJANDO LA CONEXIN DEMO 35 (modificado) conectarse a SQL Server usando el proveedor de datos de SQL, para lo cual veremos algunas propiedades y mtodos de la clase SqlConnection. Para ello arrastre un botn de comando y un cuadro de lista Imports System.Data.SqlClient Public Class Form1 Private Sub Btnconectar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btnconectar.Click Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim con As New SqlConnection(CadenaConexion) With con .Open() ListBox1.Items.Add("nombre del servidor de datos =" & .DataSource) ListBox1.Items.Add("Version del servidor de datos =" & .ServerVersion) ListBox1.Items.Add("Nombre de la base de datos =" & .Database) ListBox1.Items.Add("Tamao del paquete en bytes =" & .PacketSize) ListBox1.Items.Add("cadena de conexion =" & .ConnectionString) ListBox1.Items.Add("tiempo de conexion = " & .ConnectionTimeout) ListBox1.Items.Add("Estaacion de trabajo= " & .WorkstationId) ListBox1.Items.Add("Estado = " & .State) ListBox1.Items.Add("Estatic enabled = " & .StatisticsEnabled) .Close() End With End Sub End Class

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -2

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;Integrate d Security=True;Connect Timeout=30;User Instance=True

Si su base de datos es obtenido del servidor ( creado en SQL Server 2005) solo deberia poner) Dim CadenaConexion As String = "Data Source=.\sqlexpress;Initial Catalog=Alumnos;Integrated Security=True" Y su solucion seria

USANDO EL PROVEEDOR DE OLEDB 1.1.1 Clase OleDbConnection Esta clase permite conectarse a cualquier rigen de datos que tenga un proveedor de OleDB, tal como Access o versiones anteriores a SQL Server 7. Esta Clase tambin implementa los miembros de la clase Connection, y es muy similar a SqlConnection Demo 36 (modificado) conectarse a una base de datos de MS Access 2007 usando el proveedor de datos de OleDb Cdigo Imports System.Data.OleDb Public Class Form1 Inherits System.Windows.Forms.Form Private Sub Btnconectar_Click(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"

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -3

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("estado =" & .State) ListBox1.Items.Add("database =" & .Database.ToString) .Close() End With End Sub End Class

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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -4

.Close() End With End Sub End Class

1.2 CONTROLANDO ERRORES DE CONEXIN A SQL SERVER

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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -5

Dim x As Integer = 10 Dim y As Integer = 0 Dim z As Integer Try x=x\y z = Math.Sqrt(4 - x) Catch ex As Exception When y = 0 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 ListBox1.Items.Add(ex1.Message) Finally Beep() End Try End Sub End Class

' Catch the error.

' Catch the error.

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

CODIGO DEL FORMULARIO Imports System.Data.SqlClient Imports System.IO Public Class Form1 Inherits System.Windows.Forms.Form

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -6

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("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("Errores.txt") Then Dim Archivo1 As New StreamReader("Errores.txt") Dim Linea As String ListBox1.Items.Clear() Do While True Linea = Archivo1.ReadLine If Linea Is Nothing Then Exit Do ListBox1.Items.Add(Linea) Loop Archivo1.Close() Else MessageBox.Show("No existe el archivo de Errores", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) End If End Sub End Class Si no hay errores muestra la cantidad de registros que hay en la tabla

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -7

Cambie la cadena de conexion a y vera los errores Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS1.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"

1.3 MANEJANDO EVENTOS DE CONEXIN A SQL SERVER Los eventos de conexin permiten saber que est sucediendo a la conexin en el transcurso de la ejecucin de la aplicacin la clase SqlConnection tiene dos eventos de conexin que son el StateChange y el InfoMessage. 1.3.1 Manejando el cambio de estado de la conexin Para manejar el cambio de estado de la conexin se usa el evento StateChange del objeto SqlConnection, ste tiene un parmetro e de tipo StateChangeEventArg, el cual tiene dos propiedades: CurrentState OriginalState Devuelve el estado actual de la conexin Devuelve el estado anterior de la conexin

1.4.2. Manejando el Envi de Notificaciones SQL a los Clientes DEMO 38 ( manejar eventos de conexin sobre todo para controlar el cambio de estado de la conexin que puede afectar a la ejecucin de la aplicacin. Imports System.Data.SqlClient Public Class Form1 Inherits System.Windows.Forms.Form Private WithEvents con As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True")

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -8

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() btnModificarConexion.Text = "Conectar" End If End Sub End Class

2. TRABAJANDO CON COMANDOS 2.1 INTRODUCCION A LOS COMANDOS Los comandos son instrucciones que se ejecutan en un origen de datos y que le indican al motor de datos realizar una tarea especfica como: recuperar registros, insertar, actualizar o eliminar registros sobre el origen de datos. 2.1.2 Tipos de comandos De acuerdo al tipo de accin o resultado de comando , en ADO.NET podemos clasificar los comandos en : Comandos que devuelven un simple valor (ExecuteScalar) Comandos que devuelven un conjunto de datos (ExecuteReader). Comandos que actualizan datos 2.2 CLASE SQLCOMMAND

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -9

Para trabajar con cualquier tipo de comandos necesitamos usar el objeto Command , en este caso para trabajar con SQL, usamos el SqlCommnand. 2.3 TRABAJANDO CON COMANDOS QUE DEVUELVEN UN SIMPLE VALOR Ejemplo (modificacin Demo 39).- de la base de datos alumnos encuentre los siguientes valores que se indican en el formulario Imports System.Data.SqlClient Public Class Form1 Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Private Sub MostrarEstadistica(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim con As New SqlConnection(CadenaConexion) Dim dap As New SqlDataAdapter("Select * FROM Pagos", con) Dim dst As New DataSet() dap.Fill(dst, "Pagos") DataGridView1.DataSource = dst.Tables(0) Try Dim cmd As New SqlCommand("", con) con.Open() With cmd .CommandText = "Select Count(Monto) From Pagos" Dim CantidadPagos As Integer = .ExecuteScalar ListBox1.Items.Add("Cantidad de Pagos " & CantidadPagos.ToString) .CommandText = "Select Min(Monto) From pagos" Dim PagoMinimo As Decimal = .ExecuteScalar ListBox1.Items.Add(" Minimo pago " & PagoMinimo.ToString) .CommandText = "Select max(monto) From pagos" Dim PagoMaximo As Decimal = .ExecuteScalar ListBox1.Items.Add("Pago maximo " & PagoMaximo.ToString) .CommandText = "Select Avg(Monto) From Pagos" Dim PagoPromedio As Decimal = .ExecuteScalar ListBox1.Items.Add("Pago promedio " & PagoPromedio.ToString) .CommandText = "Select sum(monto) From pagos" Dim PagoSuma As Decimal = .ExecuteScalar ListBox1.Items.Add("Suma de Notas " & PagoSuma.ToString) .CommandText = "Select StDev(monto) From pagos" Dim DesviacionPagos As Decimal = .ExecuteScalar ListBox1.Items.Add("Desviacion de Pagos " & DesviacionPagos.ToString) End With Catch ex As Exception MsgBox(ex.Message) Finally con.Close() End Try End Sub End Class

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -10

2 TRABAJANDO CON COMANDOS DE SELECCIN 3.1 CLASE SQLDATAREADER Todos los comandos de seleccin usan el objeto DataReader para almacenar los datos recuperados por la instruccin SQL. El objeto DataReader tiene las siguientes caractersticas: Este es muy rpido y consume pocos recursos de memoria ya que mantiene una sola fila a la vez. Solo permite el desplazamiento hacia adelante (ForwardOnly) No sirve para modificar registros No es enlazable a controles Windows ( No Binding Windows Controls) para mostrar los datos hay que leer y mostrar registro por registro.
1. Para recuperar un valor del DataReader usar la propiedad Value de los mtodos

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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -11 Existen varias formas de leer un valor de un campo en un DataReader pero la mejor forma es especificar el tipo de del origen de datos y el ndice del campo, tal como se aprecia en el cdigo anterior Cuando se lee un campo que no tiene dato , es decir es nulo , se producir un error , para esto debe verificarse primero si el campo tiene datos o no con la propiedad IsNull de los mtodos GetSql. Por ejemplo, para el caso anterior tendramos:

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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -12

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

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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -13

Loop drd.Close() con.Close() End Sub End Class Ejercicio 2 listar los subtotales de pagos por aos

Imports System.Data.SqlClient Public Class Form1 Inherits System.Windows.Forms.Form Private Sub recuperar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnRecuperar.Click Dim CadenaConexion As String = " Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim con As New SqlConnection(CadenaConexion) Dim cmd As New SqlCommand("SELECT YEAR(FechaPago) ,Sum (monto) From Pagos group by Year(fechaPago) ", con) Dim dap As New SqlDataAdapter("Select * FROM pagos", con) Dim dst As New DataSet() dap.Fill(dst, "Alumnos") DataGridView1.DataSource = dst.Tables(0) Dim drd As SqlDataReader con.Open() drd = cmd.ExecuteReader Do While drd.Read ListBox1.Items.Add(drd.GetSqlInt32(0).Value & " " & drd.GetSqlMoney(1).Value)

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -14

Loop drd.Close() con.Close() End Sub End Class Ejercicio 3 Obtener la suma total del monto con codigo

Imports System.Data.SqlClient Public Class Form1 Inherits System.Windows.Forms.Form Private Sub procesar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnProcesar.Click Dim CadenaConexion As String = " Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim con As New SqlConnection(CadenaConexion) Dim cmd As New SqlCommand("SELECT nro,codalumno,Monto From pagos ", con) Dim drd As SqlDataReader con.Open() drd = cmd.ExecuteReader Dim suma As Single = 0 Do While drd.Read ListBox1.Items.Add(drd.GetSqlInt32(0).Value & " " & drd.GetSqlString(1).Value & drd.GetSqlMoney(2).Value) suma = suma + drd.GetSqlMoney(2).Value Loop ListBox1.Items.Add("la suma es " & suma.ToString) drd.Close() con.Close() End Sub End Class 3.3 RECUPERANDO MULTIPLES CONJUNTOS DE DATOS

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -15

Para ejecutar comandos que devuelven mltiples conjuntos de datos tambin se usa el mtodo ExecuteReader del objeto SqlCommand, Ejercicio 1. Generar dos tablas uno de cdigos de alumnos y otro de los nombres de alumnos y luego mostrarlos su contenido

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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -16

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

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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -17

Dim cmd As New SqlCommand("Select CodAlumno ,NombreAlumno,FechaNac from Alumnos;Select Nro, CodAlumno, Fechapago, Monto,CodCurso from Pagos;select codcurso, nombrecurso, profesor from cursos", con) Dim drd As SqlDataReader con.Open() drd = cmd.ExecuteReader ListBox1.Items.Clear() Do While drd.Read ListBox1.Items.Add(drd.GetSqlString(0).Value & drd.GetSqlString(1).Value & " " & drd.GetDateTime(2).Date) Loop Me.Show() If drd.NextResult Then ListBox1.Items.Add("tabla pagos") MsgBox("siguiente tabla") DataGridView1.DataSource = dst.Tables(1) Do While drd.Read ListBox1.Items.Add(drd.GetSqlInt32(0).Value & " " & drd.GetSqlString(1).Value & " " & drd.GetDateTime(2).Date & " " & drd.GetSqlMoney(3).Value & " " & drd.GetSqlString(4).Value) Loop End If Me.Show() If drd.NextResult Then ListBox1.Items.Add("tabla cursos") MsgBox("siguiente tabla") DataGridView1.DataSource = dst.Tables(2) Do While drd.Read ListBox1.Items.Add(drd.GetSqlString(0).Value & " " & drd.GetSqlString(1).Value & " " & drd.GetSqlString(2).Value) Loop End If drd.Close() con.Close() End Sub End Class 1.4 RECUPERANDO IMGENES DESDE UNA BASE DE DATOS SQL

Las imgenes son considerados Objetos Binarios grandes mas conocidos como datos BLOB y se almacenan en un Array de Bytes o caracteres los cuales con recuperados mediante el mtodo GetBytes del DataReader. Para recuperar imgenes desde una base de datos de SQL Server realice los siguientes pasos: 1. Definir el Namespace del proveedor de SQl Imports System.Data.SqlClient 2. Declarar una variable de tipo SqlConecction pasando como parmetro en el constructor la cadena de conexin: Dim con as new sqlConnection(cadena de conexin)

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -18 3. Declarar una variable de tipo

SqlCommand pasando como parmetros en el constructor la instruccin Select y la conexin usada: Dim cmd as New SqlCommand (Select Lista_Campos From Tabla, con)
4. Abrir la conexin mediante el mtodo Open del objeto de conexin

mediante el mtodo ExecuteReader pasando como parmetro CommandBehavior.SequentialAccess y almacenar los datos en objeto de tipo SqlDataReader Dim drd As SqlDataReader=cmd.ExecuteReader (CommandBehavior.SequentialAccess) Nota.- El parmetro CommnadBehavior:SequentialAccess se usa para ir cargando en forma secuencial datos grandes conforme se necesitan . Esto es solo es aplicable a SQLServer; ya que el MS Access los datos BLOB se cargan por completo en el DataReader
6. Usar el Mtodo Read del SqlDataReader para leer un registro . Este devuelve True

5. Ejecutar la instruccin

si hay registros y False si no hay registros que leer Drd.Read() 7. Para recuperar un valor simple del DataReader usar la propiedad Value de los mtodos GetSql para leer una imagen o dato BLOB usar la propiedad value del Mtodo GetSqlBinary que devuelve una array de bytes Dim Valor as Integer = drd.GetSqlInt32(0).Value Dim Img() as Byte =drd.GetSqlBinary(1).value Nota.- Cuando usamos el parmetro CommandBehavior .SequentialAccess es necesario leer en orden los campos de DataReader
8. Declarar una variable de tipo MemoryStream que almacena la imagen en memoria

Dim ms as new MemoryStream


9. Escribir el array de bytes en el flujo de memoria usando el mtodo Write del

objeto Memory Stream: Ms.Write(img, o, img.Length() Cargar el flujo de memoria en la imagen de algn control como el PictureBox usando el mtodo FromStream de la clase Image PicFigura.Image = Image.FromStream(ms) 11. Cerrar el Flujo de memoria abierto usando el mtodo Close: Ms.Close() 12. Despus de leer todos los registros de DataReader cerrar el objeto con el mtodo Close Drd.close() 13. Cerrar la conexin mediante el mtodo Close del objeto Conexin: Con.Close()
10.

DEMO 43 Recuperar imgenes desde una base de datos SqlDataReader y mostrar la imgenes en un PictureBox

usando el objeto

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -19

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

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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -20

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

Todos estos comandos tienen la caracterstica de realizar cambios sobre el origen de datos y no deben retornar registros excepto un valor indicando la cantidad de registros afectados, por lo que se ejecutan con el mtodo ExecuteNonQuery el objeto Command. 1.1 INSERTANDO REGISTROS Para insertar registros se usa la instruccin Insert de SQL 1.2 ACTUALIZANDO REGISTROS Para actualizar registros se usa la instruccin Update de SQL, 1.3 ELIMINANDO REGISTROS

Para eliminar registros se usa la instruccin Delete de SQL

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -21

Ejercicio 1. (demo 44) Usando la base de datos alumnos elabore una aplicacin para el mantenimiento de la tabla alumnos donde se permita agregar, actualizar y eliminar registros Imports System.Data.SqlClient 'Para Usar SqlConnection, SqlCommand,SqlDataReader Imports System.Text 'Para usar StringBuilder Imports System.IO 'Para usar StreamWriter Public Class Form1 Inherits System.Windows.Forms.Form Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim con As New SqlConnection(CadenaConexion) Dim cmd As New SqlCommand("", con) Dim stb As New StringBuilder() 'Concatenar datos Dim reg As Integer 'Numero de Registros Afectados Dim pc As String 'Nombre de la PC Cliente con error Private Sub ListarAlumnos() ListBox1.Items.Clear() con.Open() pc = con.WorkstationId cmd.CommandText = "Select CodAlumno,NombreAlumno,FechaNac From alumnos" Dim drd As SqlDataReader = cmd.ExecuteReader Do While drd.Read stb.Append(drd.GetSqlString(0).ToString.PadRight(5)) REM codalu stb.Append(drd.GetSqlString(1).ToString.PadRight(25)) REM nombre stb.Append(drd.GetDateTime(2).ToString.PadRight(30)) REM FechaNaca ListBox1.Items.Add(stb.ToString) 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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -22

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) 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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -23

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 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)

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -24

MessageBox.Show(ex.Message, ex.Source, MessageBoxButtons.OK, MessageBoxIcon.Error) Finally If con.State = ConnectionState.Open Then con.Close() stb.Length = 0 ListarAlumnos() BtnAdicionar.Enabled = False End Try End If End Sub End Class

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -25

TRABAJANDO EN FORMA DESCONECTADA


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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -26

End Sub End Class

Ejercicio3 Mostrar varias tablas en un datagrid

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -27

El rayado interior se obtiene con alternatebackcolor CODIGO Imports System.Data.SqlClient Public Class Form1 Inherits System.Windows.Forms.Form ' variables a nivel de clase para la manipulacin de datos Private DataAdapter As SqlDataAdapter Private DataSet As DataSet Private Sub frmNormal_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load ' crear conexin Dim Conexion As New SqlConnection() Conexion.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" ' crear adaptadores Dim DAlumnos As New SqlDataAdapter("SELECT * FROM Alumnos", Conexion) Dim DCursos As New SqlDataAdapter("SELECT * FROM Cursos", Conexion) Dim DPagos As New SqlDataAdapter("SELECT * FROM Pagos", Conexion) ' crear dataset Dim DataSet As New DataSet() DAlumnos.Fill(DataSet, "Alumnos") DCursos.Fill(DataSet, "Cursos") DPagos.Fill(DataSet, "Pagos") ' asignar dataset a datagrid Me.DataGrid1.DataSource = DataSet End Sub End Class 1.3 AGREGANDO RELACIONES ENTRE TABLAS DATASET Una DataSet no solo puede contener una tabla sino varias y estos pueden estar relacionadas . Dicha relacin no es sobre la base de datos, sino sobre el objeto en la memoria del cliente (el DataSet) Las relaciones entre tablas del Dataset se usan para garantizar la integridad de datos (clave fornea) al momento de trabajar con datos en el cliente. 1.3.1 Clase DataRelation 1.3.2 Creando y agregando una Relacin en el DataSet Para crear una relacin entre dos tablas se usa el objeto DataRelation y para agregarlo al DataSet se usa el mtodo Add de la coleccin Relations del DataSet:, tal como se precia en el siguiente modelo de trabajo

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -28

7. Declare una variable de tipo data relation pasando 3 parametros en el comstructor prmero el nombre del la relacin , segundo las(s) columnas en la tablas padre y tercero las(s) columnas(s) de la tabla hija Dim drn as new datarelation(relacion,col_Tabla1, Col_Tabla2) Nota.- El segundo y tercer parmetro puede ser un solo campo a un arreglo de campos en el caso de que la clave esta formada por varios campos Agregar la relacin creada a la coleccin de relaciones del Dataset mediante el mtodo Add de la colecci Relations: dst.relatons.Add(drn)
8.

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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -29

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -30

CODIGO Imports System.Data.SqlClient Public Class Form1 Private Sub LitarAlumnosagos(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim con As New SqlConnection(CadenaConexion) Dim dap As New SqlDataAdapter("", con) Dim dst As New DataSet() dap.SelectCommand.CommandText = "Select CODALUMNO,NOMBREALUMNO,fechanac FROM alumnos" dap.Fill(dst, "Alumnos") dap.SelectCommand.CommandText = "Select NRO,CODALUMNO,FECHAPAGO,MONTO,CODCURSO FROM PAGOS" dap.Fill(dst, "pagos") Dim drn As New DataRelation("Alumnos_Pagos", dst.Tables(0).Columns(0), dst.Tables(1).Columns(1)) dst.Relations.Add(drn) DataGrid1.DataSource = dst.Tables(0) DataGrid1.Expand(0) End Sub End Class Relacion entre la tabla cursos y pagos

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -31

Imports System.Data.SqlClient Public Class Form1 Private Sub LitarAlumnosagos(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim con As New SqlConnection(CadenaConexion) Dim dap As New SqlDataAdapter("", con) Dim dst As New DataSet() dap.SelectCommand.CommandText = "Select CODALUMNO,NOMBREALUMNO,fechanac FROM alumnos" dap.Fill(dst, "Alumnos") dap.SelectCommand.CommandText = "Select NRO,CODALUMNO,FECHAPAGO,MONTO,CODCURSO FROM PAGOS" dap.Fill(dst, "pagos") dap.SelectCommand.CommandText = "Select CODCURSO, NOMBRECURSO,PROFESOR FROM CURSOS" dap.Fill(dst, "CURSOS") Dim drn As New DataRelation("CURSOS_Pagos", dst.Tables(2).Columns(0), dst.Tables(1).Columns(4)) dst.Relations.Add(drn) DataGrid1.DataSource = dst.Tables(2) DataGrid1.Expand(0) End Sub End Class TAREA como obtener la relacion alumnos con cursos, dado un alumno listar que cursos lleva Nota DataGrid1.DataSource = dst.Tables(1) / lista la tabla pagos DataGrid1.DataSource = dst.Tables(0) lista la tabla alumnos

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -32

TRABAJANDO CON TABLAS

Como ya sabemos el DataSet est compuesto por uno o ms tablas, las cuales pueden contener registros. En un esquema desconectado todas las operaciones deben realizarse dentro de las tablas o vistas de una tabla en el DataSet 2.1 Clase DataTable 2.2 Realizando el Mantenimiento de Datos El Objeto DataTable tiene mtodos que permiten realizar operaciones con los registros de la tabla, tales como insercin de nuevos registros, actualizacin de datos o eliminacin de registros. 2.1.1 Insertando Registros en un tabla Para insertar un nuevo registros en una tabla primero debe crearse un Objeto DataRow que tenga la estructura de una fila existente de la tabla, la cual se obtiene con el mtodo NewRow del Objeto DataTable Luego debe llenarse los datos del DataRow y finalmente agregarse a la coleccin de Rows del DataTable mediante el mtodo Add. 4 Crear un objeto DataRow que tome la estructura de una fila de la tabla mediante el mtodo NewRow Dim drw as datrow= dst.tables(0).NewRow 5 Llenar los campos del DataRow con los valores deseados , por ejemplo ,para una tabla con 3 columnas tenemos Drw(0)= valor1 Drw(1)= valor2 Drw(2)= valor3 3 Finalmente agregar el dataRow a la coleccin de filas de la tabla mediante el mtodos Add de la coleccin Rows de DataTable Dst.Tables(0).Add(drw) 2.2.2 Actualizando Registros de una Tabla Para actualizar un registro existente en una tabla primero debe de seleccionarse la fila que se desea actualizar creando un objeto DataRow que apunte a dicha fila Para Empezar la edicin debe usarse el Mtodo BeginInt del DataTable, luego debe llenarse los datos del DataRow y finalmente debe llamarse al mtodo EndInit A continuacin presentamos la forma de actualizar un registro de una tabla 4 Crear un objeto DataRow que apunte a la fila de la tabla que se desea modificar Dim drw as DataRow= dst.tables(0),rows(N) Nota.- El Prmetro N indica el indice de la fila que se desea modificar 5 Llamar al mtodo BeginInit del DataTable para empezar la edicin de un registro de la tabla

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -33

Dst.tables(0).BeginInt() 6. Actualizar los campos de DataRow con los valores desados , por ejemplo , para una tabla con 3 columnas tenemos Drw(0)= valor1 Drw(1)= valor2 Drw(2)= valor3 7. Finalmente llamar al mtodo EndInit del Datatable para finalizar la edicin del registro de la tabla Dst.Tables(0).EndInit() 2.2.3. Eliminando Registro de una Tabla Para eliminar un registro existente de una tabla primero debe de seleccionarse la fila que se desea eliminar creando un objeto DataRow que apunte a dicha fila. Luego debe llamarse al mtodo Delete del Objeto DataRow para eliminar dicha fila del DataTable 4 Crear un objeto DataRow que apunte a la fila de la tabla que se desea eliminar Dim drw as DataRow= dst.Tables(0).Rows(N) 5. finalmente llamar al mtodo Delete del DataRow para elimnar el registro drw.Delete() Nota.- En realidad el registro slo se marca para despus ser borrado fsicamente al enviar cambios desde la tabla hacia la base de datos. 2.3 Actualizando la Base de Datos Despus de trabajar en forma desconectada con el DataSet , todos los cambios realizados a una Tabla deben ser enviados por lotes hacia la base de daos 2.3.1 Creando comandos para enviar cambios Si los datos de una Tabla fueron obtenidos mediante el mtodo Fill del DataAdapter que ejecut el Select Command , para que estos cambios sean regresados o enviados hacia la base de datos se usa el mtodo Update del DataAdapter Para que se pueda usar el mtodo Update del DataAdapter es necesario que se hayan creado los objetos (propiedades) InsertCommand, UpdateCommand y DeleteCommand del DataAdapter, Existen dos formas de crear dichos comandos en el DataAdapter 1. Manualmente Consiste en escribir las propiedades CommandText de cada ObjetoCommand del DataAdapter similar al cdigo escrito Dap.InsertComand.ComandText =Insert Into Tabla(lista_campos) Values (lista_valores) Dap.updatecommand.Commadtext(update tabla set campo1=valor1, campo2=valor2,. Where (expresion lgica)

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -34

Dap.Deletecommand.CommadText= delete from tabla where (exp.) 2. Automticamente Usando el objeto CommandBuilder que se analiza a continuacin 2.3.2 Clase SqlCommandBuilder El Objeto CommandBuilder se utiliza para generar comandos de actualizacin en forma automtica Para esto el CommandBuilder toma el SelectCommand del DataAdapter y crea automticamente los InsertCommand, UpdateCommand y DeleteCommand Nota.- El nico inconveniente es que el SelectCommand no puede referirse a varias tablas el CommandBuilder solo trabaja con una tabla 2.3.3 Enviando loa cambios hacia la base de datos Para enviar todos los cambios desde la tabla hacia la base de datos se usa el mtodo Update de DataAdapter A continuacin presentamos la forma de enviar cambios hacia la base de datos. 1. Crear una instruccin try.. catch Finally Try End Try 2. Dentro del Try crear un objeto SqlCommandBuilder pasando como parmetro el SqlDataAdapter Dim cbd As New SqlCommandBuilder(dap) 2. Dentro del Try enviar los cambios usando el mtodo Update del objeto SqlDataAdapater pasando como parmetro el DataSet y la tabla Dap.Update(dst,Tabla)
3. Dentro de Catch controlar los posibles errores al momento de actualizar usando la

clase Excetion o una clase DbConcurrrencyExeption, etc

derivada

mas

especifica

con

sqlException

Catch sqlEex As sql exceptions Controlar errores de SqL Catch dvcEx As DbConcurrencyExxeption Controlar errores de concurrencia de base de datos Catch genEex As exception controlar cualquier otro error o errores en general 4. Dentro de Finally ,actualizar los datos de la tabla del Dataset con los ltimos cambios realizados en la base de datos , borrando los registros de la tabla y luego llenndolos nuevamente con el mtodo Fill del SqlDataAdapter Finally Dst.Tables(0).Clear() Dap.Fill(dst,Tabla) End try

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -35

DEMO 47 realizar mantenimiento en una tabla del DataSet y luego enviar los cambios realizados por lotes (Batch). Ejercicio 1. Modificar el demo 47 para el caso de los alumnos 1. Agregar el primer formulario y modifique las propiedades de los siguientes controles Objeto Form1 DataGrid1 Button1 Button2 Button3 Button4 Propiedad Text ReadOnly Name Tag Text Name Tag Text Name Tag Text Name Text Valor Listade Alumnos True BtnNuevo 1 Nuevo BtnEditar 2 Editar BtnEliminar 3 Eliminar BtnEnviarCambios Enviar cambios

Agregue un segundo formulario con siguientes propiedades

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -36

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -37

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -38

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -39

CODI GO DEL PRIMER FORMULARIO Imports System.Data.SqlClient Public Class Form1 Inherits Objeto Propiedad Valor Form1 Text Lista de alumnus GroupBox1 Text Datos de Alumno Button1 Name BtnAceptar DialogResult Ok Text Aceptar Button2 Name BtnCancelar DialogResult Cancel Text Cancelar 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") DataGrid1.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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -40

pos = DataGrid1.CurrentRowIndex 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") DataGrid1.DataSource = dst.Tables(0) End Try End Sub End Class CODI GO DEL SEGUNDO FORMULARIO Imports System.Data.SqlClient Public Class Form2 Inherits System.Windows.Forms.Form Private Sub LimpiarTextos() TextBox1.Clear() TextBox2.Clear() TextBox3.Clear() End Sub 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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -41

MostrarEmpleado() ElseIf opera = Module1.Operacion.Eliminar Then Me.Text = "Eliminar un alumno" GroupBox1.Enabled = False MostrarEmpleado() End If End Sub Private Sub Aceptar(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAceptar.Click With dst.Tables(0) Dim fila As DataRow If opera = Module1.Operacion.Nuevo Then fila = .NewRow fila(0) = TextBox1.Text fila(1) = TextBox2.Text fila(2) = TextBox3.Text .Rows.Add(fila) ElseIf opera = Module1.Operacion.Editar Then .BeginInit() fila = .Rows(pos) fila(0) = TextBox1.Text fila(1) = TextBox2.Text fila(2) = TextBox3.Text .EndInit() ElseIf opera = Module1.Operacion.Eliminar Then fila = .Rows(pos) fila.Delete() End If End With End Sub End Class CODIGO DEL MODULO Module Module1 Public dst As New DataSet() Public pos As Integer Public opera As Operacion Public Enum Operacion Nuevo = 1 Editar = 2 Eliminar = 3 End Enum End Module 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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -42

Las vistas son usadas para diversa tareas tales como Filtrar o seleccionar registros de acuerdo a un criterio Ordenar datos por uno o ms columnas Buscar datos por un cierto campo clave Actualizar datos de la tabla ya sea adicionando editando o eliminando registros ,etc Clase DataView Manejando Datos en una Vista Creando una vista La Vista se crea a partir de los datos de una tabla , mediante la propiedad DefaultView del objeto DataTable que devuelve un Objeto DataView tal como se muestra en le siguiente cdigo Dim dvw As DataView =dst.Tables(n).DefaultView Nota.- N Indica el ndice de la tabla de la cual se desea generar una vista Por ejemplo para crear una vista de productos tenemos Dim dvw As DataView =dst.tables(productos).DefaultView Filtrando datos en una vista Una vez creado la vista se puede filtrar datos de esta , es decir seleccionar ciertos registros de acuerdo a un criterio de seleccin Para filtrar registros de una vista se usa la propiedad RowFilter del objeto DataView. Tal como se muestra en le siguiente cdigo Dvw.RowFilter = criterio de seleccin Nota: El Criterio de Seleccin es una instruccin SQL similar a la usada en la clusula Where. Por ejemplo para ver una vista de productos cuyo cdigo de categora es 1 y cuyo cdigo de Proveedor es 2 tenemos Dvw.RowFilter= CategoryId =1 and SuplierId=2 Ejercicio 1. La siguiente aplicacin obtiene el nmero de registro actual y lo muestra en un cuadro de texto adems muestra los valores de los dems campos en un cuadro de lista, al presionar el botn btnPosicionar posiciona el indicador de registro en el registro indicado en el cuadro de texto

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -43

Imports System.Data.SqlClient Public Class Form3 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 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") DataGrid1.DataSource = dst.Tables(0) End Sub Private Sub DataGrid1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGrid1.Click pos = DataGrid1.CurrentRowIndex TextBox1.Text = pos ListBox1.Items.Clear() ListBox1.Items.Add("COALU ==>" & dst.Tables(0).Rows(pos).Item(0)) ListBox1.Items.Add("NOMBRE ==>" & dst.Tables(0).Rows(pos).Item(1)) ListBox1.Items.Add("FECHANAC ==>" & dst.Tables(0).Rows(pos).Item(2)) End Sub Private Sub PosicionarRegistro(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnPosicionar.Click

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -44

pos = Val(TextBox1.Text) DataGrid1.CurrentRowIndex = pos Dim drw As DataRow = dst.Tables(0).Rows(pos) ListBox1.Items.Clear() ListBox1.Items.Add("COALU ==>" & dst.Tables(0).Rows(pos).Item(0)) ListBox1.Items.Add("NOMBRE ALUMNO ==>" & dst.Tables(0).Rows(pos).Item(1)) ListBox1.Items.Add("FECHANAC ==>" & dst.Tables(0).Rows(pos).Item(2)) End Sub End Sub End Class Nota necesariamente debe haber un campo clave Ejercicio 2. Disear un formulario similar a la siguiente se mueve el cursor a una fila especificada y la aplicacin permite modificar y eliminar registros

CODIGO DEL FORMULARIO Imports System.Data.SqlClient Public Class Form4 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" Public dst As New DataSet() Public pos As Integer Dim con As New SqlConnection(CadenaConexion)

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -45

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") DataGrid1.DataSource = dst.Tables(0) End Sub Private Sub DataGrid1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGrid1.Click pos = DataGrid1.CurrentRowIndex TextBox1.Text = pos TextBox2.Text = dst.Tables(0).Rows(pos).Item(0) TextBox3.Text = dst.Tables(0).Rows(pos).Item(1) TextBox4.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) = TextBox2.Text drw(1) = TextBox3.Text drw(2) = TextBox4.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") DataGrid1.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 Dim drw As DataRow = dst.Tables(0).Rows(pos) drw.Delete() End Sub End Class DEMO 49. filtrar registros en un vista por un campo de tipo cadena de caracteres.

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -46

Se tiene la base de datos Alumnos que tiene la siguiente estructura

La tabla alumnos tiene los siguientes datos

LA TABLA CURSOS TIENE LOS SIGUIENTES DATOS

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -47

LA TABLA PAGOS TIENE LOS SIGUIENTES DATOS

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

CODIGO Imports System.Data.SqlClient Public Class Form1 Inherits System.Windows.Forms.Form Private dvw As DataView Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim con As New SqlConnection(CadenaConexion)

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -48

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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -49

dvw = dst.Tables(1).DefaultView DataGridView1.DataSource = dvw End Sub Private Sub FiltrarOrdenesPorEmpleado(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged Try dvw.RowFilter = "CodCurso ='" & ComboBox1.SelectedValue & "'" Catch ex As Exception 'MsgBox(ex.Message) End Try End Sub End Class

3.2.3 ORDENANDO DATOS EN UNA VISTA Para ordenar datos en la vista debemos usar la propiedad Sort del Objeto DataView especificando el campo por el cual se desea realizar la ordenacin y opcionalmente indicando en cada campo el tipo de ordenacin , que puede ser ascendente o descendente tal como se muestra en el siguiene cdigo dvw.Sort Campo1 [Asc|Desc] campo2 [Asc|Desc] Nota: Por defecto si no se especifica el tipo de ordenacin , esta es ascendente Ejemplo Ordenar la vista de productos por codigo categoria en forma ascedente y si coinciden ordenar por codigo del proveedor en forma descendente dws.sort= CategoryID Asc,SuplierID Desc 3.2.4 Buscando Datos en la vista Para buscar datos en la vista primero sta debe estar ordenada por el campo por el cual se desea buscar, luego debemos usar el mtodo Find del objeto DataView pasando como parametro el dato a buscar tal como se muestra en el siguiente codigo Dim pos as integer = dvw.Find(dato)

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -50

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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -51

CODIGO DEL FORMULARIO Imports System.Data.SqlClient Public Class Form2 Inherits System.Windows.Forms.Form Dim dvw As New DataView() Dim npos As Integer Dim codigo As String 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 CodAlumno,Nombrealumno,FechaNac from alumnos", con) Dim dst As New DataSet() dap.Fill(dst, "Alumnos") 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() End Sub

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -52

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 DataGrid1.UnSelect(npos) npos = dvw.Find(drw(0)(0)) DataGrid1.Select(npos) DataGrid1.CurrentRowIndex = npos 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 DataGrid1.UnSelect(npos) npos = dvw.Find(drw(0)(1)) DataGrid1.Select(npos) DataGrid1.CurrentRowIndex = npos End If End Sub End Class Ejercicio en la tabla pagos buscar por nro de registro y codalumno Imports System.Data.SqlClient Public Class Form2 Inherits System.Windows.Forms.Form Dim dvw As New DataView() Dim npos As Integer Dim pos As Integer Private Sub LlenarDatos() Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim con As New SqlConnection(CadenaConexion)

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -53

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 End Sub Private Sub OrdenarPorNro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OrdenarPorNro.Click dvw.Sort = "Nro Asc" End Sub Private Sub OrdenarPorCodalumno_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OrdenarPorCodalumno.Click dvw.Sort = "CodAlumno Asc" End Sub Private Sub BuscarPorNro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BuscarPorNro.Click dvw.Sort = "Nro Asc" pos = InputBox("ingrese nro de registro") DataGrid1.UnSelect(npos) npos = dvw.Find(pos) DataGrid1.Select(npos) DataGrid1.CurrentRowIndex = npos End Sub Private Sub BuscarCodalumno_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BuscarPorCodalumno.Click Dim nombre1 As String dvw.Sort = "CodAlumno Asc" nombre1 = InputBox("ingrese Codalumno") Dim drw() As DataRow = dvw.Table.Select("Codalumno = '" & nombre1 & "'") If drw.Length > 0 Then DataGrid1.UnSelect(npos) npos = dvw.Find(drw(0)(1)) DataGrid1.Select(npos) DataGrid1.CurrentRowIndex = npos End If End Sub End Class

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -54

4. TRABAJANDO CON CONTROLES ENLAZADOS A DATOS 4.1 ENLAZANDO CONTROLES A DATOS Cuando trabajamos con aplicaciones que manejan datos , stos se presentan en pantalla mediante dos formas Leyendo cada registro del repositorio de datos y mostrndolo en controles Enlazando datos del repositorio de datos a los controles El repositorio de datos puede ser un DataReader en un esquema conectado o una tabla o vista en un esquema desconectado. En la primera tcnica en cada momento hay que estar leyendo del repositorio de datos y mostrando sobre controles simples como etiquetas o cuadros de texto o sobre controles complejos como las listas o el DataGrid En la segunda tcnica slo una vez se realiza el enlace de datos y se muestra sobre controles simples o complejos Creando enlace simple Se llama enlace simple porque se enlaza un campo de un repositorio de datos, que puede ser una tabla o vista del Dataset a un control individual , que puede ser cualquiera de los siguientes controles Una etiqueta (Label) o cuadro de texto (TextBox) en el caso de ser un campo numrico, texto o de fecha y hora Un botn de opcin (RadioButton) o cuadro de verificacin (CheckBox) en caso de ser un campo lgico

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -55

Un cuadro de Imagen(PictureBox) en el caso de ser un campo con Imagen Para crear un enlace simple sobre un control se usa el metodo Add de la coleccin DataBidings que es una propiedad de cada control simple, pasando tres parmetros. Nombre de la propiedad del control donde se mostrar el valor del campo, por ejemplo , si es un control textbox debe ser la porpiedad Text si un control CheckBox debe ser la propiedad Checked Repositorio de datos donde se encuentra el campo, ste puede ser un DataSet , un DataTable o un DataView. Nombre del campo de repositorio de datos que se va a enlazar sobre el control simple. En resumen la sintaxis de un enlace simple queda como sigue: ControlSimple.DatBinding.Add(Propiedad,repositorio,Campo) Por ejemplo para enlazar el campo ProductName de una vista de productos dvw a un cuadro de texto llamado txtNombre se tiene: TxNombre.DataBinding.Add(text,dvw,ProductName) EJERCICIO CREANDO ENLACE SIMPLE Private Sub EnlazarDatos() TextBox1.DataBindings.Add("Text", dvw, "Nombre") End Sub Creando enlace Complejo Se llama enlace complejo porque se enlaza todos los campos de un repositorio de datos , que puede ser una tabla o vista del DataSet a un control que puede ser cualquiera de los siguientes controles Un cuadro de lista (ListBox) o lista desplegable(ComboBox), por defecto se podr trabajar slo con dos campos: uno que se ve (Display Member) y otro que se oculta (ValueMember). Una rejilla de datos (DataGrid) el cual si mostrar todos los campos e inclusive puede ocultar algunos como veremos mas adelante. Para crear un enlace complejo sobre un control se puede hacer de dos formas Configurar sus propiedades DataSource especificando el DataSet DataMember el nombre de la tabla , tal como se muestra debajo; Controlcomplejo.Datasource= dst Controlcomplejo:DataMember= tabla ControlComplejo.DataSource=dst.Tables(N) y en

Nota: Tambin podemos realizar el enlace directamente configurando en la propiedad DataSource la tabla del DataSet Configure el mtodo SetDataBinding pasando como parmetros el Dataset y el nombre de la tabla a enlazar ControlCOmplejo.SetDatBinding(dst,Tabla)

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -56

DEMO 51 enlazar el control DataGrid a tablas de un dataSet usando el mtodo SetDataBinding, tambin se apreciar como se sincronizan dos tablas realcionadas en dos DataGrid Ejercicio 1. Modificar el demo 51 para el caso de los alumnos

Imports System.Data.SqlClient Public Class Form3 Inherits System.Windows.Forms.Form Private Sub EnlazarAlumnoPago(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\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() 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") DataGrid1.DataSource = dst.Tables(0) DataGrid2.DataSource = dst.Tables(1) Dim drn As New DataRelation("Relacion", dst.Tables(0).Columns(0), dst.Tables(1).Columns(1)) dst.Relations.Add(drn) DataGrid1.SetDataBinding(dst, "Alumnos") DataGrid2.SetDataBinding(dst, "Alumnos.Relacion") End Sub End Class

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -57

4.2 DESPLAZAMIENTO EN CONTROLES ENLAZADOS A DATOS 4.2.1 Usando desplazamiento manual En realidad para usar el dezplazamiento manual no es necesario que los controles se enlacen a una tabla o vista de datos, sino que la tcnica consiste en leer cada registro e ir mostrndolo cada vez que se realiza el desplazamiento. Para usar el desplazamiento manual por uan vista realice los siguientes pasos: 1. Definir un objeto de tipo DataView para la vista de datos Dim dvw As DataView 2. Definir una variable de tipo entero que guarde la posicin del registros actual o registro que se desea moastrar Dim pos as integer 3. Crear un procedimiento general que permita mostrar los datos del registro actual en controles simples Private Sub MostrarDatos() Control1.text = dvw(pos)(0) Control2.text= dvw(pos)(1) Control2.text= dvw(pos)(2) ControlPosicion.Text = (pos + 1).ToString & " de " & dvw.Count End Sub Nota: En el cdigo anterior tambin mostramos la posicin la cual empieza en 0, pero para el usuario empieza en 1, es por eso la suma de 1 4 En el evento Load del formulario llenar los datos de la vista y llamar al procedimiento que muestra los datos del registro actual Escribir antes del codigo para conectarse y llenar datos en una tabla Dwn= dst.Tables(0).DefaultView MostrarDaos() Nota: Al llamar por primera vez al procedimiento el valor de la variable pos es por defecto cero, lo que permitir mostrar los datos del primer registro de la vista. 5. Para mostrar el primer registro de la vista configurar el valor de la variable pos en 0 y llamar al procedimiento que presenta los datos. Pos =0 Mostrardatos() 6. Para mostrar el registro anterior al actual, primero verficar que no estamos sobre el primer registro, si se cumple esta condicin disminuir en 1 el valor de la variable pos y llamar al procedimiento que presenta los datos If pos A 0 then Pos = pos-1 MostrarDatos() End if Nota:- Si no incorporamos la condicin y retrocedieramos se genera una Excepcin al tratar de leer una posicin negativa en la vista y mostrarla sobre el control en el procedimietno MostrarDatos

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -58

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

CODIGO DEL FORMULARIO Imports System.Data.SqlClient Public Class Form1 Inherits System.Windows.Forms.Form Private dvw As DataView Private pos As Integer Private Sub MostrarDatos() TextBox1.Text = dvw(pos)(0)

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -59

TextBox2.Text = dvw(pos)(1) TextBox3.Text = dvw(pos)(2) Label4.Text = (pos + 1).ToString & " de " & dvw.Count 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\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() dap.SelectCommand.CommandText = "Select Codalumno,nombrealumno, FechaNac From Alumnos" dap.Fill(dst, "Alumnos") DataGrid1.DataSource = dst.Tables(0) dvw = dst.Tables(0).DefaultView pos = 0 DataGrid1.CurrentRowIndex = pos MostrarDatos() 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 < dvw.Count - 1 Then pos = pos + 1 Case "4" pos = dvw.Count - 1 End Select DataGrid1.CurrentRowIndex = pos MostrarDatos() End Sub End Class 4.2.2 Usando Desplazamiento Automtico En versiones anteriores de ADO la clase recordset vena con mtodos (MoveFirst, MoveLast, MovePrevius, MoveNext y Move) que permitin el desplazamiento en registros y por tanto se visualizabana en controles enlazados. En cambo en ADO.NET existe unobjeto llamdo CurrencyManager que permite realizar el desplazamiento en Controles Windows enlazados a datos

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -60

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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -61

Imports System.Data.SqlClient Public Class Form1 Inherits System.Windows.Forms.Form Private dvw As DataView Private WithEvents cmr As CurrencyManager Private Sub EnlazarDatos() TextBox1.DataBindings.Add("Text", dvw, "CodAlumno") TextBox2.DataBindings.Add("Text", dvw, "NombreAlumno") TextBox3.DataBindings.Add("Text", dvw, "FechaNac") cmr = Me.BindingContext(dvw) End Sub Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\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() dap.SelectCommand.CommandText = "Select codAlumno,NombreAlumno,fechaNac From alumnos" dap.Fill(dst, "Alumnos") dvw = dst.Tables(0).DefaultView DataGrid1.DataSource = dst.Tables(0) EnlazarDatos() Label4.Text = cmr.Position + 1 & " de " & cmr.Count End Sub

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -62

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 Case "2" If cmr.Position > 0 Then cmr.Position = cmr.Position - 1 Case "3" If cmr.Position < cmr.Count - 1 Then cmr.Position = cmr.Position + 1 Case "4" cmr.Position = cmr.Count - 1 End Select DataGrid1.CurrentRowIndex = cmr.Position End Sub Private Sub MostrarPosicion(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmr.PositionChanged Label4.Text = cmr.Position + 1 & " de " & cmr.Count End Sub End Class Ejercicio 2. Buscar por el nombre de alumno

CODIGO DEL FORMULARIO Imports System.Data.SqlClient Public Class Form2 Inherits System.Windows.Forms.Form Private dvw As New DataView()

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -63

Private npos As Integer Private cmr As CurrencyManager 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 Alumnos", con) Dim dst As New DataSet() dap.Fill(dst, "Alumnos") dvw = dst.Tables(0).DefaultView DataGrid1.DataSource = dst.Tables(0) End Sub Private Sub EnlazarDatos() DataGrid1.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 DataGrid1.UnSelect(npos) 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 DataGrid1.Select(pos) npos = pos End If End If End Sub End Class Nota. Se pinta el registro seleccionado
1.3FORMATEANDO CONTROLES ENLAZADOS A DATOS

1.3.1 Formatenado Controles simples

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -64

Cuando enlazamo datos a controles , muchas veces queremos que los datos se presentan con un cierto formato, por ejemplo nmeros con decimales o smboles de moneda Para formatear un campo de control enlazado a datos realice los siguiente: 1 Definir el Nameespace para trabajar con la enumeracin NumberStyles Imports Systems.Globalization 2. Crear un procedimiento que convierta el numero decimal a cadena Private Sub FormtearDecimalAstring(ByVal sender As Object , ByVal c A convertEventArg) C.value=Format(c.value,#,00) End sub 3. Crear un procedimiento que convierta la cadena a un nmero decimal 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 ejecucin , uno para el evento Format y otro para el evento Parse del objeto de enlace (Binding): AddHandler.ObjEnlace.Format.AddressOf FormatearDecimalAString AddHandler.ObjEnlace.Parse .AddressOf ParsearStringADecimal Observaciones: El evento Format del Objeto Binding se produce cuando la propiedad de un control est enlazado a un valor de datos. El Evento Parse del objeto Bindig se produce cuando cambia el valor de un control enlazado a datos 6 Aadir al objeto de enlace sencillo creado a la coleccin de enlaces del control donde se desea dar formato Control.DataBinding .Add(ObjEnlace) 7 Finalmente crear el objeto CurrencyManager que apunte a todos los controles del formulario enlazado a la vista cmr= Me.BindngContext(dvw) DEMO 55 formatear controles con enlace simple especificamente aprenderemos a dar formato decimal a un nmero de un campo enlazado a un control simple Ejercicio 1. Modificar el demo 55 para el caso de los alumnos

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -65

Imports System.Data.SqlClient Imports System.Globalization Public Class Form1 Inherits System.Windows.Forms.Form Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Private dvw As DataView Private WithEvents cmr As CurrencyManager Private Sub FormatearDecimalAString(ByVal sender As Object, ByVal c As ConvertEventArgs) c.Value = Format(c.Value, "#.00") End Sub Private Sub ParsearStringADecimal(ByVal sender As Object, ByVal c As ConvertEventArgs) c.Value = Decimal.Parse(c.Value, NumberStyles.Currency) End Sub Private Sub FormatearFechaaCadena(ByVal sender As Object, ByVal c As ConvertEventArgs) c.Value = Format(c.Value, DateAndTime.DateString) End Sub Private Sub EnlazarDatos() TextBox1.DataBindings.Add("Text", dvw, "Nro") TextBox2.DataBindings.Add("Text", dvw, "CodAlumno") TextBox3.DataBindings.Add("text", dvw, "FechaPago") TextBox4.DataBindings.Add("text", dvw, "Monto") Dim pre As New Binding("Text", dvw, "Monto") AddHandler pre.Format, AddressOf FormatearDecimalAString AddHandler pre.Parse, AddressOf ParsearStringADecimal

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -66

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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -67

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

Imports System.Data.SqlClient Public Class Form1 Inherits System.Windows.Forms.Form Private dvw As DataView Private cboProveedor As New ComboBox() Private c3 As New DataGridTextBoxColumn() Private Sub FormatearDataGrid() Dim dts As New DataGridTableStyle() dts.MappingName = dvw.Table.TableName Dim c1 As New DataGridTextBoxColumn() c1.MappingName = "Nro" c1.HeaderText = "Nro" c1.ReadOnly = True c1.TextBox.BackColor = Color.Red c1.TextBox.ForeColor = Color.Green c1.Width = 40 dts.GridColumnStyles.Add(c1) Dim c2 As New DataGridTextBoxColumn() c2.TextBox.BackColor = Color.GreenYellow c2.TextBox.ForeColor = Color.Gold c2.MappingName = "Fecha"

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -68

c2.HeaderText = "Fecha" c2.Width = 100 dts.GridColumnStyles.Add(c2) c3.MappingName = "CodALu" c3.HeaderText = "CodALu" c3.Width = 40 c3.TextBox.BackColor = Color.Goldenrod c3.TextBox.ForeColor = Color.DarkGreen dts.GridColumnStyles.Add(c3) Dim c4 As New DataGridTextBoxColumn() c4.MappingName = "Pago" c4.HeaderText = "Pago" 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:\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() dap.SelectCommand.CommandText = "Select CodAlumno,NombreAlumno,nota from Tbalumnos" dap.Fill(dst, "Alumnos") dap.SelectCommand.CommandText = "Select nro,fecha,codalu,pago,codcurso from Tbpagos" 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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -69

Try dvw.RowFilter = "CodALu = '" & ComboBox1.SelectedValue & "'" Catch ex As Exception MsgBox(ex.Message) End Try End Sub End Class EJERCICIO CON BINDING NAVIGATOR Vea las propiedades del control BidingNavegatos en enlace controles

Enlazando el control datagrid

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -70

Objeto BindingNavigato r DataGridView

propiedad DataSource DataSource

Valor TbAlumnosBindingSource TbAlumnosBindingSource

EJERCICIOS PRACTICAR SELECCION DE DATOS CON SQL

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -71

Imports System.Data.SqlClient Public Class Form1 Inherits System.Windows.Forms.Form Dim CadenaConexion As String = "Data Source=.\MSSMLBIZ;AttachDbFilename=C:\DATOS\ALUMNOS1.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim con As New SqlConnection(CadenaConexion) Dim dap1 As New SqlDataAdapter("", con) Dim dap2 As New SqlDataAdapter("", con) Dim dst1 As New DataSet() Dim dst2 As New DataSet() Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load dap1.SelectCommand.CommandText = "Select * FROM ALUMNOS" dap1.Fill(dst1, "Alumnos") DataGrid1.DataSource = dst1.Tables(0) End Sub Private Sub BtnEjecutarSQL_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnEjecutarSQL.Click Try dst2.Tables.Clear() dap2.SelectCommand.CommandText = TextBox1.Text dap2.Fill(dst2, "tabla1") DataGrid2.DataSource = dst2.Tables(0) Catch sqlEx As SqlException MsgBox(sqlEx.Message)

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -72

Finally End Try End Sub End Class SELECT Count(*) FROM information_schema.tables TAREA PARA LOS ALUMNOS DE SISTEMAS DE INFORMACION 2009B Cada grupo debe armar su sistema de base de datos en el software que prefiera por ejemplo en Excel, Access, Visual Basic 2005,2008 , SQL server Etc. con preferencia con Visual Basic 2008 o 201 Bajar su sistema y un Pc y demostrar Jugar con la base de datos , como realizar consultas, de seleccin , actualizacin de datos etc. EJEMPLO SIMPLE DE BASE DE DATOS Se tiene el sistema Segunda especialidad Compuesto por las siguientes tablas TABLA ALUMNOS CODALUMNO A1 A2 A3 A4 A5 A6 NOMBRE FECHANAC SEXO JUAN 01/01/1970 H KAREN 01/01/1977 M CARLOS 01/01/1980 H JORGE 01/01/1990 H MARIA 01/01/1993 M JORGE 30/04/1980 H PROFESION INGENIERO GEOLOGO INGENIERO INDUSTRIAL INGENIERO CIVIL ARQUETECTO ENFERMERA PROFESOR

TABLA CURSOS CODCURSO AD M1 C1 C2 C3 C4 NOMBRECURSO Admision Matrcula 1 Ergonomia Gestin de Recursos Humanos Condiciones de Seguridad Salud Ocupacional

TABLA PAGOS NRO CODALUMNO FECHAPAGO TIPO 1 A1 01/04/2007 RECIBO 2 A2 3 A1 01/12/2007 FACTURA 01/02/2008 VOUCHER

NRODOC RUNSA MONTO CODCURSO 1 100 100 AD F1 V1 100 200 100 AD 200 C1

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -73

4 5 6 7 8

A3 A2 A1 A4 A4

01/03/2008 01/02/2009 02/04/2009 03/05/2009 04/08/2009

RECIBO RECIBO TRANSFERENCIA FACTURA VOUCHER

2 3 T1 F2 V2

300 400 500 500 600

100 200 200 200 200

AD C2 C2 AD C1

TABLA NOTAS I D 1 2 3 4 5 6 7 8 CODALUMNO A1 A1 A1 A2 A2 A2 A3 A4 COD CODCURSO NOTA FECHAUEVALUACION PROFESOR AD 18 01/04/2007 P1 M1 0 01/12/2007 P1 C1 11 01/02/2008 P1 AD 12 01/03/2008 P2 C1 13 01/02/2009 P2 C4 14 02/04/2009 P3 C1 10 03/05/2009 P4 C2 17 04/02/2010 P5

TABLA PROFESORES CODPROFESOR NOMBREPROFESOR PROFESION P1 GOMEZ INGENIERO CIVIL INGENIERO DE P2 RIOS SEGURIDAD P3 PEREZ MEDICO P4 LOPEZ MINAS INGENIERO P5 TORRES INDUSTRIAL ID 1 2 3 4 FECHA 01/01/2006 02/02/2007 02/03/2008 02/04/2009 MOTIVO Pago profesores pago proveedores pago Profesores Gastos varios MONTO 100 150 500 300 COD CURSO C1 C1 C2 C4

PROCEDENCIA AREQUIPA LIMA AREQUIPA TACNA PUNO

Su base de datos podra tener las siguientes consultas LISTADOS Listar la tabla alumnos Listar la tabla alumnos con todos los campos Listar la tabla alumnos que aparezcan solo los campos, codalumno , nombre y ordenado por nombre Listar la tabla Cursos

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -74

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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -75

SUBTOTALES TABLA NOMBRES Cantidad de registros de la tabla nombres Cantidad de mujeres Cantidad de varones mayores de 25 aos Cantidad de Ingenieros Subtotales por profesin Cantidad de alumnos por ao TABLA CURSOS Cantidad de registros de la tabla cursos TABLA PAGOS Cantidad de registros de la tabla pagos Subtotales por tipo de pago Subtotales por alumno Subtotales por curso Subtotales por ao Cantidad de pagos por ao Promedio de pagos por curso Promedio de pagos por alumnos TABLA NOTAS Subtotales de cantidad de aprobados y desaprobados y porcentaje Promedio de notas por curso Mostrar el cdigo del alumno que tiene la mas alta nota Mostrar el cdigo del curso donde esta la minima nota Mostra el nombre del alumno que tiene la mas alta nota TABLA PROFESORES Cantidad de profesores Subtotales de profesores por profesin Subtotales de profesores por procedencia Cuantos profesores son de LIMA FILTROS EN VARIAS TABLAS Dado el nombre de un alumno que muestre sus notas Dado el nombre del alumno que muestre sus pagos Dado el nombre del curso que liste la cantidad de alumnos que llevaron el curso y cuanto pagaron Elaborar un listado donde figure el cdigo del alumno, el nombre del alumno , y total de sus pagos Dado el nombre del profesor que liste en que cursos ha enseado CUADRICULAS Cuadricula de notas de alumnos cursos

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -76

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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -77

PROGRAMAS DE LA PRACTICA 3 ADO NET EN MODO CONSOLA CONVERTIDO A WINDOWS FORM


Ejecutar los programas de practica en Windows forms
1. Procedimiento almacenado sin parmetros ( pag 7)

Imports System.Data.SqlClient Public Class Form1 Private Sub btnEsquema_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnValores.Click Dim conn As New SqlConnection conn.ConnectionString = "Data Source=.\sqlexpress; Initial Catalog=ALUMNOS;Integrated Security=True" conn.Open() Dim cmd As SqlCommand = conn.CreateCommand() ' specify stored procedure to execute cmd.CommandType = CommandType.StoredProcedure cmd.CommandText = "PA_Alumnos" ' execute command Dim rdr As SqlDataReader = cmd.ExecuteReader() ' Process the result set While rdr.Read() Me.ListBox1.Items.Add(rdr(0).ToString().PadRight(5) & " " & rdr(1).ToString().PadRight(10) & " " & rdr(2).ToString()) End While Console.ReadLine() rdr.Close() conn.Close() End Sub End Class

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -78

Procedimientos almacenados con parmetros Imports System.Data.SqlClient Public Class Form1 Private Sub btnEsquema_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnValores.Click Dim codigo As String Dim conn As New SqlConnection conn.ConnectionString = "Data Source=.\sqlexpress;Initial Catalog=Alumnos;Integrated Security=True" conn.Open() Dim cmd As SqlCommand = conn.CreateCommand() ' specify stored procedure to execute cmd.CommandType = CommandType.StoredProcedure cmd.CommandText = "Pagos_Alumno" ' create input parameter Dim CodAlumno1 As SqlParameter = cmd.Parameters.Add("@CodAlumno", SqlDbType.NChar, 10) CodAlumno1.Direction = ParameterDirection.Input codigo = InputBox("ingrese codigo alumno", "ingreso", "A1") Me.ListBox1.Items.Clear() CodAlumno1.Value = codigo ' create output parameter Dim rdr As SqlDataReader = cmd.ExecuteReader() ' Process the result set While rdr.Read() Me.ListBox1.Items.Add(rdr(0).ToString().PadRight(5) & " " & rdr(1).ToString().PadRight(5) & " " & _ rdr(2).ToString().PadRight(5) & " " & rdr(3).ToString().PadRight(5) & " " & rdr(4).ToString()) End While rdr.Close() Console.ReadLine() End Sub End Class

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -79

Listar la tabla alumnos usando proveedor de datos SQLServer ( pag 10) Imports System.Data.SqlClient Public Class Form1 Private Sub btnEsquema_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnValores.Click Dim conn As New SqlConnection conn.ConnectionString = "Data Source=.\sqlexpress;Initial Catalog=Alumnos;Integrated Security=True" Dim sql As String = "select * from alumnos" Dim reader As SqlDataReader = Nothing Try conn.Open() Dim cmd As New SqlCommand(sql, conn) reader = cmd.ExecuteReader() ListBox1.Items.Add("Este programa es un demostrativos del uso del proveedor de datos de SQL") ListBox1.Items.Add("consultando base de datos " & conn.Database & " con la sonsulta " & cmd.CommandText) While reader.Read() Me.ListBox1.Items.Add(reader(0).ToString().PadRight(5) & " " & reader(1).ToString().PadRight(5) & " " & reader(2).ToString().PadRight(5)) End While Catch Ex As Exception Console.WriteLine("Error: ", Ex) Finally reader.Close() conn.Close() End Try End Sub End Class

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -80

Pruebe: Crear una aplicacin de Windows Form Simple utilizando el proveedor OLEDB Imports System.Data.OleDb Public Class Form1 Private Sub btnEsquema_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnValores.Click Dim conn As New OleDbConnection conn.ConnectionString = " Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\DATOS\ALUMNOS.accdb" Dim sql As String = "select * from alumnos" Dim reader As OleDbDataReader = Nothing Try conn.Open() Dim cmd As New OleDbCommand(sql, conn) reader = cmd.ExecuteReader() ListBox1.Items.Add("Este programa es un demostrativos del uso del proveedor de datos de OLEDB") ListBox1.Items.Add("consultando base de datos " & conn.Database & " con la sonsulta " & cmd.CommandText) While reader.Read() Me.ListBox1.Items.Add(reader("CodAlumno").ToString().PadRight(5) & " " & reader(1).ToString().PadRight(5) & " " & reader(2).ToString().PadRight(5)) End While Catch Ex As Exception Console.WriteLine("Error: ", Ex) Finally reader.Close() conn.Close() End Try End Sub End Class

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -81

Proveedor de Datos ODBC Listing 9-3. OdbcProvider.vb Imports System.Data.Odbc Public Class Form1 Private Sub btnEsquema_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnValores.Click Dim connString As String = "dsn=AlumnosODBC" Dim sql As String = "select * from alumnos" Dim reader As OdbcDataReader = Nothing Try Dim conn As New OdbcConnection(connString) conn.Open() Dim cmd As New OdbcCommand(sql, conn) reader = cmd.ExecuteReader() ListBox1.Items.Add("Este programa es un demostrativos del uso del proveedor de datos de ODBC") ListBox1.Items.Add("consultando base de datos " & conn.Database & " con la sonsulta " & cmd.CommandText & ControlChars.NewLine) While reader.Read() Me.ListBox1.Items.Add(reader("CodAlumno").ToString().PadRight(5) & " " & reader(1).ToString().PadRight(5) & " " & reader(2).ToString().PadRight(5)) End While Catch Ex As Exception Console.WriteLine("Error: ", e) Finally reader.Close() End Try End Sub End Class

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -82

CAPITULO 10 HACIENDO CONEXIONES


Conectar a SQL Server Express con SqlConnection. A escribir un programa muy simple, slo para abrir y comprobar una conexin: Listing 10-1. ConnectionSql.vb Imports System.Data.SqlClient Public Class Form1 Private Sub btnEsquema_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConectar.Click Dim connstring As String connstring = "Data Source=.\sqlexpress;Integrated Security=True" Dim conn As SqlConnection = New SqlConnection(connstring) ListBox1.Items.Clear() Try conn.Open() ListBox1.Items.Add("conexion abierta") Catch Ex As SqlException MsgBox("Error: " & Ex.ToString) Finally conn.Close() ListBox1.Items.Add("conexion cerrada") End Try End Sub End Class

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -83

Si hay error saldra el siguiente mensaje

Pruebe: Mostrar informacin de conexin. En este ejemplo, ver cmo escribir un programa para mostrar informacin de conexin. Imports System.Data.SqlClient Public Class Form1 Private Sub btnEsquema_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConectar.Click Dim connstring As String

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -84

connstring = "data source = .\sqlexpress; Integrated Security=True" Dim conn As SqlConnection = New SqlConnection(connstring) ListBox1.Items.Clear() Try conn.Open() ListBox1.Items.Add("conexion abierta") ListBox1.Items.Add("propiedades de la conexion") ListBox1.Items.Add("cadena de conexion: " & conn.ConnectionString) ListBox1.Items.Add("base de datos: " & conn.Database) ListBox1.Items.Add("Fuente de datos: " & conn.DataSource) ListBox1.Items.Add("Server Version " & conn.ServerVersion) ListBox1.Items.Add("State: " & conn.State) ListBox1.Items.Add("WorkStationId " & conn.WorkstationId) Catch Ex As SqlException MsgBox("Error:" & Ex.ToString) Finally conn.Close() ListBox1.Items.Add("Conexion cerrada") End Try Console.ReadLine() End Sub End Class

Pruebe: Conectar a SQL Server Express con el proveedor de datos OLE DB. Listing 10-3. ConnectionOleDb.vb Imports System.Data.OleDb Public Class Form1 Private Sub btnEsquema_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConectar.Click Dim connstring As String connstring = "data source = .\sqlexpress;provider = sqloledb;integrated security = sspi"

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -85

Dim conn As OleDbConnection = New OleDbConnection(connstring) ListBox1.Items.Clear() Try conn.Open() ListBox1.Items.Add("conexion abierta") 'Display connection properties ListBox1.Items.Add("propiedades de la conexion") ListBox1.Items.Add("cadena de conexion: " & conn.ConnectionString) ListBox1.Items.Add("base de datos: " & conn.Database) ListBox1.Items.Add("Fuente de datos: " & conn.DataSource) ListBox1.Items.Add("Server Version " & conn.ServerVersion) ListBox1.Items.Add("State: " & conn.State) ListBox1.Items.Add("Proveedor:" & conn.Provider) Catch Ex As OleDbException MsgBox("Error:" & Ex.ToString) Finally conn.Close() ListBox1.Items.Add("Conexion cerrada") End Try Console.ReadLine() End Sub End Class

CAPITULO 11 EJECUTANDO COMANDOS Pruebe: Crear un comando con un Constructor. En este ejemplo, podr crear un objeto SqlCommand pero no hacer nada con l. Listing 11-1. CommandSql.vb

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -86

Imports System.Data.SqlClient Public Class Form1 Private Sub btnEsquema_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCrearComando.Click Dim conn As SqlConnection = New SqlConnection("Data Source=.\sqlexpress;Integrated Security=True; database=Alumnos") Dim cmd As SqlCommand = New SqlCommand ListBox1.Items.Add("Comando creado") Try conn.Open() Catch ex As SqlException Console.WriteLine(ex) Finally conn.Close() ListBox1.Items.Add("Conexin Cerrada") End Try Console.ReadLine() End Sub End Class

Prubelo: utilizando el mtodo ExecuteScalar. Listing 11-2. CommandScalar.vb

Imports System.Data.SqlClient Public Class Form1

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -87

Private Sub btnEsquema_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCrearComando.Click Dim conn As SqlConnection = New SqlConnection("Data Source=.\sqlexpress; Integrated Security=True;database=Alumnos") Dim sql As String = "select count(*) from alumnos" Dim cmd As SqlCommand = New SqlCommand(sql, conn) Console.WriteLine(" .") ListBox1.Items.Add("Comando creado y conectado") Try conn.Open() ListBox1.Items.Add("Numero de alumnos " & cmd.ExecuteScalar()) Catch ex As SqlException MsgBox(ex) Finally conn.Close() ListBox1.Items.Add("Conexion cerrada") End Try Console.ReadLine() End Sub End Class Ejecutar comandos con varios resultados. Para consultas donde est esperando varias filas y columnas que se devolver, utilice al mtodo ExecuteReader() del comando. ExecuteReader() devuelve un lector de datos, una instancia de la clase SqlDataReader Prubelo: utilizando el mtodo ExecuteReader. Listing 11-3. CommandReader.vb Imports System.Data.SqlClient Public Class Form1 Private Sub btnEsquema_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCrearComando.Click Dim conn As SqlConnection = New SqlConnection("database=alumnos;Integrated Security=True;Data Source=.\sqlexpress") Dim sql As String = "select * from alumnos" Dim cmd As SqlCommand = New SqlCommand(sql, conn) ListBox1.Items.Add("Comando creado y conectado .") Try conn.Open() Dim rdr As SqlDataReader = cmd.ExecuteReader While (rdr.Read) ListBox1.Items.Add("Alumno " & rdr.GetValue(0) & " " & rdr.GetValue(1) & " " & rdr.GetValue(2)) End While Catch ex As SqlException

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -88

Console.WriteLine(ex) Finally conn.Close() ListBox1.Items.Add("Coneccion cerrada") End Try End Sub End Class

Prubelo: utilizando el mtodo ExecuteNonQuery. Listing 11-4. Commando NonQuery.vb

Imports System.Data.SqlClient Public Class Form1

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -89

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim conn As SqlConnection = New SqlConnection("Data Source=.\sqlexpress;Integrated Security=True;database=alumnos") 'define consulta escalar Dim sqlqry As String = "select count(*) from alumnos" 'define sentencia insert Dim sqlins As String = "insert into alumnos (Codalumno,nombrealumno,fechanac) values('A9', 'PEPE','1/12/1987')" 'define sentencia delete Dim sqldel As String = "delete from alumnos where Codalumno = 'A9' and Nombrealumno = 'PEPE'" 'create commands Dim cmdqry As SqlCommand = New SqlCommand(sqlqry, conn) Dim cmdnon As SqlCommand = New SqlCommand(sqlins, conn) Console.WriteLine("Comando creado y conectado.") Try conn.Open() 'execute query to get number of employees ListBox1.Items.Add("Antes INSERT: Numero de alumnos " & cmdqry.ExecuteScalar()) 'execute nonquery to insert an employee ListBox1.Items.Add("Ejecutando sentencia " & cmdnon.CommandText) cmdnon.ExecuteNonQuery() ListBox1.Items.Add("DESPUES INSERT: Numero de alumnos " & cmdqry.ExecuteScalar()) 'execute nonquery to delete en alumno cmdnon.CommandText = sqldel ListBox1.Items.Add("Ejecutando sentencia " & cmdnon.CommandText) cmdnon.ExecuteNonQuery() ListBox1.Items.Add("DESPUES DELETE: Numero de alumnos " & cmdqry.ExecuteScalar()) Catch ex As SqlException MsgBox(ex) Finally conn.Close() ListBox1.Items.Add("Conneccion cerrada.") End Try End Sub End Class Prubelo: uso de parmetros de comando Listing 11-5. CommandParameters.vb Imports System.Data.SqlClient Public Class Form1

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -90

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim CodAlu As String = "A8" Dim NombreAlu As String = "MIGUEL" 'create connection Dim conn As SqlConnection = New SqlConnection _ ("Data Source=.\sqlexpress;Integrated Security=True;database=alumnos") 'define scalar query Dim sqlqry As String = "select count(*)from alumnos" 'define insert statement Dim sqlins As String = "insert into alumnos (codalumno,nombrealumno)values(@codalu,@nombrealu)" 'define delete statement Dim sqldel As String = "delete from alumnos where Codalumno = @codalu and nombrealumno = @nombrealu" 'create commands Dim cmdqry As SqlCommand = New SqlCommand(sqlqry, conn) Dim cmdnon As SqlCommand = New SqlCommand(sqlins, conn) cmdnon.Prepare() 'add parameters to the command for statements cmdnon.Parameters.Add("@CodAlu", SqlDbType.NChar, 10) cmdnon.Parameters.Add("@Nombrealu", SqlDbType.VarChar, 50) Try conn.Open() 'execute query to get number of employees ListBox1.Items.Add("ANTES INSERT: Numero de alumnos " & cmdqry.ExecuteScalar()) 'execute nonquery to insert an employee cmdnon.Parameters("@codalu").Value = codalu cmdnon.Parameters("@nombrealu").Value = nombrealu ListBox1.Items.Add("Ejecutando sentencia " & cmdnon.CommandText) cmdnon.ExecuteNonQuery() ListBox1.Items.Add("DESPUES INSERT: Numero de alumnosempleados " & cmdqry.ExecuteScalar()) 'execute nonquery to delete an employee cmdnon.CommandText = sqldel ListBox1.Items.Add("Executando sentencia " & cmdnon.CommandText) cmdnon.ExecuteNonQuery() ListBox1.Items.Add(" DESPUES DELETE: Numero de alumnos " & cmdqry.ExecuteScalar()) Catch ex As SqlException ListBox1.Items.Add(ex) Finally conn.Close() ListBox1.Items.Add("Connecion cerrada.") End Try End Sub End Class

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -91

CAPITULO 12 USANDO DATA READERS Listando un solo campo Listing 12-1. DataLooper.vb

Imports System.Data.SqlClient Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim connstring As String = "Data Source=.\sqlexpress;Integrated Security=True;database=alumnos" Dim sql As String = "select * from alumnos" Dim conn As SqlConnection = New SqlConnection(connstring) Try conn.Open() Dim cmd As SqlCommand = New SqlCommand(sql, conn) 'create data reader

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -92

Dim rdr As SqlDataReader = cmd.ExecuteReader 'loop through result set While (rdr.Read) ListBox1.Items.Add(rdr.GetValue(0)) End While rdr.Close() Catch Ex As Exception ListBox1.Items.Add("Error Occurred:" & Ex.ToString) Finally conn.Close() End Try End Sub End Class Pruebe: Utilizando los indizadores ordinales. Ya visto Listando varios campos

Imports System.Data.SqlClient Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim connstring As String = "Data Source=.\sqlexpress;Integrated Security=True;database=alumnos" Dim sql As String = "select * from alumnos" Dim conn As SqlConnection = New SqlConnection(connstring) Try conn.Open() Dim cmd As SqlCommand = New SqlCommand(sql, conn) Dim rdr As SqlDataReader = cmd.ExecuteReader While (rdr.Read) ListBox1.Items.Add(rdr.GetValue(0) & " " & rdr.GetValue(1) & " rdr.GetValue(2)) End While rdr.Close() Catch Ex As Exception

"&

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -93

ListBox1.Items.Add("Error Occurred:" & Ex.ToString) Finally conn.Close() End Try End Sub End Class Uso de columnas indexado por nombre (pag 18) Imports System.Data.SqlClient Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim cadenaconexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim conn As SqlConnection = New SqlConnection(cadenaconexion) Dim sql As String = "select * from alumnos" Try conn.Open() Dim cmd As SqlCommand = New SqlCommand(sql, conn) Dim rdr As SqlDataReader = cmd.ExecuteReader While (rdr.Read) ListBox1.Items.Add(rdr("CodAlumno").ToString & " " & rdr("NombreAlumno").ToString & " " & rdr("FechaNac").ToString) End While rdr.Close() Catch Ex As Exception ListBox1.Items.Add("Error Occurred:" & Ex.ToString) Finally conn.Close() End Try End Sub End Class

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -94

Pruebe: Utilizando los mtodos de descriptor de acceso con tipo. Imports System.Data.SqlClient Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim connstring As String = ("Data Source=.\sqlexpress;Integrated Security=True;database=ALUMNOS") Dim sql As String = "select nro,codalumno, fechapago, monto , codcurso from pagos " Dim conn As SqlConnection = New SqlConnection(connstring) Try conn.Open() Dim cmd As SqlCommand = New SqlCommand(sql, conn) ListBox1.Items.Clear() Dim rdr As SqlDataReader = cmd.ExecuteReader While (rdr.Read) ListBox1.Items.Add(rdr.GetInt32(0) & " " & rdr.GetString(1) & " " & rdr.GetSqlDateTime(2).ToString & " " & rdr.GetDecimal(3) & " " & rdr.GetString(4)) End While rdr.Close() Catch Ex As Exception ListBox1.Items.Add("Error Occurrido:" & Ex.ToString) Finally conn.Close() End Try Console.ReadLine() End Sub End Class

Obtener datos sobre datos. Listing 12-4. ResultSetInfo.vb Imports System.Data.SqlClient

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -95

Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim connstring As String = "Data Source=.\sqlexpress;Integrated Security=True;database=alumnos" Dim sql As String = "select nro , codalumno, fechapago , monto, codcurso from pagos" Dim conn As SqlConnection = New SqlConnection(connstring) Try conn.Open() Dim cmd As SqlCommand = New SqlCommand(sql, conn) Dim rdr As SqlDataReader = cmd.ExecuteReader 'get column names ListBox1.Items.Add("Column Name: " & rdr.GetName(0).PadRight(20) & " " & rdr.GetName(1)) 'get column data types ListBox1.Items.Add("Data Type:" & rdr.GetDataTypeName(0).PadRight(20) & " " & rdr.GetDataTypeName(1)) While (rdr.Read) 'get column values for all rows ListBox1.Items.Add(rdr.GetInt32(0) & " " & rdr.GetString(1) & " " & rdr.GetDateTime(2) & " " & rdr.GetDecimal(3)) End While 'get number of columns ListBox1.Items.Add("Number of columns in a row: " & rdr.FieldCount) 'get info about each column ListBox1.Items.Add(" nombre columna " & rdr.GetName(1) & " indice " & rdr.GetOrdinal("Nro").ToString & " y el tipo de objeto " & rdr.GetFieldType(0).ToString) ListBox1.Items.Add(" nombre columna " & rdr.GetName(1) & " indice " & rdr.GetOrdinal("CodAlumno") & " y el tipo de objeto " & rdr.GetFieldType(1).ToString) ListBox1.Items.Add(" nombre columna " & rdr.GetName(1) & " indice " & rdr.GetOrdinal("FechaPago") & " y el tipo de objeto " & rdr.GetFieldType(2).ToString) ListBox1.Items.Add(" nombre columna " & rdr.GetName(1) & " indice " & rdr.GetOrdinal("Monto") & " y el tipo de objeto " & rdr.GetFieldType(3).ToString) rdr.Close() Catch ex As Exception ListBox1.Items.Add("Error Occurred:" & ex.ToString) Finally conn.Close() End Try End Sub End Class

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -96

Pruebe: Obtener informacin de esquema. Aqu podr ver una demostracin prctica del mtodo GetSchemaTable Listing 12-5. SchemaTable.vb Imports System.Data.SqlClient Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim connstring As String = ("Data Source=.\sqlexpress; Integrated Security=True; database=alumnos") Dim sql As String = "select * from alumnos" Dim conn As SqlConnection = New SqlConnection(connstring) Try conn.Open() Dim cmd As SqlCommand = New SqlCommand(sql, conn) Dim rdr As SqlDataReader = cmd.ExecuteReader 'almacenando esquema de alumnos en data table Dim schema As DataTable = rdr.GetSchemaTable Dim row As DataRow For Each row In schema.Rows Dim col As DataColumn For Each col In schema.Columns ListBox1.Items.Add(col.ColumnName.ToString & " = " & row(col).ToString) Next col ListBox1.Items.Add("----------------") Next row rdr.Close() Catch ex As Exception ListBox1.Items.Add("Error Occurred:" & ex.ToString) Finally

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -97

conn.Close() End Try Console.ReadLine() End Sub End Class

Probar: administrar varios conjuntos de resultados. En este ejemplo, utilizar NextResult() para procesar varios conjuntos de resultados. Imports System.Data.SqlClient Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim connstring As String = "Data Source=.\sqlexpress; Integrated Security=True;database=ALUMNOS" Dim sql1 As String = "SELECT * FROM ALUMNOS " Dim sql2 As String = "SELECT * FROM PAGOS " Dim sql3 As String = "SELECT * FROM CURSOS " Dim sql As String = sql1 + sql2 + sql3 Dim conn As SqlConnection = New SqlConnection(connstring) Try conn.Open() Dim cmd As SqlCommand = New SqlCommand(sql, conn) 'create data reader Dim rdr As SqlDataReader = cmd.ExecuteReader

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -98

Dim contador As Integer = 0 Do ListBox1.Items.Add("TABLA " & " " & contador) While rdr.Read() ListBox1.Items.Add(rdr(0) & " " & rdr(1) & " " & rdr(2)) End While ListBox1.Items.Add("=================") contador = contador + 1 Loop While rdr.NextResult() Catch ex As Exception ListBox1.Items.Add("Error Occurred:" & ex.ToString) Finally conn.Close() End Try End Sub End Class

CAPITULO 13 USANDO DATSET Y DATAADAPTERS Pruebe: Llenar un Dataset con un adaptador de datos. Imports System.Data.SqlClient Public Class Form1

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -99

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" 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, "ALUMNOS") 'get data table Dim dt As DataTable = ds.Tables("ALUMNOS") 'display data Dim row As DataRow For Each row In dt.Rows Dim col As DataColumn For Each col In dt.Columns ListBox1.Items.Add(row(col)) Next col ListBox1.Items.Add("".PadLeft(20, "="c)) Next row Catch ex As Exception ListBox1.Items.Add("Error Occurred:" & ex.ToString) Finally conn.Close() End Try End Sub End Class

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -100

Pruebe: Llenar un Dataset con un adaptador de datos a un control Datagrid. Imports System.Data.SqlClient Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim connstring As String = "Data Source=.\sqlexpress;Integrated Security=True;database=alumnos" 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") 'get data table Dim dt As DataTable = ds.Tables("PAGOS") DataGridView1.DataSource = dt Catch ex As Exception MsgBox("Error Occurred:" & ex.ToString) Finally conn.Close() End Try End Sub End Class

Podra usar tambin DataGridView1.DataSource = ds.Tables("PAGOS")

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -101

Ejemplo mostrar el elemento de la fila y columna determinada

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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -102

ListBox1.Items.Add("nombre de la primera columna: " & ds.Tables(0).Columns(0).ColumnName) ListBox1.Items.Add("tipo de dato de la primera columna: " & ds.Tables(0).Columns(0).DataType.ToString) ListBox1.Items.Add(" elemnto de la tercera fila y segunda columna " & ds.Tables(0).Rows(2).Item(1)) Catch ex As Exception ListBox1.Items.Add("Error Occurred:" & ex.ToString) Finally conn.Close() End Try End Sub End Class Pruebe: filtrando y ordenando dinmicamente datos en un Dataset. Filtrar por el cdigo del alumno ordenado por monto Imports System.Data.SqlClient Public Class Form1 Dim codigo As String 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" Dim sql1 As String = "select nro, codalumno, Monto from pagos" Dim conn As SqlConnection = New SqlConnection(connstring) Try conn.Open() Dim da As SqlDataAdapter = New SqlDataAdapter da.SelectCommand = New SqlCommand(sql1, conn) Dim ds As DataSet = New DataSet da.Fill(ds, "pagos") DataGridView1.DataSource = ds.Tables(0) Dim dtc As DataTableCollection = ds.Tables ListBox1.Items.Add("Results de la consulta " & sql1) ListBox1.Items.Add(("Nro".PadRight(10) + "Codalumno".PadLeft(10) + "Monto".PadLeft(10) + ControlChars.Lf)) '' set display filter Dim fl As String = "codalumno = '" & codigo & "'" ' set sort Dim srt As String = "Nro" ' display filtered and sorted data Dim row As DataRow For Each row In dtc("pagos").Select(fl, srt) ListBox1.Items.Add(row("Nro").ToString.PadLeft(10) & " " & row("CodAlumno").ToString.PadLeft(10) & " " & row("Monto").ToString.PadLeft(10)) Next row ' display data from second data table

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -103

Catch ex As Exception ListBox1.Items.Add("Error Occurred:" & ex.ToString) Finally conn.Close() End Try End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ComboBox1.SelectedIndex = 0 End Sub Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged codigo = ComboBox1.Items(ComboBox1.SelectedIndex) End Sub End Class

Pruebe: Modificar una tabla de datos en un Dataset. Imports System.Data.SqlClient Public Class Form1 Dim codigo As String Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -104

Dim connstring As String = "Data Source=.\sqlexpress;Integrated Security=True;database=Alumnos" Dim sql As String = "select * from alumnos " Dim conn As SqlConnection = New SqlConnection(connstring) Try Dim da As New SqlDataAdapter() da.SelectCommand = New SqlCommand(sql, conn) Dim ds As New DataSet() da.Fill(ds, "alumnos") Dim dt As DataTable = ds.Tables("alumnos") DataGridView1.DataSource = dt ' Codalumno column should be nullable dt.Columns("codalumno").AllowDBNull = True dt.Rows(0)("NombreAlumno") = "ALEJANDRO" ' add a row Dim newRow As DataRow = dt.NewRow() newRow("Codalumno") = "A9" newRow("NombreAlumno") = "MARIA" newRow("FechaNac") = "1/1/1987" dt.Rows.Add(newRow) ' display rows Dim row As DataRow For Each row In dt.Rows ListBox1.Items.Add(row("codalumno").ToString().PadRight(15) & " " & row("nombrealumno").ToString().PadLeft(25) & " " & row("fechanac")) Next row ' code for updating the database would come here Catch ex As Exception ListBox1.Items.Add(("Error: " + ex.ToString)) Finally conn.Close() End Try End Sub End Class

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -105

Propagar cambios a un origen de datos. Listing 13-5. PersistChanges.vb Imports System.Data.SqlClient Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim connstring As String = ("Data Source=.\sqlexpress;Integrated Security=True;database=alumnos") Dim qry As String = "select * from alumnos" Dim upd As String = "update alumnos set NombreAlumno = @Nombre where CodAlumno = @Codigo" Dim conn As SqlConnection = New SqlConnection(connstring) Try Dim da As New SqlDataAdapter() da.SelectCommand = New SqlCommand(qry, conn) Dim ds As New DataSet() da.Fill(ds, "alumnos") ' get data table reference Dim dt As DataTable = ds.Tables("alumnos") ' modifica nombre en la primera fila DataGridView1.DataSource = dt dt.Rows(0)("NombreAlumno") = "Alberto" ' display rows Dim row As DataRow For Each row In dt.Rows ListBox1.Items.Add(row("codalumno").ToString().PadRight(15) & " " & row("nombrealumno").ToString().PadLeft(20) & " " & row("FechaNac")) Next row

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -106

Dim cmd As New SqlCommand(upd, conn) cmd.Parameters.Add("@Nombre", SqlDbType.VarChar, 50, "nombrealumno") Dim parm As SqlParameter = cmd.Parameters.Add("@codigo", SqlDbType.NChar, 10, "codalumno") parm.SourceVersion = DataRowVersion.Original ' Update database da.UpdateCommand = cmd da.Update(ds, "alumnos") Catch Ex As Exception ListBox1.Items.Add(("Error: " + Ex.ToString)) Finally conn.Close() End Try Console.ReadLine() End Sub End Class

Pruebe: Propagacin de nuevas filas de conjunto de datos a un origen de datos. Vamos a propagar una nueva fila a la base de datos, en una variante ModifyDataTable.vb en listado de 13-4. Listing 13-6. PersistAdds.vb Imports System.Data.SqlClient

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -107

Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim connstring As String = ("Data Source=.\sqlexpress;Integrated Security=True;database=alumnos") Dim qry As String = "select * from alumnos" 'SQL to insert alumnos Dim ins As String = "insert into alumnos (codalumno,nombrealumno,FechaNac)" & _ "values(@codigo,@nombre,@Fecha)" Dim conn As SqlConnection = New SqlConnection(connstring) Try Dim da As New SqlDataAdapter() da.SelectCommand = New SqlCommand(qry, conn) Dim ds As New DataSet() da.Fill(ds, "alumnos") ' get data table reference Dim dt As DataTable = ds.Tables("alumnos") DataGridView1.DataSource = dt ' add a row Dim newRow As DataRow = dt.NewRow() newRow("codalumno") = "A25" newRow("NombreAlumno") = "BETTY" 'newRow("FechaNac") = DateTime.Now newRow("FechaNac") = "15/06/2002" dt.Rows.Add(newRow) ' display rows Dim row As DataRow For Each row In dt.Rows ListBox1.Items.Add(row("codalumno").ToString().PadRight(10) & " " & _ row("NombreAlumno").ToString().PadLeft(25) & " " & row("FechaNac").ToString) Next row ' insert alumnos Dim cmd As New SqlCommand(ins, conn) ' map parameters cmd.Parameters.Add("@codigo", SqlDbType.NChar, 10, "Codalumno") cmd.Parameters.Add("@Nombre", SqlDbType.VarChar, 50, "NombreAlumno") cmd.Parameters.Add("@fecha", SqlDbType.DateTime, 50, "FechaNac") ' insert alumnos da.InsertCommand = cmd da.Update(ds, "alumnos") Catch Ex As Exception ListBox1.Items.Add(("Error: " + Ex.ToString)) Finally conn.Close() End Try End Sub

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -108

End Class

Propiedad DeleteCommand. Listing 13-7. PersistDeletes.vb Imports System.Data.SqlClient Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim connstring As String = ("Data Source=.\sqlexpress;Integrated Security=True;database=alumnos") Dim qry As String = "select * from alumnos" Dim del As String = "delete from alumnos where codalumno = @codigo" Dim conn As SqlConnection = New SqlConnection(connstring) Try Dim da As SqlDataAdapter = New SqlDataAdapter da.SelectCommand = New SqlCommand(qry, conn) Dim ds As DataSet = New DataSet da.Fill(ds, "alumnos") Dim dt As DataTable = ds.Tables("alumnos") DataGridView1.DataSource = ds.Tables("alumnos") Dim cmd As SqlCommand = New SqlCommand(del, conn) 'map parameters cmd.Parameters.Add("@codigo", SqlDbType.NChar, 10, "codalumno") 'select alumnos Dim filt As String = "codalumno = 'A7'" Dim row As DataRow For Each row In dt.Select(filt) row.Delete() Next row

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -109

da.DeleteCommand = cmd da.Update(ds, "alumnos") ' display rows For Each row In dt.Rows ListBox1.Items.Add(row("codalumno").ToString.PadRight(5) & " " & row("nombrealumno").ToString().PadLeft(25) & " " & row("FechaNac").ToString().PadLeft(25)) Next row Catch Ex As Exception ListBox1.Items.Add(("Error: " + Ex.ToString)) Finally conn.Close() End Try End Sub End Class

Constructores de comando. Listing 13-8. PersistAddsBuilder.vb Imports System.Data.SqlClient

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -110

Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim connstring As String = ("Data Source=.\sqlexpress;Integrated Security=True;database=alumnos") Dim qry As String = "select * from alumnos" Dim conn As SqlConnection = New SqlConnection(connstring) Try Dim da As New SqlDataAdapter() da.SelectCommand = New SqlCommand(qry, conn) 'create command builder Dim cb As SqlCommandBuilder = New SqlCommandBuilder(da) Dim ds As New DataSet() da.Fill(ds, "alumnos") ' get data table reference Dim dt As DataTable = ds.Tables("alumnos") DataGridView1.DataSource = dt ' add a row Dim newRow As DataRow = dt.NewRow() newRow("codalumno") = "A7" newRow("nombrealumno") = "MARTIN" newRow("fechaNac") = "1/1/2007" dt.Rows.Add(newRow) ' display rows Dim row As DataRow For Each row In dt.Rows ListBox1.Items.Add(row("codalumno").ToString().PadRight(5) & " " & row("nombrealumno").ToString().PadLeft(20) & " " & row("fechanac").ToString) Next row ' insert alumnos da.Update(ds, "alumnos") Catch Ex As Exception ListBox1.Items.Add(("Error: " + Ex.ToString)) Finally conn.Close() End Try End Sub End Class

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -111

Pruebe: Extraccin de un conjunto de datos a un archivo XML. Imports System.Data.SqlClient Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim connstring As String = ("Data Source=.\sqlexpress;Integrated Security=True;database=alumnos") Dim sql As String = "Select * from alumnos" Dim conn As SqlConnection = New SqlConnection(connstring) Try Dim da As SqlDataAdapter = New SqlDataAdapter da.SelectCommand = New SqlCommand(sql, conn) conn.Open() Dim ds As DataSet = New DataSet da.Fill(ds, "alumnos") DataGridView1.DataSource = ds.Tables(0) 'extract dataset to XML file ds.WriteXml("E:\DATOS\alumnostable.xml") ListBox1.Items.Add(" el archivo XML a sido creado") Catch Ex As Exception ListBox1.Items.Add("Error Occurred:" & Ex.ToString) Finally

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -112

conn.Close() End Try End Sub End Class

<?xml version="1.0" standalone="yes" ?> - <NewDataSet> - <alumnos> <CodAlumno>A1</CodAlumno> <NombreAlumno>Alberto</NombreAlumno> <FechaNac>1970-01-01T00:00:00-05:00</FechaNac> </alumnos> - <alumnos> <CodAlumno>A2</CodAlumno> <NombreAlumno>PEDRO</NombreAlumno> <FechaNac>1980-01-01T00:00:00-05:00</FechaNac> </alumnos> - <alumnos> <CodAlumno>A25</CodAlumno> <NombreAlumno>BETTY</NombreAlumno> <FechaNac>2002-06-15T00:00:00-05:00</FechaNac> </alumnos> - <alumnos> <CodAlumno>A3</CodAlumno>

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -113

<NombreAlumno>LUIS</NombreAlumno> <FechaNac>1980-01-01T00:00:00-05:00</FechaNac> </alumnos> - <alumnos> <CodAlumno>A4</CodAlumno> <NombreAlumno>JORGE</NombreAlumno> <FechaNac>1980-01-01T00:00:00-05:00</FechaNac> </alumnos> - <alumnos> <CodAlumno>A5</CodAlumno> <NombreAlumno>MARIO</NombreAlumno> <FechaNac>1980-01-01T00:00:00-05:00</FechaNac> </alumnos> - <alumnos> <CodAlumno>A6</CodAlumno> <NombreAlumno>JOSE</NombreAlumno> <FechaNac>1987-08-01T00:00:00-05:00</FechaNac> </alumnos> - <alumnos> <CodAlumno>A7</CodAlumno> <NombreAlumno>MARTIN</NombreAlumno> <FechaNac>2007-01-01T00:00:00-05:00</FechaNac> </alumnos> </NewDataSet> Pruebe: Rellenar una tabla de datos con un adaptador de datos . Listing 13-10. PopDataTable.vb Imports System.Data.SqlClient Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim connstring As String = ("Data Source=.\sqlexpress;Integrated Security=True;database=alumnos") Dim sql As String = "select * from alumnos " Dim conn As SqlConnection = New SqlConnection(connstring) Try conn.Open() Dim da As SqlDataAdapter = New SqlDataAdapter(sql, conn) Dim dt As DataTable = New DataTable da.Fill(dt) DataGridView1.DataSource = dt 'display data Dim row As DataRow For Each row In dt.Rows Dim col As DataColumn For Each col In dt.Columns

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -114

ListBox1.Items.Add(row(col)) Next col ListBox1.Items.Add("".PadLeft(20, "="c)) Next row Catch Ex As Exception ListBox1.Items.Add("Error Occurred:" & Ex.ToString) Finally conn.Close() End Try Console.ReadLine() End Sub End Class

Obtener esquema

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -115

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

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -116

' recorrer la coleccin de tablas del DataSet For Each DataTable In DataSet.Tables Me.ListBox1.Items.Add("Tabla: " & DataTable.TableName) ' recorrer la coleccin de columnas de la tabla For Each DataColumn In DataTable.Columns Me.ListBox1.Items.Add("Campo: " & _ DataColumn.ColumnName & " --- " & _ "Tipo: " & DataColumn.DataType.Name) Next Next End Sub End Class Ejercicio Obtener valores de todas las tablas de la base de datos Imports System.Data.SqlClient Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Conexion As New SqlConnection() Conexion.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim DataSet As New DataSet() ' crear adaptadores de datos para las tablas ' y aadir cada tabla al dataset con el adaptador Dim DataAdapter As SqlDataAdapter DataAdapter = New SqlDataAdapter("SELECT * FROM ALUMNOS", Conexion) DataAdapter.Fill(DataSet, "ALUMNOS") DataAdapter = Nothing DataAdapter = New SqlDataAdapter("SELECT * FROM PAGOS", Conexion) DataAdapter.Fill(DataSet, "PAGOS") DataAdapter = Nothing DataAdapter = New SqlDataAdapter("SELECT * FROM PAGOS", Conexion) DataAdapter.Fill(DataSet, "CURSOS") DataAdapter = Nothing Dim DataTable As DataTable Dim DataColumn As DataColumn Me.ListBox1.Items.Add(" Valores de la tabla") 'display data Try Dim cadena As String For Each DataTable In DataSet.Tables ListBox1.Items.Add(DataTable.TableName) Dim row As DataRow For Each row In DataTable.Rows Dim col As DataColumn

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -117

cadena = "" For Each col In DataTable.Columns cadena = cadena + row(col).ToString + " Next col ListBox1.Items.Add(cadena) Next row Next DataTable Catch Ex As Exception ListBox1.Items.Add(Ex) Finally End Try End Sub End Class

"

Calcular valores de una funcin usando el control datagridview Public Class Form1 Dim ncol As Integer = 3 Dim nfilas As Integer = 10 Dim x As Single Dim y As Single Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click DataGridView1.ColumnCount = ncol

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -118

DataGridView1.RowCount = nfilas + 1 For col = 0 To ncol - 1 DataGridView1.Columns(col).Width = 30 Next col For fila = 0 To nfilas DataGridView1.Rows(fila).Height = 20 DataGridView1.Rows(fila).Cells(0).Value = fila Next fila DataGridView1.Rows(0).Cells(0).Value = "Pto" DataGridView1.Rows(0).Cells(1).Value = "X" DataGridView1.Rows(0).Cells(2).Value = "Y" For x = 1 To 10 y = Math.Pow(x, 2) DataGridView1.Rows(x).Cells(1).Value = x DataGridView1.Rows(x).Cells(2).Value = y Next End Sub End Class

Llenar un datagrid con datos de una tabla Imports System.Data.SqlClient Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim connstring As String = "Data Source=.\sqlexpress;Integrated Security=True;database=alumnos" Dim sql As String = "SELECT * FROM PAGOS " Dim conn As SqlConnection = New SqlConnection(connstring)

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -119

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, "ALUMNOS") Dim nfilas = ds.Tables(0).Rows.Count Dim ncol = ds.Tables(0).Columns.Count DataGridView1.ColumnCount = ncol DataGridView1.RowCount = nfilas + 1 DataGridView1.Rows(2).Cells(1).Value = 2 For fila = 0 To nfilas - 1 For col = 0 To ncol - 1 DataGridView1.Rows(fila).Cells(col).Value = ds.Tables(0).Rows(fila).Item(col) Next Next Catch ex As Exception MsgBox("Error Occurred:" & ex.ToString) Finally conn.Close() End Try End Sub End Class

Configurar un control combobox

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Vliz Vilca -120

Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'TODO: esta lnea de cdigo carga datos en la tabla 'ALUMNOSDataSet.ALUMNOS' Puede moverla o quitarla segn sea necesario. Me.ALUMNOSTableAdapter.Fill(Me.ALUMNOSDataSet.ALUMNOS) 'TODO: esta lnea de cdigo carga datos en la tabla 'ALUMNOSDataSet.PAGOS' Puede moverla o quitarla segn sea necesario. Me.PAGOSTableAdapter.Fill(Me.ALUMNOSDataSet.PAGOS) End Sub Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged ListBox1.Items.Clear() ListBox1.Items.Add("SelectedValue " & ComboBox1.SelectedValue) ListBox1.Items.Add("SelectedIndex " & ComboBox1.SelectedIndex) ListBox1.Items.Add("Text " & ComboBox1.Text) ListBox1.Items.Add(" ValueMember " & ComboBox1.ValueMember) ListBox1.Items.Add(" DisplayMember " & ComboBox1.DisplayMember) End Sub End Class

You might also like