148
PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -1 BASE DE DATOS EN WINDOWS FORMS 1. MANEJANDO LA CONEXIÓN DEMO 35 (modificado) conectarse a SQL Server usando el proveedor de datos de SQL, para lo cual veremos algunas propiedades y métodos de la clase SqlConnection. Para ello arrastre un botón de comando y un cuadro de lista Imports System.Data.SqlClient Public Class Form1 Private Sub Btnconectar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btnconectar.Click Dim CadenaConexion As String = "Data Source=.\ SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim con As New SqlConnection(CadenaConexion) With con .Open() ListBox1.Items.Add("nombre del servidor de datos =" & .DataSource) ListBox1.Items.Add("Version del servidor de datos =" & .ServerVersion) ListBox1.Items.Add("Nombre de la base de datos =" & .Database) ListBox1.Items.Add("Tamaño del paquete en bytes =" & .PacketSize) ListBox1.Items.Add("cadena de conexion =" & .ConnectionString) ListBox1.Items.Add("tiempo de conexion = " & .ConnectionTimeout) ListBox1.Items.Add("Estaacion de trabajo= " & .WorkstationId) ListBox1.Items.Add("Estado = " & .State) ListBox1.Items.Add("Estatic enabled = " & .StatisticsEnabled) .Close() End With End Sub End Class

Base de Datos 6en Windows Forms[1]

Embed Size (px)

Citation preview

Page 1: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -1 –

BASE DE DATOS EN WINDOWS FORMS

1. MANEJANDO LA CONEXIÓN

DEMO 35 (modificado) conectarse a SQL Server usando el proveedor de datos de SQL, para lo cual veremos algunas propiedades y métodos de la clase SqlConnection. Para ello arrastre un botón de comando y un cuadro de lista

Imports System.Data.SqlClientPublic 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("Tamaño 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 SubEnd Class

Page 2: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz 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;Integrated 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 OleDbConnectionEsta clase permite conectarse a cualquier órigen de datos que tenga un proveedor de OleDB, tal como Access o versiones anteriores a SQL Server 7. Esta Clase también implementa los miembros de la clase Connection, y es muy similar a SqlConnection

Demo 36 (modificado) conectarse a una base de datos de MS Access 2007 usando el proveedor de datos de OleDb

CódigoImports System.Data.OleDbPublic 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" Dim con As New OleDbConnection(CadenaConexion)

Page 3: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -3 –

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 SubEnd 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 OLEDBImports System.Data.OdbcPublic Class Form1 Inherits System.Windows.Forms.Form Private Sub Btnconectar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnConectar.Click Dim CadenaConexion = "dsn=AlumnosODBC" Dim con As New OdbcConnection(CadenaConexion) ListBox1.Items.Clear() With con .Open() ListBox1.Items.Add("Nombre de la base de datos =" & .DataSource) ListBox1.Items.Add("Provedor =" & .Driver) ListBox1.Items.Add("Cadena de conexion =" & .ConnectionString) ListBox1.Items.Add("Version del servidor =" & .ServerVersion) ListBox1.Items.Add("estado =" & .State) ListBox1.Items.Add("database =" & .Database.ToString) .Close()

Page 4: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -4 –

End With End Sub

End Class

1.2 CONTROLANDO ERRORES DE CONEXIÓN A SQL SERVER

Cuando ejecutamos una aplicación pueden ocurrir errores en tiempo de ejecución a las cuales se les conoce como Excepciones ,las cuales se controlan mediante la estructura Try.. Catch y atrapadas mediante la clase llamada Exception en .NET

Pero la clase Exception es muy genérico, ya que fue diseñada para informar sobre cualquier tipo de error en tiempo de ejecución, para lo cual tiene propiedades como Message que da la descripción del error y Source quien dice el origen del error.

Si la aplicación trabaja con SQL Server lo mejor sería controlar el error usando la clase SqlException que fue diseñado exclusivamente para informar sobre los errores de acceso de datos en el proveedor de SQL .Clase SqlException

Esta clase se usa para informar sobre los errores ocurridos en tiempo de ejecución al acceder a SQL Server , ya sea al tratar de conectarse o al realizar una operación sobre una Base de datos de SQL Server , tal como ejecutar una instrucción SQL, ejecutar un procedimiento almacenado, etc

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

Ejemplo 1 Try catch finally

Imports System.Data.SqlClientPublic Class Form1 Inherits System.Windows.Forms.Form Private Sub ControlErrores(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim x As Integer = 10

Page 5: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -5 –

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 ' Catch the error. ListBox1.Items.Add(ex.Data) ListBox1.Items.Add(ex.ToString) ListBox1.Items.Add(ex.Source) ListBox1.Items.Add(ex.Message) Catch ex1 As Exception When x > 4 ' Catch the error. ListBox1.Items.Add(ex1.Message) Finally Beep() End Try End SubEnd Class

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

CODIGO DEL FORMULARIO

Imports System.Data.SqlClientImports System.IOPublic Class Form1 Inherits System.Windows.Forms.Form Private Sub ControlErrores(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Page 6: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -6 –

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

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

Cambie la cadena de conexion a y vera los errores

Page 7: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -7 –

Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS1.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"

1.3MANEJANDO EVENTOS DE CONEXIÓN A SQL SERVER

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

1.3.1 Manejando el cambio de estado de la conexión

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

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

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

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

Imports System.Data.SqlClientPublic Class Form1 Inherits System.Windows.Forms.Form Private WithEvents con As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True")

Page 8: Base de Datos 6en Windows Forms[1]

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

2. TRABAJANDO CON COMANDOS

2.1 INTRODUCCION A LOS COMANDOS

Los comandos son instrucciones que se ejecutan en un origen de datos y que le indican al motor de datos realizar una tarea específica como: recuperar registros, insertar, actualizar o eliminar registros sobre el origen de datos.

2.1.2 Tipos de comandos

De acuerdo al tipo de acción o resultado de comando , en ADO.NET podemos clasificar los comandos en :

Comandos que devuelven un simple valor (ExecuteScalar) Comandos que devuelven un conjunto de datos (ExecuteReader). Comandos que actualizan datos

2.2 CLASE SQLCOMMAND

Page 9: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz 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 (modificación Demo 39).- de la base de datos alumnos encuentre los siguientes valores que se indican en el formularioImports System.Data.SqlClientPublic Class Form1 Dim CadenaConexion As String = "Data Source=.\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 SubEnd Class

Page 10: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -10 –

2 TRABAJANDO CON COMANDOS DE SELECCIÓN

3.1 CLASE SQLDATAREADER

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

Este es muy rápido y consume pocos recursos de memoria ya que mantiene una sola fila a la vez.

Solo permite el desplazamiento hacia adelante (ForwardOnly) No sirve para modificar registros No es enlazable a controles Windows ( No Binding Windows Controls) para

mostrar los datos hay que leer y mostrar registro por registro.

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

Consejos

Page 11: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz 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 código anterior

Cuando se lee un campo que no tiene dato , es decir es nulo , se producirá un error , para esto debe verificarse primero si el campo tiene datos o no con la propiedad IsNull de los métodos GetSql. Por ejemplo, para el caso anterior tendríamos:

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

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

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

Page 12: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -12 –

Tarea. Listar el campo deseado de una base de datos

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

DEMO 41 comandos de selección que recuperen varios campos de un conjunto de datos.

Ejercicio 1 .Devolver todos los campos de la tabla alumnos

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

Page 13: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -13 –

Loop drd.Close() con.Close() End SubEnd ClassEjercicio 2 listar los subtotales de pagos por años

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

Page 14: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -14 –

Loop drd.Close() con.Close() End SubEnd ClassEjercicio 3 Obtener la suma total del monto con codigo

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

3.3 RECUPERANDO MULTIPLES CONJUNTOS DE DATOS

Page 15: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -15 –

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

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

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

Page 16: Base de Datos 6en Windows Forms[1]

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

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

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

Page 17: Base de Datos 6en Windows Forms[1]

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

1.4RECUPERANDO IMÁGENES DESDE UNA BASE DE DATOS SQL

Las imágenes son considerados Objetos Binarios grandes mas conocidos como datos BLOB y se almacenan en un Array de Bytes o caracteres los cuales con recuperados mediante el método GetBytes del DataReader.Para recuperar imágenes desde una base de datos de SQL Server realice los siguientes pasos:1. Definir el Namespace del proveedor de SQl

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

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

Page 18: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -18 –

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

4. Abrir la conexión mediante el método Open del objeto de conexión

5. Ejecutar la instrucción mediante el método ExecuteReader pasando como parámetro CommandBehavior.SequentialAccess y almacenar los datos en objeto de tipo SqlDataReaderDim drd As SqlDataReader=cmd.ExecuteReader

(CommandBehavior.SequentialAccess)

Nota.- El parámetro CommnadBehavior:SequentialAccess se usa para ir cargando en forma secuencial datos grandes conforme se necesitan . Esto es solo es aplicable a SQLServer; ya que el MS Access los datos BLOB se cargan por completo en el DataReader

6. Usar el Método Read del SqlDataReader para leer un registro . Este devuelve True si hay registros y False si no hay registros que leer Drd.Read()

7. Para recuperar un valor simple del DataReader usar la propiedad Value de los métodos GetSql para leer una imagen o dato BLOB usar la propiedad value del Método GetSqlBinary que devuelve una array de bytesDim Valor as Integer = drd.GetSqlInt32(0).ValueDim Img() as Byte =drd.GetSqlBinary(1).value

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

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

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

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

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

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

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

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

Page 19: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -19 –

Cargar una imagen en tiempo de ejecuciónAgreguemos un campo de camino de la fotoImports system.ioPublic Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click PictureBox1.Load("e:\fotos\avion1.bmp") End SubEnd Class

Mostrar fotos en la base de datos de alumnos

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

Page 20: Base de Datos 6en Windows Forms[1]

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

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

Todos estos comandos tienen la característica de realizar cambios sobre el origen de datos y no deben retornar registros excepto un valor indicando la cantidad de registros afectados, por lo que se ejecutan con el método ExecuteNonQuery el objeto Command.

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

1.2ACTUALIZANDO REGISTROS

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

1.3ELIMINANDO REGISTROS

Para eliminar registros se usa la instrucción “Delete” de SQL

Page 21: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -21 –

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

Page 22: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz 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

Page 23: Base de Datos 6en Windows Forms[1]

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

Page 24: Base de Datos 6en Windows Forms[1]

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

Page 25: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -25 –

TRABAJANDO EN FORMA DESCONECTADA

Basado en el Libro de Luis Edwin Dueñas Huacoto “Bases de Datos con Adonet y SQL Server Pag 453-

1. TRABAJANDO CON EL CONTROL DATA SET

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

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

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

Permite el desplazamiento hacia cualquier dirección Es actualizable , es decir permite modificar registros Es enlazable a controles Windows (Binding Windows Controls)

AGREGANDO TABLAS AL DATASET DESDE UNA BASE DE DATOS

Una vez creado el DataSet en necesario crear tablas. Las tablas pueden crearse desde cero o recuperarlo desde una Base de Datos mediante dataAdapter.

1.2 1 Clase SqlDataAdapter.

El DataAdapter es un objeto conectado, pero que sirve de intermediario entre el origen de datos y el DatasSetEl DataAdapter se compone de de Objetos Command , cada uno con una tarea especifica

1.2.2 Llenando una Tabla del DataSet mediante el DataAdapter..Para llenar Datos desde una base de datos de SQL , Server en una tabla del DataSet se usa el método Fill del objeto SqlDataAdapter.

Ejercicio 1 Mostrar la Tabla pagos en un datagridview

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

Page 26: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -26 –

End SubEnd Class

Ejercicio3 Mostrar varias tablas en un datagrid

Page 27: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -27 –

El rayado interior se obtiene con alternatebackcolor

CODIGOImports System.Data.SqlClientPublic Class Form1 Inherits System.Windows.Forms.Form ' variables a nivel de clase para la manipulación de datos Private DataAdapter As SqlDataAdapter Private DataSet As DataSet Private Sub frmNormal_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load ' crear conexión Dim Conexion As New SqlConnection() Conexion.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" ' crear adaptadores Dim DAlumnos As New SqlDataAdapter("SELECT * FROM Alumnos", Conexion) Dim DCursos As New SqlDataAdapter("SELECT * FROM Cursos", Conexion) Dim DPagos As New SqlDataAdapter("SELECT * FROM Pagos", Conexion) ' crear dataset Dim DataSet As New DataSet() DAlumnos.Fill(DataSet, "Alumnos") DCursos.Fill(DataSet, "Cursos") DPagos.Fill(DataSet, "Pagos")

' asignar dataset a datagrid Me.DataGrid1.DataSource = DataSet End SubEnd Class

1.3 AGREGANDO RELACIONES ENTRE TABLAS DATASET

Una DataSet no solo puede contener una tabla sino varias y estos pueden estar relacionadas . Dicha relación no es sobre la base de datos, sino sobre el objeto en la memoria del cliente (el DataSet)

Las relaciones entre tablas del Dataset se usan para garantizar la integridad de datos (clave foránea) al momento de trabajar con datos en el cliente.

1.3.1 Clase DataRelation

1.3.2 Creando y agregando una Relación en el DataSet

Para crear una relación entre dos tablas se usa el objeto DataRelation y para agregarlo al DataSet se usa el método Add de la colección Relations del DataSet:, tal como se precia en el siguiente modelo de trabajo

Page 28: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -28 –

7. Declare una variable de tipo data relation pasando 3 parametros en el comstructor prmero el nombre del la relación , segundo las(s) columnas en la tablas padre y tercero las(s) columnas(s) de la tabla hijaDim drn as new datarelation(“relacion”,col_Tabla1, Col_Tabla2)

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

8. Agregar la relación creada a la colección de relaciones del Dataset mediante el método Add de la colecció Relations:dst.relatons.Add(drn)

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

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

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

Page 29: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -29 –

Page 30: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -30 –

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

Relacion entre la tabla cursos y pagos

Page 31: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -31 –

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

TAREA como obtener la relacion alumnos con cursos, dado un alumno listar que cursos llevaNotaDataGrid1.DataSource = dst.Tables(1) / lista la tabla pagos DataGrid1.DataSource = dst.Tables(0) lista la tabla alumnos

Page 32: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -32 –

2 TRABAJANDO CON TABLAS

Como ya sabemos el DataSet está compuesto por uno o más tablas, las cuales pueden contener registros. En un esquema desconectado todas las operaciones deben realizarse dentro de las tablas o vistas de una tabla en el DataSet

2.1 Clase DataTable

2.2 Realizando el Mantenimiento de Datos

El Objeto DataTable tiene métodos que permiten realizar operaciones con los registros de la tabla, tales como inserción de nuevos registros, actualización de datos o eliminación de registros.

2.1.1 Insertando Registros en un tabla

Para insertar un nuevo registros en una tabla primero debe crearse un Objeto DataRow que tenga la estructura de una fila existente de la tabla, la cual se obtiene con el método NewRow del Objeto DataTable

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

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

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

3 Finalmente agregar el dataRow a la colección de filas de la tabla mediante el métodos Add de la colección Rows de DataTableDst.Tables(0).Add(drw)

2.2.2 Actualizando Registros de una Tabla

Para actualizar un registro existente en una tabla primero debe de seleccionarse la fila que se desea actualizar creando un objeto DataRow que apunte a dicha fila

Para Empezar la edición debe usarse el Método BeginInt del DataTable, luego debe llenarse los datos del DataRow y finalmente debe llamarse al método EndInitA continuación presentamos la forma de actualizar un registro de una tabla

4 Crear un objeto DataRow que apunte a la fila de la tabla que se desea modificarDim drw as DataRow= dst.tables(0),rows(N)Nota.- El Prámetro N indica el indice de la fila que se desea modificar

5 Llamar al método BeginInit del DataTable para empezar la edición de un registro de la tabla

Page 33: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -33 –

Dst.tables(0).BeginInt()

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

7. Finalmente llamar al método EndInit del Datatable para finalizar la edición del registro de la tablaDst.Tables(0).EndInit()

2.2.3. Eliminando Registro de una Tabla

Para eliminar un registro existente de una tabla primero debe de seleccionarse la fila que se desea eliminar creando un objeto DataRow que apunte a dicha fila. Luego debe llamarse al método Delete del Objeto DataRow para eliminar dicha fila del DataTable

4 Crear un objeto DataRow que apunte a la fila de la tabla que se desea eliminarDim drw as DataRow= dst.Tables(0).Rows(N)

5. finalmente llamar al método Delete del DataRow para elimnar el registrodrw.Delete()

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

2.3 Actualizando la Base de Datos

Después de trabajar en forma desconectada con el DataSet , todos los cambios realizados a una Tabla deben ser enviados por lotes hacia la base de daos

2.3.1 Creando comandos para enviar cambios

Si los datos de una Tabla fueron obtenidos mediante el método Fill del DataAdapter que ejecutó el Select Command , para que estos cambios sean regresados o enviados hacia la base de datos se usa el método Update del DataAdapter

Para que se pueda usar el método Update del DataAdapter es necesario que se hayan creado los objetos (propiedades) InsertCommand, UpdateCommand y DeleteCommand del DataAdapter,

Existen dos formas de crear dichos comandos en el DataAdapter

1. Manualmente

Consiste en escribir las propiedades CommandText de cada ObjetoCommand del DataAdapter similar al código escritoDap.InsertComand.ComandText =”Insert Into Tabla(lista_campos) Values (lista_valores)Dap.updatecommand.Commadtext(“update tabla set campo1=valor1, campo2=valor2,…. Where (expresion lógica)”

Page 34: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -34 –

Dap.Deletecommand.CommadText= “delete from tabla where (exp.)

2. Automáticamente

Usando el objeto CommandBuilder que se analiza a continuación

2.3.2 Clase SqlCommandBuilder

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

Para esto el CommandBuilder toma el SelectCommand del DataAdapter y crea automáticamente los InsertCommand, UpdateCommand y DeleteCommand

Nota.- El único inconveniente es que el SelectCommand no puede referirse a varias tablas el CommandBuilder “solo trabaja con una tabla”

2.3.3 Enviando loa cambios hacia la base de datos

Para enviar todos los cambios desde la tabla hacia la base de datos se usa el método Update de DataAdapter

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

TryEnd Try

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

2. Dentro del Try enviar los cambios usando el método Update del objeto SqlDataAdapater pasando como parámetro el DataSet y la tablaDap.Update(dst,”Tabla”)

3. Dentro de Catch controlar los posibles errores al momento de actualizar usando la clase Excetion o una clase derivada mas especifica con sqlException DbConcurrrencyExeption, etc

Catch sqlEex As sql exceptions ‘Controlar errores de SqLCatch dvcEx As DbConcurrencyExxeption‘Controlar errores de concurrencia de base de datosCatch genEex As exception‘ controlar cualquier otro error o errores en general

4. Dentro de Finally ,actualizar los datos de la tabla del Dataset con los últimos cambios realizados en la base de datos , borrando los registros de la tabla y luego llenándolos nuevamente con el método Fill del SqlDataAdapterFinallyDst.Tables(0).Clear()Dap.Fill(dst,”Tabla”)End try

Page 35: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz 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 alumnos1. Agregar el primer formulario y modifique las propiedades de los siguientes controles

Objeto Propiedad ValorForm1 Text Listade AlumnosDataGrid1 ReadOnly TrueButton1 Name

TagText

BtnNuevo1Nuevo

Button2 NameTagText

BtnEditar2Editar

Button3 NameTagText

BtnEliminar3Eliminar

Button4 NameText

BtnEnviarCambiosEnviar cambios

Agregue un segundo formulario con siguientes propiedades

Page 36: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -36 –

Objeto Propiedad ValorForm1 Text Lista de alumnusGroupBox1 Text Datos de AlumnoButton1 Name

DialogResultText

BtnAceptarOkAceptar

Button2 NameDialogResultText

BtnCancelarCancelCancelar

Page 37: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -37 –

CODI GO DEL PRIMER FORMULARIO

Imports System.Data.SqlClientPublic Class Form1 Inherits System.Windows.Forms.Form Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim con As New SqlConnection(CadenaConexion) Dim dap As New SqlDataAdapter("Select Codalumno,nombrealumno,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 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 SubEnd Class

CODI GO DEL SEGUNDO FORMULARIO

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

Page 38: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -38 –

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

Page 39: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -39 –

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

Las vistas son usadas para diversa tareas tales como Filtrar o seleccionar registros de acuerdo a un criterio Ordenar datos por uno o más columnas Buscar datos por un cierto campo clave Actualizar datos de la tabla ya sea adicionando editando o eliminando registros ,etc

Clase DataView

Manejando Datos en una 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 códigoDim dvw As DataView =dst.Tables(n).DefaultView

Nota.- N Indica el índice de la tabla de la cual se desea generar una vista

Por ejemplo para crear una vista de productos tenemos Dim dvw As DataView =dst.tables(“productos”).DefaultView

Filtrando datos en una vista

Una vez creado la vista se puede filtrar datos de esta , es decir seleccionar ciertos registros de acuerdo a un criterio de selección

Para filtrar registros de una vista se usa la propiedad RowFilter del objeto DataView. Tal como se muestra en le siguiente códigoDvw.RowFilter = “criterio de selección”

Page 40: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -40 –

Nota: El “Criterio de Selección” es una instrucción SQL similar a la usada en la cláusula Where.

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

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

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

Page 41: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -41 –

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 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 SubEnd ClassNota necesariamente debe haber un campo clave

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

CODIGO DEL FORMULARIO

Page 42: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -42 –

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

Page 43: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -43 –

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

DEMO 49. filtrar registros en un vista por un campo de tipo cadena de caracteres.

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

La tabla alumnos tiene los siguientes datos

LA TABLA CURSOS TIENE LOS SIGUIENTES DATOS

Page 44: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -44 –

LA TABLA PAGOS TIENE LOS SIGUIENTES DATOS

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

CODIGO

Page 45: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -45 –

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

Dim con As New SqlConnection(CadenaConexion) Dim dap As New SqlDataAdapter("Select CodAlumno ,NombreAlumno From Alumnos", con) Dim dst As New DataSet() Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load dap.Fill(dst, "ALUMNOS") With ComboBox1 .DataSource = dst.Tables(0) .DisplayMember = "NombreAlumno" .ValueMember = "CodAlumno" End With dap.SelectCommand.CommandText = "Select nro,fechaPago,codAlumno,Monto,Codcurso from Pagos" dap.Fill(dst, "PAGOS") dvw = dst.Tables(1).DefaultView DataGridView1.DataSource = dvw End Sub Private Sub FiltrarPorAlumno(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged Try dvw.RowFilter = "CodAlumno ='" & ComboBox1.SelectedValue & "'" Catch ex As Exception 'MsgBox(ex.Message) End Try End SubEnd Class

Ejercicio 2. Filtrar por código de cursoImports System.Data.SqlClientPublic Class Form1 Inherits System.Windows.Forms.Form Private dvw As DataView Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim con As New SqlConnection(CadenaConexion) Dim dap As New SqlDataAdapter("Select CodCurso,NombreCurso From Cursos", con) Dim dst As New DataSet()

Page 46: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -46 –

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

3.2.3 ORDENANDO DATOS EN UNA VISTA

Para ordenar datos en la vista debemos usar la propiedad Sort del Objeto DataView especificando el campo por el cual se desea realizar la ordenación y opcionalmente indicando en cada campo el tipo de ordenación , que puede ser ascendente o descendente tal como se muestra en el siguiene códigodvw.Sort “Campo1 [Asc|Desc] campo2 [Asc|Desc]

Nota: Por defecto si no se especifica el tipo de ordenación , esta es ascendente

Page 47: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -47 –

Ejemplo Ordenar la vista de productos por codigo categoria en forma ascedente y si coinciden ordenar por codigo del proveedor en forma descendentedws.sort= “CategoryID Asc,SuplierID Desc”

3.2.4 Buscando Datos en la vista

Para buscar datos en la vista primero ésta debe estar ordenada por el campo por el cual se desea buscar, luego debemos usar el método Find del objeto DataView pasando como parametro el dato a buscar tal como se muestra en el siguiente codigoDim pos as integer = dvw.Find(dato)

Nota: El Método Find devuelve un entero indicando la posición del registro en la vista . Si devuelve un número mayor o igual que el cero es que se encontró el dato ; si devuelve -1 significa que el dato no se encuentra en dicho campo

Ejemplo Para buscar el codigo cuyo producto es 1 tenemosdww.Sort ”productoID”Dim pos As integer =dvw.Find(1)

DEMO 50 ordenar y buscar datos usando una vista de datos creada a partir de una tabla . La búsqueda se realiza por un campo numérico y por y por otro de tipo cadena de acaracteres, para los cual los datos de la vista deben estar previamente ordenados

Ejercicio 1. Ordenando los alumnos por su codigo y luego buscar por ese campoLa tabla debe tener la siguiente estructura

Page 48: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -48 –

CODIGO DEL FORMULARIO

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

Page 49: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -49 –

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

Ejercicio en la tabla pagos buscar por nro de registro y codalumno

Imports System.Data.SqlClientPublic Class Form2 Inherits System.Windows.Forms.Form Dim dvw As New DataView() Dim npos As Integer Dim pos As Integer

Private Sub LlenarDatos() Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim con As New SqlConnection(CadenaConexion)

Page 50: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -50 –

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

Page 51: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -51 –

4. TRABAJANDO CON CONTROLES ENLAZADOS A DATOS

4.1 ENLAZANDO CONTROLES A DATOS

Cuando trabajamos con aplicaciones que manejan datos , éstos se presentan en pantalla mediante dos formas

Leyendo cada registro del repositorio de datos y mostrándolo en controles Enlazando datos del repositorio de datos a los controles

El repositorio de datos puede ser un DataReader en un esquema conectado o una tabla o vista en un esquema desconectado.

En la primera técnica en cada momento hay que estar leyendo del repositorio de datos y mostrando sobre controles simples como etiquetas o cuadros de texto o sobre controles complejos como las listas o el DataGrid

En la segunda técnica sólo una vez se realiza el enlace de datos y se muestra sobre controles simples o complejos

Creando enlace simple

Se llama enlace simple porque se enlaza un campo de un repositorio de datos, que puede ser una tabla o vista del Dataset a un control individual , que puede ser cualquiera de los siguientes controles

Una etiqueta (Label) o cuadro de texto (TextBox) en el caso de ser un campo numérico, texto o de fecha y hora

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

Un cuadro de Imagen(PictureBox) en el caso de ser un campo con Imagen

Page 52: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -52 –

Para crear un enlace simple sobre un control se usa el metodo Add de la colección DataBidings que es una propiedad de cada control simple, pasando tres parámetros. Nombre de la propiedad del control donde se mostrará el valor del campo, por

ejemplo , si es un control textbox debe ser la porpiedad “Text “ si un control CheckBox debe ser la propiedad “Checked”

Repositorio de datos donde se encuentra el campo, éste puede ser un DataSet , un DataTable o un DataView.

Nombre del campo de repositorio de datos que se va a enlazar sobre el control simple.

En resumen la sintaxis de un enlace simple queda como sigue:ControlSimple.DatBinding.Add(“Propiedad”,repositorio,”Campo”)

Por ejemplo para enlazar el campo “ProductName” de una vista de productos “dvw” a un cuadro de texto llamado “txtNombre” se tiene:TxNombre.DataBinding.Add(“text”,dvw,”ProductName”)

EJERCICIO CREANDO ENLACE SIMPLEPrivate Sub EnlazarDatos() TextBox1.DataBindings.Add("Text", dvw, "Nombre") End Sub

Creando enlace Complejo

Se llama enlace complejo porque se enlaza todos los campos de un repositorio de datos , que puede ser una tabla o vista del DataSet a un control que puede ser cualquiera de los siguientes controles

Un cuadro de lista (ListBox) o lista desplegable(ComboBox), por defecto se podrá trabajar sólo con dos campos: uno que se ve (Display Member) y otro que se oculta (ValueMember).

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

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

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

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

Configure el método SetDataBinding pasando como parámetros el Dataset y el nombre de la tabla a enlazar ControlCOmplejo.SetDatBinding(dst,”Tabla”)

Page 53: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -53 –

DEMO 51 enlazar el control DataGrid a tablas de un dataSet usando el método SetDataBinding, también se apreciará como se sincronizan dos tablas realcionadas en dos DataGrid

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

Imports System.Data.SqlClientPublic Class Form3 Inherits System.Windows.Forms.Form Private Sub EnlazarAlumnoPago(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\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 SubEnd Class

Page 54: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -54 –

4.2 DESPLAZAMIENTO EN CONTROLES ENLAZADOS A DATOS

4.2.1 Usando desplazamiento manual

En realidad para usar el dezplazamiento manual no es necesario que los controles se enlacen a una tabla o vista de datos, sino que la técnica consiste en leer cada registro e ir mostrándolo cada vez que se realiza el desplazamiento.

Para usar el desplazamiento manual por uan vista realice los siguientes pasos:

1. Definir un objeto de tipo DataView para la vista de datosDim dvw As DataView

2. Definir una variable de tipo entero que guarde la posición del registros actual o registro que se desea moastrarDim pos as integer

3. Crear un procedimiento general que permita mostrar los datos del registro actual en controles simples Private Sub MostrarDatos() Control1.text = dvw(pos)(0) Control2.text= dvw(pos)(1) Control2.text= dvw(pos)(2) ControlPosicion.Text = (pos + 1).ToString & " de " & dvw.Count End Sub

Nota: En el código anterior también mostramos la posición la cual empieza en 0, pero para el usuario empieza en 1, es por eso la suma de 1

4 En el evento “Load” del formulario llenar los datos de la vista y llamar al procedimiento que muestra los datos del registro actual

‘ Escribir antes del codigo para conectarse y llenar datos en una tablaDwn= dst.Tables(0).DefaultViewMostrarDaos()Nota: Al llamar por primera vez al procedimiento el valor de la variable pos es por defecto cero, lo que permitirá mostrar los datos del primer registro de la vista.

5. Para mostrar el primer registro de la vista configurar el valor de la variable pos en 0 y llamar al procedimiento que presenta los datos.Pos =0Mostrardatos()

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

Pos = pos-1MostrarDatos()

End ifNota:- Si no incorporamos la condición y retrocedieramos se genera una Excepción al tratar de leer una posición negativa en la vista y mostrarla sobre el control en el procedimietno MostrarDatos

Page 55: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -55 –

7. Para mostrar el siguiente registro al actual , primero verificar que no estemos sobre el último regisro, si se cumple rsta condición aumentar en 1 el valor de la variable pos y llamar al procedimeitno que presenta los datos

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

End ifNota:- Si no incorporamos la condición y avanzariamos se genera una Excepción al tratar de leer una posición inexistente en la vista y mostrarla sobre el control en el procedimietno MostrarDatos

8. Para mostrar el último registro de la vista configurar el valor de la variable pos en el indice del último regitro y llamar al procedimeitno que presenta los datosPos =dvw.count-1MostrarDatos()

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

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

CODIGO DEL FORMULARIO

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

Page 56: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -56 –

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

4.2.2 Usando Desplazamiento Automático

En versiones anteriores de ADO la clase recordset venía con métodos (MoveFirst, MoveLast, MovePrevius, MoveNext y Move) que permitián el desplazamiento en registros y por tanto se visualizabana en controles enlazados.En cambo en ADO.NET existe unobjeto llamdo CurrencyManager que permite realizar el desplazamiento en Controles Windows enlazados a datos

Page 57: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -57 –

Para usar el desplazamiento automático con el CurrencyManager por una vista realice los siguientes pasos.

1. Definir un objeto de tipo DataView para la vista de datos:Private dvw as Dataview

2. Definir un Objeto currencyManager que permite el desplazamientoPrivate cmr As CurrencyManager

3. Crear un procedimiento general que permite enlazar los datos del registro actual en controles simples usando el metodo Add de la colección DataBinding de cada controlPrivate sub enlazarDatos()

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

End Sub4. En el evento “Load “ del formulario llenar los datos de la vista ,llamar al procedimiento

que enlaza los datos y asociar los controles enlazados a la vista al CurrencyManager mediante el método BindingContext el formulario.‘Escribir antes el código para conectarse y llenar datos en una tabladvw= dst. Tables(0).DefaultViewEnlazarDatos()cmr= Me.BindingContext(dvw)Nota: El Método BindingContext detecta todos los controles en el formulario que están enlazados a la vista para que sean manejados a través del CurrencyManager.

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

6. Para ir al registro anerior primero verificar que no estemos sobre el primer registro, si se cumple esta condición disminuir en 1 el valor de la propiedad Position del CurrencyManagerIf cmr.Position > 0 then cmr.Position =cmr.Position -1

7. Para ir al siguiente registro primero verificar que no estemos sobre el último registro si se cumple esta condición aumentar en 1 el valor de la proiedad Position del CurrencyManger

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

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

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

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

Page 58: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -58 –

Imports System.Data.SqlClientPublic Class Form1 Inherits System.Windows.Forms.Form Private dvw As DataView Private WithEvents cmr As CurrencyManager Private Sub EnlazarDatos() TextBox1.DataBindings.Add("Text", dvw, "CodAlumno") TextBox2.DataBindings.Add("Text", dvw, "NombreAlumno") TextBox3.DataBindings.Add("Text", dvw, "FechaNac") cmr = Me.BindingContext(dvw) End Sub Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\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

Page 59: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -59 –

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

Ejercicio 2. Buscar por el nombre de alumno

CODIGO DEL FORMULARIO

Imports System.Data.SqlClientPublic Class Form2 Inherits System.Windows.Forms.Form Private dvw As New DataView()

Page 60: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -60 –

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

Nota. Se pinta el registro seleccionado

1.3FORMATEANDO CONTROLES ENLAZADOS A DATOS

1.3.1 Formatenado Controles simples

Page 61: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -61 –

Cuando enlazamo datos a controles , muchas veces queremos que los datos se presentan con un cierto formato, por ejemplo nùmeros con decimales o símboles de monedaPara formatear un campo de control enlazado a datos realice los siguiente:

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

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

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

3. Crear un procedimiento que convierta la cadena a un número decimalPrivate Sub ParsearStringADecimal(ByVal sender As Object , ByVal c As ConvertEventArg)

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

4 crear un objeto de la clase Binding que representa un enlace simple entre el valor de la propiedad de un objeto (un campo de la vista) y el valor de la propiedad de un control(Texto)Dim ObjEnlace as New Binding(“text”,dvw,”campo”)

5 Crear dos manejadores de eventos en tiempo de ejecución , uno para el evento Format y otro para el evento Parse del objeto de enlace (Binding):AddHandler.ObjEnlace.Format.AddressOf FormatearDecimalAStringAddHandler.ObjEnlace.Parse .AddressOf ParsearStringADecimal

Observaciones:

El evento Format del Objeto Binding se produce cuando la propiedad de un control està enlazado a un valor de datos.

El Evento Parse del objeto Bindig se produce cuando cambia el valor de un control enlazado a datos

6 Añadir al objeto de enlace sencillo creado a la colección de enlaces del control donde se desea dar formatoControl.DataBinding .Add(ObjEnlace)

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

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

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

Page 62: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -62 –

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

Page 63: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -63 –

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

Como formatear campo fecha

4.3.2 FORMATEANDO EL DATAGRID

El Control Datagrid quizá see el control más usado en las plicaciones Windows para presentar datos en un tabla , vista o estructura matricial, pero por defecto ya viene con un formato o estiilo predefinido

Hay tres aspectos del formato del Control DataGrid que son:

Definir propiedades para establecer un estilo predeteminado con el que mostrar los datos

Page 64: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -64 –

Personalizar el modo en que se muestran determinadas tablas en tiempo de ejecución Modificar las columnas que se muestran en el DataGrid asi como los colores y otros

aspecto del formato mostrado

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

Clase DataGridPara ambos caso necesitamos conocer los miembros de la clase Datagrid que describiremos a continuación

Ejercicio 1. Modificación del demo 56 formatera al DataGrid para el caso de los alumnos

Imports System.Data.SqlClientPublic 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" c2.HeaderText = "Fecha" c2.Width = 100

Page 65: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -65 –

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 Try dvw.RowFilter = "CodALu = '" & ComboBox1.SelectedValue & "'"

Page 66: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -66 –

Catch ex As Exception MsgBox(ex.Message) End Try End SubEnd Class

EJERCICIO CON BINDING NAVIGATOR

Vea las propiedades del control BidingNavegatos en enlace controles

Enlazando el control datagrid

Objeto propiedad Valor

Page 67: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -67 –

BindingNavigator DataSource TbAlumnosBindingSourceDataGridView DataSource TbAlumnosBindingSource

EJERCICIOS PRACTICAR SELECCION DE DATOS CON SQL

Page 68: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -68 –

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

Page 69: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -69 –

Finally End Try End SubEnd 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 201Bajar su sistema y un Pc y demostrarJugar con la base de datos , como realizar consultas, de selección , actualización de datos etc.

EJEMPLO SIMPLE DE BASE DE DATOSSe tiene el sistema Segunda especialidadCompuesto por las siguientes tablas

TABLA ALUMNOS

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

TABLA CURSOS

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

TABLA PAGOS

NRO CODALUMNO FECHAPAGO TIPO NRODOC RUNSA MONTO CODCURSO1 A1 01/04/2007 RECIBO 1 100 100 AD

2 A2 01/12/2007 FACTURA F1 100 100 AD3 A1 01/02/2008 VOUCHER V1 200 200 C1

Page 70: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -70 –

4 A3 01/03/2008 RECIBO 2 300 100 AD5 A2 01/02/2009 RECIBO 3 400 200 C26 A1 02/04/2009 TRANSFERENCIA T1 500 200 C27 A4 03/05/2009 FACTURA F2 500 200 AD8 A4 04/08/2009 VOUCHER V2 600 200 C1

TABLA NOTAS

ID CODALUMNO CODCURSO NOTA FECHAUEVALUACIONCOD PROFESOR

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

TABLA PROFESORESCODPROFESOR NOMBREPROFESOR PROFESION PROCEDENCIAP1 GOMEZ INGENIERO CIVIL AREQUIPA

P2 RIOSINGENIERO DE SEGURIDAD LIMA

P3 PEREZ MEDICO AREQUIPAP4 LOPEZ MINAS TACNA

P5 TORRESINGENIERO INDUSTRIAL PUNO

ID FECHA MOTIVO MONTOCOD CURSO

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

Su base de datos podría tener las siguientes consultas

LISTADOSListar la tabla alumnos

Listar la tabla alumnos con todos los campos Listar la tabla alumnos que aparezcan solo los campos, codalumno , nombre y ordenado por nombre

Listar la tabla Cursos

Page 71: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -71 –

Listar la tabla pagos Listar todos los registros

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

Todos los registrosSolo código del profesor y Nombre

Listar la tabla egresosTodos los camposSolo los campos fecha y monto

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

FILTRADOSTABLA ALUMNOS

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

TABLA CURSOSListar todos los cursos que contienen el texto “Salud”

TABLA PAGOS Listar todos los alumnos que pagaron con recibo Listar todos los registros cuyo pago es mayor a 200Listar todos los registros dado el código del alumnoListar los registros en la tabla pagos dado el código del cursoListar los registros generados en un año dadoListar los registros generados en un mes dadoListar los registros dado un intervalo de dos fechas

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

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

TABLA EGRESOS

Listado de tabla egresosListado de tabla de egreso por fecha

Page 72: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -72 –

SUBTOTALES

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

TABLA CURSOSCantidad de registros de la tabla cursos

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

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

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

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

CUADRICULASCuadricula de notas de alumnos cursos

Page 73: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -73 –

Cuadricula de pagos años mesesCuadriculas de pagos alumnos mesesDado el nombre del alumno elaborar una cuadricula que muestre sus pagos año mesCuadricula alumno y tipo de pagoCuadricula de año tipo de pagoCantidad y total de pagos por añosCantidad y total de pagos por alumnoSubtotal alumnos – pagosElabore unión de tablas

OTROS

Encontrar la edad de los alumnos en la tabla Nombres

SELECT CODALUMNO,NOMBRE ,FECHANAC, (NOW-FECHANAC)/365.24219879 AS EDAD FROM [ALUMNOS$]

Listado de alumnos que no pagaronDado el código del alumno , elaborar un listado de sus notas y sus pagosListado de alumnos que no tienen notasListar alumnos que cuya ultima fecha de pago es mas de dos añosElaborar balance por añosBalance por cursoSaldos de alumnosPermanencia de alumno en la especialidadultima fecha que aparece el nombre del alumnoListar los alumnos por años ( en la tabla pagos)

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

Page 74: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -74 –

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 parámetros ( pag 7)

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

Page 75: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -75 –

Procedimientos almacenados con parámetros

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

Page 76: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -76 –

Listar la tabla alumnos usando proveedor de datos SQLServer ( pag 10)

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

Page 77: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -77 –

Pruebe: Crear una aplicación de Windows Form Simple utilizando el proveedor OLEDB

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

Page 78: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -78 –

Proveedor de Datos ODBCListing 9-3. OdbcProvider.vb

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

Page 79: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -79 –

CAPITULO 10 HACIENDO CONEXIONES

Conectar a SQL Server Express con SqlConnection.

A escribir un programa muy simple, sólo para abrir y comprobar una conexión:

Listing 10-1. ConnectionSql.vb

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

Page 80: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -80 –

Si hay error saldra el siguiente mensaje

Pruebe: Mostrar información de conexión. En este ejemplo, verá cómo escribir un programa para mostrar información de conexión.

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

Page 81: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -81 –

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

Pruebe: Conectar a SQL Server Express con el proveedor de datos OLE DB.

Listing 10-3. ConnectionOleDb.vb

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

Page 82: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -82 –

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

Page 83: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -83 –

Imports System.Data.SqlClientPublic 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("Conexión Cerrada") End Try Console.ReadLine() End SubEnd Class

Pruébelo: utilizando el método ExecuteScalar.

Listing 11-2. CommandScalar.vb

Imports System.Data.SqlClientPublic Class Form1

Page 84: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -84 –

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

Ejecutar comandos con varios resultados.

Para consultas donde está esperando varias filas y columnas que se devolverá, utilice al método ExecuteReader() del comando.

ExecuteReader() devuelve un lector de datos, una instancia de la clase SqlDataReader

Pruébelo: utilizando el método ExecuteReader.

Listing 11-3. CommandReader.vb

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

Page 85: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -85 –

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

Pruébelo: utilizando el método ExecuteNonQuery.

Listing 11-4. Commando NonQuery.vb

Imports System.Data.SqlClientPublic Class Form1

Page 86: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -86 –

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

Pruébelo: uso de parámetros de comando

Listing 11-5. CommandParameters.vb

Imports System.Data.SqlClientPublic Class Form1

Page 87: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -87 –

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

Page 88: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -88 –

CAPITULO 12 USANDO DATA READERS

Listando un solo campo

Listing 12-1. DataLooper.vb

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

Page 89: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -89 –

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

Pruebe: Utilizando los indizadores ordinales. Ya vistoListando varios campos

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

Page 90: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -90 –

ListBox1.Items.Add("Error Occurred:" & Ex.ToString) Finally conn.Close() End Try End SubEnd Class

Uso de columnas indexado por nombre (pag 18)

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

Page 91: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -91 –

Pruebe: Utilizando los métodos de descriptor de acceso con tipo.

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

Obtener datos sobre datos.

Listing 12-4. ResultSetInfo.vb

Imports System.Data.SqlClient

Page 92: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -92 –

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

Page 93: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -93 –

Pruebe: Obtener información de esquema. Aquí podrá ver una demostración práctica del método GetSchemaTable

Listing 12-5. SchemaTable.vb

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

Page 94: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -94 –

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

Probar: administrar varios conjuntos de resultados.

En este ejemplo, utilizará NextResult() para procesar varios conjuntos de resultados.

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

Page 95: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -95 –

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

CAPITULO 13 USANDO DATSET Y DATAADAPTERS

Pruebe: Llenar un Dataset con un adaptador de datos.

Imports System.Data.SqlClientPublic Class Form1

Page 96: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -96 –

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

Page 97: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -97 –

Pruebe: Llenar un Dataset con un adaptador de datos a un control Datagrid.

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

Podría usar también

DataGridView1.DataSource = ds.Tables("PAGOS")

Page 98: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -98 –

Ejemplo mostrar el elemento de la fila y columna determinada

Imports System.Data.SqlClientPublic Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim connstring As String = "Data Source=.\sqlexpress;Integrated Security=True;database=alumnos" Dim sql As String = "SELECT * FROM PAGOS " Dim conn As SqlConnection = New SqlConnection(connstring) Try conn.Open() Dim cmd As SqlCommand = New SqlCommand(sql, conn) Dim da As SqlDataAdapter = New SqlDataAdapter(sql, conn) Dim ds As DataSet = New DataSet da.Fill(ds, "pagos") Dim dt As DataTable = ds.Tables("pagos") DataGridView1.DataSource = ds.Tables(0) Dim row As DataRow ListBox1.Items.Add("Nombre de la consulta:" & sql) ListBox1.Items.Add("nombre de la tabla: " & ds.Tables(0).ToString) ListBox1.Items.Add("Numero de filas: " & ds.Tables(0).Rows.Count) ListBox1.Items.Add("numero de columnas: " & ds.Tables(0).Columns.Count) ListBox1.Items.Add("nombre de la primera columna: " & ds.Tables(0).Columns(0).ColumnName)

Page 99: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -99 –

ListBox1.Items.Add("tipo de dato de la primera columna: " & ds.Tables(0).Columns(0).DataType.ToString) ListBox1.Items.Add(" elemnto de la tercera fila y segunda columna " & ds.Tables(0).Rows(2).Item(1)) Catch ex As Exception ListBox1.Items.Add("Error Occurred:" & ex.ToString) Finally conn.Close() End Try End SubEnd Class

Pruebe: filtrando y ordenando dinámicamente datos en un Dataset.

Filtrar por el código del alumno ordenado por montoImports System.Data.SqlClientPublic 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 Catch ex As Exception ListBox1.Items.Add("Error Occurred:" & ex.ToString) Finally

Page 100: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -100 –

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

Pruebe: Modificar una tabla de datos en un Dataset.

Imports System.Data.SqlClientPublic 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 sql As String = "select * from alumnos " Dim conn As SqlConnection = New SqlConnection(connstring)

Page 101: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -101 –

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

Page 102: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -102 –

Propagar cambios a un origen de datos.

Listing 13-5. PersistChanges.vb

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

Page 103: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -103 –

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

Page 104: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -104 –

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

Page 105: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -105 –

Propiedad DeleteCommand.Listing 13-7. PersistDeletes.vb

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

Page 106: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -106 –

Constructores de comando.

Listing 13-8. PersistAddsBuilder.vb

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

Dim connstring As String = ("Data Source=.\sqlexpress;Integrated Security=True;database=alumnos") 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"

Page 107: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -107 –

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

Pruebe: Extracción de un conjunto de datos a un archivo XML.

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

Page 108: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -108 –

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 conn.Close() End Try End SubEnd Class

<?xml version="1.0" standalone="yes" ?> - <NewDataSet>

Page 109: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -109 –

- <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>   <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.SqlClientPublic Class Form1

Page 110: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -110 –

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

Page 111: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -111 –

Obtener esquema

Imports System.Data.SqlClientPublic Class Form1

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

Page 112: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -112 –

' recorrer la colección de tablas del DataSet For Each DataTable In DataSet.Tables Me.ListBox1.Items.Add("Tabla: " & DataTable.TableName) ' recorrer la colección de columnas de la tabla For Each DataColumn In DataTable.Columns Me.ListBox1.Items.Add("Campo: " & _ DataColumn.ColumnName & " --- " & _ "Tipo: " & DataColumn.DataType.Name) Next Next End SubEnd Class

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 añadir cada tabla al dataset con el adaptador Dim DataAdapter As SqlDataAdapter DataAdapter = New SqlDataAdapter("SELECT * FROM ALUMNOS", Conexion) DataAdapter.Fill(DataSet, "ALUMNOS") DataAdapter = Nothing DataAdapter = New SqlDataAdapter("SELECT * FROM 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 cadena = ""

Page 113: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -113 –

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

Calcular valores de una función usando el control datagridviewPublic 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 DataGridView1.RowCount = nfilas + 1 For col = 0 To ncol - 1

Page 114: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -114 –

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

Llenar un datagrid con datos de una tabla

Imports System.Data.SqlClientPublic Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim connstring As String = "Data Source=.\sqlexpress;Integrated Security=True;database=alumnos" Dim sql As String = "SELECT * FROM PAGOS " Dim conn As SqlConnection = New SqlConnection(connstring) Try conn.Open()

Page 115: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -115 –

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

Configurar un control combobox

Page 116: Base de Datos 6en Windows Forms[1]

PRACTICAS DE SI2011 A \ Base de datos en modo formulario\ Ismael Véliz Vilca -116 –

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