Você está na página 1de 88

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -191-

CAPITULO 6 USANDO PROCEDIMIENTOS ALMACENADOS Los procedimientos almacenados son instrucciones SQL que permiten realizar una tarea repetidamente. Puede crear un procedimiento de una vez y volver a utilizarlo cualquier nmero de veces en su programa. PROCEDIMIENTOS ALMACENADOS CON LA BASE DE DATOS ALUMNOS 1 Crear un procedimiento almacenado que seleccione todos los registros de la tabla alumnos seleccione procedimiento almacenado y luego agregar nuevo procedimiento almacenado

Por defecto aparece lo siguiente

Los comentarios en un procedimiento almacenado van entre /* comentario */ Modifique el procedimiento a CREATE PROCEDURE LISTAALUMNOS AS SELECT * from Alumnos 4 Grabar el procedimiento almacenado , dando clic al botn de "Guardar" pulsando [Ctrl] + [S].

Nota: Si no hay errores de sintaxis se mostrar la instruccin ALTER, si hay errores no se podr grabar, primero debemos corregir los errores .

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -192-

El procedimiento se modifica a:

Haga clic derecho con el ratn y seleccione ejecutar

Y en la ejecucin se obtiene el siguiente cuadro

Tambien se puede ejecutar haciendo clic derecho en el procedimiento almacenado de explorador de servidores

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -193-

EJECUTANDO PROCEDIMIENTOS ALMACENADOS CON SQLSERVER 2005 Ingrese a New Query y escriba create procedure PA_Alumnos as select * from Alumnos

al ejecutar Aparece el mensaje

c Y el procedimiento ha sido creado Ponga en programmability refresh para actualizar

Y se ve que el procedimiento a sido creado

Para ejecutar Use alumnos execute PA_Alumnos

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -194-

Puede ver el procedimiento almacenado y modificarlo si es necesario

2. Modifique el procedimiento almacenado anterior nombre del alumno

que solo Iiste el cdigo

y el

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -195ALTER procedure [dbo].[PA_Alumnos] as select codalumno,nombrealumno from Alumnos

Al ejecutar se obtiene

Ejercicio 2 crear un procedimiento almacenado para obtener subtotales por curso create procedure PA_PagosCursos as select codcurso, count (monto) as cantidad ,sum(monto) as total from pagos group by codcurso Al ejecutar Use alumnos execute PA_PagosCursos

Ejercicio 3: Crear un procedimiento almacenado con un parmetro de salida BD ALUMNOS. Que liste los alumnos que contenga su cdigo en el parmetro CREATE PROCEDURE Pagos_Alumno @CodAlumno char(10) As Select * From Pagos Where

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -196-

CodAlumno = @CodAlumno execute Pagos_Alumno 'A1'

Ejecutar un procedimiento almacenado de pagos por ao

Procedimientos con Parmetros de Salida y Valor de Retorno Los procedimientos con parmetros de salida y los de valor de retorno se usan de forma parecida, es decir, primero se definen, luego se ejecutan y finalmente se lee el valor devuelto en el parmetro. create procedure Alumnos1b @Codalumno Nchar(10), @Pagoscuenta int = 0 output as select CodAlumno,Monto from Pagos where Codalumno = @Codalumno; select @PagosCuenta = count(*) from PAGOS

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -197-

where CodAlumno = @CodAlumno return @PagosCuenta Su ejecucin Declare @ValorRetornado int, @CuentaPagos int Execute @ValorRetornado=Alumnos1b @CodAlumno='A1', @PagosCuenta=@CuentaPagos output Select @CuentaPagos as '@CuentaPagos' Select 'ValorRetorno' =@ValorRetornado

Crear un procedimiento que devuelve el pago total de todos los alumnos en la tabla pagos
CREATE procedure [dbo].[Pagototal] @MontoTotal int = 0 output As select @MontoTotal = sum(monto)from PAGOS return @MontoTotal

su ejecucin seria
Declare @ValorRetornado int Execute @ValorRetornado=PagoTotal Select 'Montototal' =@ValorRetornado

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -198-

Modificar el procedimiento anterior que devuelva la suma del monto del alumno cdigo se pasa como parmetro
CREATE procedure PagototalAlumno @Codalumno Nchar(10), @MontoTotal int = 0 output as select @MontoTotal = sum(monto)from PAGOS where codalumno=@codalumno return @MontoTotal y su ejecucion es Declare @ValorRetornado int Execute @ValorRetornado=PagoTotalAlumno 'A1' Select 'A1' as codigo, 'Montototal' =@ValorRetornado

Modificar procedimiento almacenado ya visto anteriormente. Mostrar definiciones de procedimientos almacenados. SQL Server ofrece un mecanismo de ver la definicin de los objetos creados en la base de datos. Esto se conoce como recuperacin de metadatos. La informacin acerca de los objetos se almacena en los procedimientos almacenados del sistema predefinidos que pueden ser obtenidos siempre que sea necesario. Para ver la definicin de su procedimiento almacenado, siga estos pasos: 1. Introduzca la instruccin siguiente en la ventana de consulta: Execute sp_helptext 'PA_Alumnos' 2. Vaya al men de consulta, seleccione resultados a resultados a texto y, a continuacin, haga clic en ejecutar. Ver lo siguiente

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -199-

Cambiar el nombre de procedimientos almacenados. Para cambiar el nombre de un procedimiento almacenado, siga estos pasos: Introduzca la instruccin siguiente en la ventana de consulta: Execute sp_rename 'PA_Alumnos', 'PA_Alumnos1'. 1. Haga clic en ejecutar, y ver el siguiente mensaje en la ventana de resultados, a pesar de que se ha ejecutado correctamente sp_rename: Precaucin: al cambiar cualquier parte del nombre de un objeto pueden dejar de ser vlidas secuencias de comandos y procedimientos almacenados. 2. Ahora vaya al explorador de objetos, expanda el nodo de base de datos Alumnos y, a continuacin, expanda el nodo de programacin. Seleccione el nodo, con el botn derecho y seleccione Actualizar (refresh)procedimientos almacenados. 3. Expanda el nodo de procedimientos almacenados y observe que PA_Alumnos A cambiado A Pa_Alumnos1

Figure 6-8. Renombrando un procedimiento almacenado Tambin puede renombrarlo un procedimiento almacenado haciendo click derecho en el procedimiento

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -200-

Note sp_rename funciona muy bien con la mayora de los objetos, como tablas, columnas y otros para cambiar su nombre. Trabajar con procedimientos almacenados en VB.NET. Pruebe: Ejecutar un procedimiento almacenado sin parmetros de entrada . Ejecutar el procedimiento almacenado PA_Aumnos que lista todos los registros de la tabla alumnos Ingrese a visual estudio 2008 nuevo proyecto / aplicacin de consola Imports System.Data.SqlClient Module Module1 Sub Main() Dim conn As New SqlConnection conn.ConnectionString = "Data Source=.\sqlexpress; Initial Catalog=ALUMNOS;Integrated Security=True" conn.Open() Dim cmd As SqlCommand = conn.CreateCommand() ' especifica la ejecucion del procedimiento almacenado cmd.CommandType = CommandType.StoredProcedure cmd.CommandText = "PA_Alumnos" ' ejecutando comando Dim rdr As SqlDataReader = cmd.ExecuteReader() 'procesando el conjunto de resultados While rdr.Read() Console.WriteLine("{0} {1} {2}", rdr(0).ToString().PadRight(5), rdr(1).ToString().PadRight(10), rdr(2).ToString()) End While Console.ReadLine() rdr.Close() conn.Close() End Sub End Module

Procedimientos almacenados con parmetros Si el procedimiento almacenado es ALTER PROCEDURE [dbo].[Pagos_Alumno] @CodAlumno char(10) As Select * From Pagos Where CodAlumno = @CodAlumno El programa en visual basic es Imports System.Data.SqlClient Module Module1

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -201-

Sub Main() Dim conn As New SqlConnection conn.ConnectionString = "Data Source=.\sqlexpress;Initial Catalog=Alumnos;Integrated Security=True" conn.Open() Dim cmd As SqlCommand = conn.CreateCommand() ' especifica el procedimiento almacenado a ejecutar cmd.CommandType = CommandType.StoredProcedure cmd.CommandText = "Pagos_Alumno" ' crea el parametro de entrada Dim CodAlumno1 As SqlParameter = cmd.Parameters.Add("@CodAlumno", SqlDbType.NChar, 10) CodAlumno1.Direction = ParameterDirection.Input CodAlumno1.Value = "A1" ' create parametros de salida Dim rdr As SqlDataReader = cmd.ExecuteReader() ' Process the result set While rdr.Read() Console.WriteLine("{0} {1} {2} {3} {4}", rdr(0).ToString().PadRight(5), rdr(1).ToString().PadRight(5), rdr(2).ToString().PadRight(5), rdr(3).ToString().PadRight(5), rdr(4).ToString()) End While rdr.Close() Console.ReadLine() End Sub End Module

Para modificar y eliminar procedimientos use

CAPITULO 9 CONOCIENDO A ADO.NET. El ADO.NET es un conjunto de componentes del software que pueden ser usados por los programadores para acceder a datos y a servicios de datos. Es una parte de la biblioteca de clases base que estn incluidas en el Microsoft .NET Framework. Es comnmente usado por los programadores para acceder y para modificar los datos almacenados en un Sistema Gestor de Bases de Datos Relacionales, aunque tambin puede ser usado para acceder a datos en fuentes no relacionales. ADO.NET es a veces considerado como una evolucin de la tecnologa ActiveX Data Objects (ADO),

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -202-

pero fue cambiado tan extensivamente que puede ser concebido como un producto enteramente nuevo.

Trabajar con el proveedor de datos SQL Server El.Proveedor de datos de red de SQL Server es el espacio de nombres System.Data.SqlClient. Table 9-2. Clases de SqlClient usados comumente Classes Description SqlCommand Ejecuta consultas SQL ,sentencias o procedimientos almacenados SqlConnection Representa una coneccion hac ia SQL Server database SqlDataAdapter Representa un puente entre un conjunto de datos y un origen de datos SqlDataReader Proporciona una secuencia de datos de slo avance, de slo lectura de los resultados SqlError Contiene informacin de errores de SQL Server y advertencias SqlException Define la excepcin que se produce en una advertencia o un error de SQL Server SqlParameter Representa un parametro de comando SqlTransaction Representa una trnsaccion SQL Server Listar la tabla alumnos usando proveedor de datos SQLServer Imports System.Data.SqlClient Module Module1

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -203-

Sub Main() 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() Console.WriteLine("Este programa es un demostrativos del uso del proveedor de datos de SQL") Console.WriteLine("consultando base de datos {0} con la consulta {1}" & _ ControlChars.NewLine, conn.Database, cmd.CommandText) Console.WriteLine("CodAlumno" + ControlChars.Tab + "Nombrealumno" + ControlChars.Tab + "Fecha Nac" + ControlChars.Lf) ' Procesa el resultado While reader.Read() Console.WriteLine("{0} | {1} | {2} ", reader("CodAlumno").ToString().PadLeft(10), reader(1).ToString().PadLeft(10), reader(2).ToString().PadLeft(10)) End While Catch e As Exception Console.WriteLine("Error: ", e) Finally reader.Close() conn.Close() End Try Console.ReadLine() End Sub End Module

Nota: puede tambien conectar su base de datos con

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -204-

conn.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim sql As String = "select * from alumnos" Ejercicio listar la tabla pagos y otras consultas sql Trabajar con el proveedor de datos OLE DB. OLE DB sigue siendo la tecnologa de acceso de datos de alto rendimiento de Microsoft. El proveedor de datos OLEDB ha existido durante muchos aos. Si has programado Microsoft Access en el pasado, puede recordar utilizando Microsoft Jet OLE DB 3.5 o 4.0 para conectar con una base de datos de Access. El.Proveedor de datos de NET Framework para OLE DB es el espacio de nombres System.Data.OleDb. Tabla 9-3 describe algunas clases en el espacio de nombres de OleDb. Tabla 9-a3. Clases comunes usados en OleDb Classes Description OleDbCommand Executes consultas SQL sentencias, o procedimientos almacenados OleDbConnection Representa una a conecin hacia una fuente de datos OLE DB OleDbDataAdapter Representa un puente entre un conjunto de datos y un origen de datos OleDbDataReader Proporciona una secuencia de datos de slo avance, de slo lectura de las filas de un origen de datos OleDbError Contiene informacin de errores y advertencias devueltas por el origen de datos OleDbParameter Representa un parametro de comando OleDbTransaction Representa una transacion SQL Observe la similitud entre los proveedores de datos de dos, SqlClient y OleDb. Las diferencias en sus implementaciones son transparentes, y la interfaz de usuario es fundamentalmente el mismo. La ADO.Proveedor de datos OLE DB NET requiere que se especifique un proveedor OLE DB en la cadena de conexin. Tabla 9-4 describe algunos proveedores OLE DB. Table 9-4. algunos proeveedores OLE DB Provider Description DB2OLEDB Microsoft OLE DB provider for DB2 SQLOLEDB Microsoft OLE DB provider for SQL Server Microsoft.Jet.OLEDB.4. Microsoft OLE DB provider for Access (which uses the Jet 0 engine) MSDAORA Microsoft OLE DB provider for Oracle MSDASQL Microsoft OLE DB provider for ODBC Vamos a utilizar el proveedor de datos OLE DB (SQLOLEDB) para acceder a la base de datos alumnos hecho en access 2007 (Cambiar sql o oldb)

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -205-

Listar la tabla alumnos usando proveedor de datos OLEDB Imports System.Data.OleDb Module Module1 Sub Main() 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() Console.WriteLine("Este programa es un demostrativos del uso del proveedor de datos de SQL") Console.WriteLine("consultando base de datos {0} con la consulta {1}" & _ ControlChars.NewLine, conn.Database, cmd.CommandText) Console.WriteLine("CodAlumno" + ControlChars.Tab + "Nombrealumno" + ControlChars.Tab + "Fecha Nac" + ControlChars.Lf) ' Procesa el resultado While reader.Read() Console.WriteLine("{0} | {1} | {2} ", reader("CodAlumno").ToString().PadLeft(10), reader(1).ToString().PadLeft(10), reader(2).ToString().PadLeft(10)) End While Catch e As Exception Console.WriteLine("Error: ", e) Finally reader.Close() conn.Close() End Try Console.ReadLine() End Sub End Module

Puede cambiar la cadena de conexion a

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -206-

conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\DATOS\ALUMNOS.accdb" para convertir base de datos de access 2010 a una version anterior utilice

Trabajar con el proveedor de datos ODBC. ODBC fue la tecnologa de acceso de datos de propsito general original de Microsoft. Es todava ampliamente utilizado para orgenes de datos que no tienen los proveedores OLE DB o.Proveedores de datos de NET Framework. ADO.NET incluye un proveedor de datos ODBC en el espacio de nombres System.Data.Odbc. La arquitectura ODBC es esencialmente un proceso de tres niveles. Una aplicacin utiliza funciones ODBC para enviar solicitudes de base de datos. ODBC convierte las llamadas de funcin en el Protocolo (interfaz de nivel de llamada) de un controlador especfico para un origen de datos determinado. El controlador se comunica con el origen de datos, pasando los resultados o errores hasta ODBC. Obviamente es menos eficaz que la comunicacin directa de un proveedor de datos especficos de la base de datos con una base de datos, por lo que el rendimiento es preferible evitar el proveedor de datos ODBC, ya que slo ofrece una interfaz ms simple para ODBC pero todava implica todas la sobrecarga ODBC. Tabla 9-5 describe algunas clases en el espacio de nombres de Odbc. Table 9-5. Commonly Used Odbc Classes Classes Description OdbcCommand Ejecuta consultas SQL, sentencias o procedimiento almacenados OdbcConnection Represents a connection to an ODBC data source OdbcDataAdapter Represents a bridge between a dataset and a data source OdbcDataReader Proporciona una secuencia de datos de slo avance, de slo lectura de las filas de un origen de datos OdbcError Contiene informacin de errores y advertencias devueltas por el origen de datos OdbcParameter Represents a command parameter OdbcTransaction Represents a SQL transaction Vamos a utilizar el proveedor de datos ODBC para acceder a la base de datos Alumnos(hecho en SQL server), hacer el mismo tipo de cambios sencillos (resaltado ms adelante en este captulo en listado de 9-3) en el cdigo en el listado de 9-1 como en utilizar el proveedor de datos OLE DB. Antes de hacerlo, sin embargo, es necesario crear un origen de datos ODBC en realidad, configurar un DSN (nombre de origen de datos) para su uso con un origen de

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -207-

datos accesible por ODBC para la base de datos Northwind, ya que, a diferencia de los proveedores de datos de SQL Server y OLE DB, el proveedor de datos ODBC no le permite especificar la base de datos o servidor en la cadena de conexin. (Las siguientes obras en Windows XP y el proceso es similar para otras versiones de Windows). Crear un origen de datos ODBC. Para crear un origen de datos ODBC, siga estos pasos: 1 En el Panel de Control, haga doble clic en herramientas administrativas (vase la figura 9-6). En Windows 7 . Sistema de seguridad luego herramientas administrativas

Figure 9-6. Panel de control herramientas adminsitrativas 2 En herramientas administrativas, haga doble clic en orgenes de datos (ODBC) (vase la figura 9-7). 3 Cuando se abre la ventana Administrador de orgenes de datos ODBC, haga clic en la ficha DSN de usuario y, a continuacin, haga clic en Agregar (vase la figura 9-8). Figure 9-7. herramientas administrativas : Data Sources (ODBC

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -208-

Figure 9-8. caja de dialogo de administrador de fuente de datos ODBC 4. Inicia el Asistente para crear nuevo origen de datos. Siga cuidadosamente las instrucciones! En primer lugar, seleccione el controlador de SQL Server; en segundo lugar, haga clic en Finalizar (vase la figura 9-9).

Figure 9-9. Create New Data Source wizard 5 La siguiente ventana solicita el nombre de origen de datos y el servidor. Especifique los valores de nombre y servidor como AlumnosODBC. y .\SQLEXPRESS , respectivamente, como se muestra en la figura 9-10 y haga clic en siguiente.

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -209-

Figure 9-10. Especificando nombre de la fuente de datos y conectando con SQL server 6 Acepte los valores predeterminados en la ventana de autenticacin, haga clic en siguiente (vase la figura 9-11).

Figure 9-11. Specifying SQL Server authentication 7 En la siguiente ventana, comprobar el cambio de la opcin por defecto de base de datos A, seleccione la base de datos ALUMNOS la lista desplegable y haga clic en siguiente (vase la figura 9-12).

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -210-

Figure 9-12. Especificando la base de datos por defecto 8. En la siguiente ventana simple clic en finalizar (ver Figure 9-13).

Figure 9-13. Finalizando la creacin DSN 9. Aparece una ventana de confirmacin, describiendo el nuevo origen de datos. Haga clic en probar origen de datos (vase la figura 9-14).

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -211-

Figure 9-14. verificando la coneccin a la fuente de datos alumnos 10 Una ventana de notificacin de una prueba exitosa debe aparecer (vase la figura 915). (Si no lo hace, cancelar su trabajo y cuidadosamente intentarlo). Haga clic en OK.

Figure 9-15. Connecion de BD Alumnos fue exitosa.

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -212-

11.Cuando aparezca la ventana de confirmacin, haga clic en Aceptar. Cuando vuelva a aparecer la ventana Administrador de orgenes de datos ODBC, el nuevo origen de datos figurar en la lista (vase la figura 9-16). Haga clic en Aceptar

Figure 9-16. Nuevo fuente de origen de datos aparece en la lista de fuente de datos Ahora tiene listo para trabajar con el origen de datos de AlumnosODBC. A continuacin, se utilizar en cdigo para configurar la cadena de conexin. Listar la tabla alumnos usando proveedor de datos ODBC Imports System.Data.Odbc Module Module1 Sub Main() 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() ' Execute the query Dim cmd As New OdbcCommand(sql, conn) reader = cmd.ExecuteReader() ' Display output header Console.WriteLine("Este programa es una demostracion del uso de Proveedor de datos ODBC ") Console.WriteLine("Consultando la base de datos {0} con la consulta y {1}" & _ ControlChars.NewLine, conn.Database, cmd.CommandText) Console.WriteLine("CodAlumno" + ControlChars.Tab & "NombreAlumno" + ControlChars.Tab & "FechaNac" + ControlChars.Lf)

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -213-

' Process the result set While reader.Read() Console.WriteLine("{0} | {1} | {2}", _ reader("CodAlumno").ToString().PadLeft(10), _ reader(1).ToString().PadLeft(10), reader(2).ToString().PadLeft(10)) End While Catch e As Exception Console.WriteLine("Error: ", e) Finally reader.Close() End Try Console.ReadLine() End Sub End Module .

Figure 9-17. accesando a base de datos alumnus via ODBC. Tambin podria agregar una fuente de datos ODBC de la siguiente manera

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -214-

CAPITULO 10 HACIENDO CONEXIONES Antes de hacer algo til con una base de datos, debe establecer una sesin con el servidor de base de datos. Para ello con un objeto llamado una conexin, que es una instancia de una clase que implementa la interfaz System.Data.IDbConnection para un proveedor de datos especficos. En este captulo, utilizar diversos proveedores de datos para establecer conexiones y mirar los problemas que puedan surgir y cmo resolverlos. Introduccin a las clases de conexin del proveedor de datos. cada proveedor de datos tiene su propio espacio de nombres. Cada uno tiene una clase de conexin que implementa la interfaz System.Data.IDbConnection. la Tabla 10-1 se resumen los proveedores de datos proporcionados por Microsoft. Table 10-1. Namespaces de proveedores de datos y clases de conexin Data Provider ODBC Namespace System.Data.Odbc Connection Class OdbcConnection

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -215-

OLE DB Oracle SQL SQL

System.Data.OleDb System.Data.OracleClient Server System.Data.SqlClient Server CE System.Data.SqlServerCe

OleDbConnection OracleConnection SqlConnection SqlCeConnection

Como puede ver, los nombres de seguir una Convencin, mediante conexin precedido de un identificador para el proveedor de datos. Puesto que todas las clases de conexin implementan System.Data.IDbConnection, el uso de cada uno de ellos es similar. Cada uno tiene miembros adicionales que proporcionan mtodos especficos para una base de datos determinada. Echemos un vistazo a uno de ellos, SqlConnection, en el espacio de nombres System.Data.SqlClient. Conectar a SQL Server Express con SqlConnection. A escribir un programa muy simple, slo para abrir y comprobar una conexin: Nota: este programa siempre funciona Imports System.Data.SqlClient Module Module1 Sub Main() Dim connstring As String connstring = "Data Source=.\sqlexpress;Integrated Security=True" Dim conn As SqlConnection = New SqlConnection(connstring) Try conn.Open() Console.WriteLine("Connection opened") Catch e As SqlException Console.WriteLine("Error: " & e.ToString) Finally conn.Close() Console.WriteLine("Connection closed.") End Try Console.ReadLine() End Sub End Module 3. Presione CTRL+F5 para ejecutar la aplicacin. Si la conexin es correcta, podr ver el resultado en la figura 10-1.

Figure 10-1. Conectando y disconectando Modifique y ver connstring = "Data Source=.\sqlexpress1;Integrated Security=True" y ver un mensaje de error, como se muestra en la figura 10-2.

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -216-

Figure 10-2. Error si la conexin falla mientras se conectaba con SQL Server Conexiones pueden fallar por razones que no tienen nada que ver con el cdigo. Puede ser debido a que un servidor no est iniciado o porque una contrasea es incorrecta, o existe algn otro problema de configuracin Mostrar informacin de conexin. Escribir un programa para mostrar informacin de conexin. Imports System.Data.SqlClient Module Module1 Sub Main() Dim connstring As String connstring = "data source = .\sqlexpress; Integrated Security=True" Dim conn As SqlConnection = New SqlConnection(connstring) Try conn.Open() Console.WriteLine(" Conexion abierta") 'Displaya las propiedades de la conexin Console.WriteLine("propiedades de la conexion") Console.WriteLine("cadena de conexion: {0}", conn.ConnectionString) Console.WriteLine("base de datos: {0}", conn.Database) Console.WriteLine("fuente de datos: {0}", conn.DataSource) Console.WriteLine("ServerVersion: {0}", conn.ServerVersion) Console.WriteLine("State: {0}", conn.State) Console.WriteLine("WorkstationId: {0}", conn.WorkstationId) Console.WriteLine("tiempo de conexion: {0}", conn.ConnectionTimeout) Catch e As SqlException Console.WriteLine("Error:" & e.ToString) Finally conn.Close() Console.WriteLine("Connection closed.") End Try Console.ReadLine() End Sub

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -217-

End Module 3. pulsar Ctrl + F5. Si la conexin se realiza correctamente, ver el resultado que se muestra en la figura 10-3.

Figure 10-3. Displayando informacin de la conexin Inteligence sense de vb 2008 nos ayuda a obtener propiedades y metodos de un evento

Cambie la conexin y vea el resultado

connstring = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -218-

connstring = "Data Security=True" y vea el resultado

Source=.\sqlexpress;Initial

Catalog=Alumnos;Integrated

Para adjuntar una base de datos que esta en el servidor siga los siguientes pasos 1. en agregar conexin escoja el Microsoft sql server

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -219-

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -220En propiedades escoja

Data Source=ISMAEL-PC\SQLEXPRESS;Integrated Security=True Para crear nueva base de SQLserver

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -221-

Tarea. Como usar una autenticacin con sql server Conectar a SQL Server Express con OleDbConnection. . Microsoft proporciona a los proveedores de datos de OLE DB para Microsoft SQL Server, Microsoft Access (Jet), Oracle y una variedad de otros formatos de archivo de base de datos y datos. Conectar a SQL Server Express con el proveedor de datos OLE DB. Imports System.Data.OleDb Module Module1 Sub Main() Dim connstring As String connstring = "data source = .\sqlexpress;provider = sqloledb;integrated security = sspi" Dim conn As OleDbConnection = New OleDbConnection(connstring) Try conn.Open() Console.WriteLine(" Conexion abierta") 'Displaya propiedades de las conexiones Console.WriteLine("propiedades de la conexion") Console.WriteLine("cadena de conexion: {0}", conn.ConnectionString) Console.WriteLine("base de datos: {0}", conn.Database) Console.WriteLine("fuente de datos: {0}", conn.DataSource) Console.WriteLine("ServerVersion: {0}", conn.ServerVersion) Console.WriteLine("State: {0}", conn.State) Console.WriteLine("Proveedor: {0}", conn.Provider) Catch e As OleDbException Console.WriteLine("Error:" & e.ToString) Finally conn.Close() Console.WriteLine("Coneccion cerrada.") End Try Console.ReadLine() End Sub End Module

Figure 10-4. Displayando informacin de conexin OLE DB

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -222-

Cambie la cadena y vea el resultado

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\DATOS\ALUMNOS.accdb

CAPITULO 11 EJECUTANDO COMANDOS Una vez que haya establecido una conexin a la base de datos, que desea empezar a interactuar con l y hacerlo haciendo algo til para usted. Puede que necesite agregar, actualizar, o eliminar algunos datos, o tal vez modificar la base de datos de alguna otra forma, generalmente mediante la ejecucin de una consulta. Cualquiera que sea la tarea, inevitablemente implicar un comando. Cada proveedor de datos tiene una clase de comando que implementa el System.Data. Interfaz IDbCommand. Vamos a usar el proveedor de datos de SQL Server (System.Data.SqlClient) en los ejemplos. Su comando se denomina S qlCommand. Los comandos a los dems proveedores de datos funcionan del mismo modo. Creando un comando Puede crear un comando utilizando el constructor SqlCommand o utilizando mtodos para la creacin de comandos. Crear un comando con un Constructor. En este ejemplo, podr crear un objeto SqlCommand pero no hacer nada con l. Imports System.Data.SqlClient Module Module1 Sub Main() Dim conn As SqlConnection = New SqlConnection _ ("Data Source=.\sqlexpress;Integrated Security=True; database=Alumnos") 'creando comando Dim cmd As SqlCommand = New SqlCommand Console.WriteLine("Comando creado.") Try conn.Open()

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -223-

Catch ex As SqlException Console.WriteLine(ex) Finally conn.Close() Console.WriteLine("Coneccion cerrada.") End Try Console.ReadLine() End Sub End Module Puede cambiar la conexion Dim conn As SqlConnection = New SqlConnection(" Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True") Asociar un comando con una conexin. para ejecutar en una base de datos, cada comando debe estar asociado con una conexin a la base de datos. Para ello, establezca la propiedad de conexin del comando, y a fin de ahorrar recursos, varios comandos pueden utilizar la misma conexin. Configuracin de la propiedad de conexin. Para establecer la propiedad de conexin, siga estos pasos: 1 Agregue el siguiente cdigo en bold para el bloque try de listado de 11-1. Try conn.Open() 'conectado comando con la conexin cmd.Connection = conn Console.WriteLine("comando conectado con la cenexin.") 2. Ejecutar el cdigo presionando Ctrl + F5. Debera ver los resultados en la figura 11-2

Figure 11-2. Conectando un comando a la conexin La asignacin real se produce despus de la llamada a conn.Open en este ejemplo en particular, una segunda opcin para asociar una conexin con un comando; llamar al mtodo CreateCommand de la conexin devolver un nuevo comando con la propiedad de conexin establecida a ese respecto: Dim cmd As SqlCommand = New SqlCommand cmd = conn.CreateCommand este es equivalente a Dim cmd As SqlCommand = New SqlCommand cmd.Connection = conn

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -224-

En ambos casos, termina con un comando asociado a una conexin. Todava necesita algo ms para poder utilizar el comando, y es el texto del comando. Asignacin de texto a un comando. Cada comando tiene una propiedad CommandText, que contiene la instruccin SQL para ejecutar. Puede asignar a esta propiedad directamente o especificarla al construir el comando. Configuracin de la propiedad CommandText. Para establecer la propiedad CommandText, siga estos pasos: 1. Modificar el bloque try con el siguiente cdigo en negrita: Try conn.Open() cmd.Connection = conn Console.WriteLine("Conectando comando a la conexin.") ' asociar texto SQL con con el comando cmd.CommandText = "select * from alumnos" Console.WriteLine("LISTO LA EJECUCION DE SQL:" & cmd.CommandText) 2. Ejecutar el cdigo presionando Ctrl + F5. Debera ver el resultado en la figura 11-3

. Figure 11-3. poniendo command text Ejecucin de comandos. Los comandos no son usados a menos que se puede ejecutar, Las diferencias entre estos mtodos dependen de los resultados esperados de la instruccin SQL. Las consultas devuelven filas de datos (conjuntos de resultados), pero las declaraciones INSERT, UPDATE y DELETE no. Determinar qu mtodo utilizar teniendo en cuenta los valores devueltos Table 11-1. Metodos de ejecucin de comandos Si el commando retorna. . . Nothing (no es una consulta) cero o mas filas XML Usted debe Usar . . . ExecuteNonQuery ExecuteReader ExecuteXmlReader

Si se quiere obtener un solo valor se debe utilizar el mtodo ExecuteScalar de SqlCommand para devolver uno de los resultados. utilizando el mtodo ExecuteScalar ( retorna un solo valor).

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -225-

Imports System.Data.SqlClient Module Module1 Sub Main() Dim conn As SqlConnection = New SqlConnection _ ("Data Source=.\sqlexpress; Integrated Security=True;database=Alumnos") 'creando comandos ( con ambos textos y conexin) Dim sql As String = "select count(*) from alumnos" Dim cmd As SqlCommand = New SqlCommand(sql, conn) Console.WriteLine("Comando creado y conectado .") Try conn.Open() Console.WriteLine("numero de alumnos {0}", cmd.ExecuteScalar()) Catch ex As SqlException Console.WriteLine(ex) Finally conn.Close() Console.WriteLine("Conneccion cerrada.") End Try Console.ReadLine() End Sub End Module

Figure 11-4. Ejecutando un comando escalar Modifique el programa para obtener la cantidad de los pagos, el total de los pagos 3. El mximo pago, etc Imports System.Data.SqlClient Module Module1 Sub Main() 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 count(monto) from pagos" Dim cmd As SqlCommand = New SqlCommand(sql, conn) Try conn.Open() Console.WriteLine("numero de alumnoss {0}", cmd.ExecuteScalar()) cmd.CommandType = CommandType.Text cmd.CommandText = "select sum(monto) from pagos " Console.WriteLine("total de pagos {0}", cmd.ExecuteScalar()) cmd.CommandText = "select Min(monto) from pagos " Console.WriteLine("Minimo pago {0}", cmd.ExecuteScalar()) cmd.CommandText = "select Max(monto) from pagos " Console.WriteLine("Maximo pago {0}", cmd.ExecuteScalar()) Catch ex As SqlException

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -226-

Console.WriteLine(ex) Finally conn.Close() Console.WriteLine("Conneccion cerrada.") End Try Console.ReadLine() End Sub End Module

Se puede almacenar el resultado de ExecuteScalar() en una variable total ( a veces es necesario convertir) reemplace el siguiente cdigo y vea el resultado Dim total As Integer Try conn.Open() cmd.CommandType = CommandType.Text cmd.CommandText = "select sum(monto) from pagos " total = cmd.ExecuteScalar() Console.WriteLine("total de pagos {0}", total)

ExecuteScalar() slo devuelve la primera fila del resultado y omite el resto. Pruebe y vea el resultado Dim sql As String = "select * from alumnos"

Ejecutar comandos con varios resultados. Para consultas donde el resultado esperado es devolver, utilice el comando ExecuteReader() varias filas y columnas que se

ExecuteReader() devuelve un lector de datos, una instancia de la clase SqlDataReader Utilizando el mtodo ExecuteReader. Imports System.Data.SqlClient Module Module1 Sub Main() Dim conn As SqlConnection = New SqlConnection _ ("database=alumnos;Integrated Security=True;Data Source=.\sqlexpress") 'creando comando( con ambos textos y conexion

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -227-

Dim sql As String = "select * from alumnos" Dim cmd As SqlCommand = New SqlCommand(sql, conn) Console.WriteLine("Comando creado y conectado .") Try conn.Open() Dim rdr As SqlDataReader = cmd.ExecuteReader While (rdr.Read) Console.WriteLine("Alumno : {0} {1} {2}", rdr.GetValue(0), rdr.GetValue(1), rdr.GetValue(2)) End While Catch ex As SqlException Console.WriteLine(ex) Finally conn.Close() Console.WriteLine("Coneccion cerrada.") End Try Console.ReadLine() End Sub End Module

Nota la cadena de conexion se puede poner en cualquier orden Dim conn As SqlConnection = New SqlConnection _ ("database=alumnos;Integrated Security=True;Data Source=.\sqlexpress") El objeto SqlDataReader tiene un mtodo de lectura que obtiene cada fila a su vez y un mtodo GetValue que obtiene el valor de una columna de la fila. Ejecutar sentencias de modificacin de datos. mtodo ExecuteNonQuery. El mtodo ExecuteNonQuery del comando ejecuta instrucciones SQL en lugar de consultas. 1. Insertar un registro Imports System.Data.SqlClient Module Module1 Sub Main() 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)

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -228-

Dim consulta As String = "insert into alumnos (Codalumno,nombrealumno,fechanac) values('A9', 'PEPE','1/12/1987')" Dim comando As SqlCommand = New SqlCommand("", conn) Try conn.Open() comando.CommandText = consulta Console.WriteLine("Ejecutando sentencia {0}", comando.CommandText) comando.ExecuteNonQuery() Catch ex As SqlException Console.WriteLine(ex) Finally conn.Close() Console.WriteLine("Conneccion cerrada.") End Try Console.ReadLine() End Sub End Module 2. Vea la tabla alumnos de su base de datos y no debe figurar el regisgtro que ti3ene codigo A9 3. Ejecute el programa 4. Vea la base de alumnos y la tabla alumnos debe aparecer el datos insertado Tarea Inserte varios registros generado automaticamente con cdigo Imports System.Data.SqlClient Module Module1 Sub Main() 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 consulta As String Dim comando As SqlCommand = New SqlCommand("", conn) Dim I As Integer Dim CODALUMNO As String Dim NOMBREALUMNO As String Try conn.Open() For I = 11 To 20 CODALUMNO = "'A" & I & "'" NOMBREALUMNO = "'nombre " & I & "'" consulta = "insert into alumnos " _ & "(Codalumno,nombrealumno,fechanac)" _ & "values(" & CODALUMNO & "," & NOMBREALUMNO & ",'1/12/1987')" comando.CommandText = consulta Console.WriteLine("Ejecutando sentencia {0}", comando.CommandText) comando.ExecuteNonQuery() Next Catch ex As SqlException Console.WriteLine(ex)

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -229-

Finally conn.Close() Console.WriteLine("Conneccion cerrada.") End Try Console.ReadLine() End Sub End Module Vea los registros insertados Eliminar registros Modifique la consulta anterior la linea que esta con negrita con Dim consulta As String = "delete alumnos where codalumno ='A9'" Y vea el resultado elimina el registro de codigo A9 en la tabla alumnos Modificacion de registros Cambie la consulta a y vea el resultado Dim consulta As String = "Update alumnos set nombrealumno='JORGE' where codalumno ='A1'" Uso de parmetros de comando Imports System.Data.SqlClient Module Module1 Sub Main() Dim CodAlu As String = "A98" Dim NombreAlu As String = "MIGUEL" Dim FechaNac As String = "1/1/2010" 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(@codalu,@nombrealu,@fechanac)" 'define sentencia delete Dim sqldel As String = "delete from alumnos where Codalumno = @codalu and nombrealumno = @nombrealu" 'creado comandos Dim cmdqry As SqlCommand = New SqlCommand(sqlqry, conn) Dim cmdnon As SqlCommand = New SqlCommand(sqlins, conn) cmdnon.Prepare() 'adicionando parameters hacia el comnado para sentgencias cmdnon.Parameters.Add("@CodAlu", SqlDbType.NChar, 10) cmdnon.Parameters.Add("@Nombrealu", SqlDbType.VarChar, 50) cmdnon.Parameters.Add("@Fechanac", SqlDbType.DateTime) Try conn.Open() 'ejecuta consulta para obtener numero de alumnos Console.WriteLine("ANTES INSERT: Numero de alumnos {0}", cmdqry.ExecuteScalar()) 'ejecuta nonquery para insertar alumnos

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -230-

cmdnon.Parameters("@codalu").Value = CodAlu cmdnon.Parameters("@nombrealu").Value = NombreAlu cmdnon.Parameters("@FechaNac").Value = FechaNac Console.WriteLine("Ejecutando sentencia {0}", cmdnon.CommandText) cmdnon.ExecuteNonQuery() Console.WriteLine("DESPUES INSERT: Numero de alumnos {0}", cmdqry.ExecuteScalar()) 'execute nonquery para eliminar un alumno cmdnon.CommandText = sqldel Console.WriteLine("Executando sentencia {0}", cmdnon.CommandText) cmdnon.ExecuteNonQuery() Console.WriteLine(" DESPUES DELETE: Numero de alumnos {0}", cmdqry.ExecuteScalar()) Catch ex As SqlException Console.WriteLine(ex) Finally conn.Close() Console.WriteLine("Connecion cerrada.") End Try Console.ReadLine() End Sub End Module

Figure 11-7. Usando parametros para comando CAPITULO 12 USANDO DATA READERS Comprender los lectores de datos en General. El tercer componente de un proveedor de datos, adems de conexiones y comandos, es el lector de datos. Una vez que se haya conectado a una base de datos y se necesita acceder alguna foma de conjunto de resultados. Aqu es donde entra el lector de datos Un lector de datos es un flujo conectado rpido, sin memoria intermedia, slo hacia delante, de slo lectura que recupera datos por fila. Lee una fila en un momento en que recorre un conjunto de resultados. La regla general es siempre usar un lector de datos para recuperacin de datos Bucle a travs de un conjunto de resultados. aplicacin de consola muestra cmo utilizar un SqlDataReader para recorrer un conjunto de resultados y recuperar filas.

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -231-

Utilizando los indizadores ordinales Imports System.Data.SqlClient Module Module1 Sub Main() 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) Console.WriteLine("{0}", rdr.GetValue(0)) End While rdr.Close() Catch e As Exception Console.WriteLine("Error Occurred:" & e.ToString) Finally conn.Close() End Try Console.ReadLine() End Sub End Module Para leer varios campos reemplace la parte que esta en negrita a While (rdr.Read) Console.WriteLine("{0} {1} {2} ", rdr.GetValue(0), rdr.GetValue(1), rdr.GetValue(2)) End While

Si quiere listar todos los campos de cualquier consulta entonces reemplace el cdigo que esta en negrita a Dim nc As Integer nc = rdr.FieldCount For i = 0 To rdr.FieldCount - 1 Console.Write("{0} ", rdr.GetName(i)) Next While (rdr.Read) Console.WriteLine() For i = 0 To rdr.FieldCount - 1 Console.Write("{0} ", rdr(i)) Next End While

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -232-

Y puede escribir cualquier consulta y el programa lo listara cambie de consulta y vea los resultados Puede remplazar tambin Console.Write("{0} ", rdr.GetValue(i)) Utilizando los indizadores ordinales. En el ejemplo anterior se utiliza un indizador ordinal para recuperar datos de la columna del conjunto de resultados. rdr.GetValue(0) es una referencia a la propiedad de elemento del lector de datos y devuelve el valor de la columna especificada para la fila actual. El valor se devuelve como un objeto. Uso de columnas indexado por nombre Utiliza el nombre de columna indexacin especificando nombres de columna en lugar de nmeros de ndice ordinales. Esto tiene sus ventajas. Por ejemplo, una tabla puede modificarse mediante la adicin o eliminacin de una o varias columnas, alterando el orden de columna y producir excepciones en el cdigo antiguo que utiliza indizadores ordinales. Utilizando los indizadores de nombre de columna podra evitar este problema, pero los indizadores ordinales son ms rpidos, ya que directamente hacen referencia a columnas en lugar de buscar por nombre. Par probar reemplace la parte que esta en negrita a Dim sql As String = "select * from alumnos" --While (rdr.Read) Console.WriteLine("{0} {1} {2} ", rdr("CodAlumno").ToString, rdr("NombreAlumno").ToString, rdr("FechaNac").ToString) End While Y vea el resultado

Utilizando los mtodos de descriptor de acceso con tipo.

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -233-

Cuando un lector de datos devuelve un valor de un origen de datos, los valores resultantes se recuperan y se almacenan localmente en un.NET escribe en lugar de tipo de origen de datos originales. Esta funcin de conversin de tipo en el lugar es un equilibrio entre la coherencia y la velocidad, as que darle algo de control sobre los datos que se est recuperados, los mtodos de descriptor de acceso con tipo de datos lector expone que se pueden utilizar si conoce el tipo especfico del valor que devuelve. Pruebe: Utilizando los mtodos de descriptor de acceso con tipo. (modifique del programa anterior lo que esta en negrita) Imports System.Data.SqlClient Module Module1 Sub Main() 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) 'create data reader Dim rdr As SqlDataReader = cmd.ExecuteReader While (rdr.Read) Console.WriteLine(" {0} {1} {2} {3} {4} ", rdr.GetInt32(0), rdr.GetString(1), rdr.GetSqlDateTime(2), rdr.GetDecimal(3), rdr.GetString(4)) End While rdr.Close() Catch e As Exception Console.WriteLine("Error Occurrido:" & e.ToString) Finally conn.Close() End Try Console.ReadLine() End Sub End Module

Figure 12-3. Usando acceso con tipo Use intelligence sense para los tipos de datos

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -234-

Obtener datos sobre datos. Hasta ahora, todo lo que has hecho es recuperar datos de un origen de datos. Una vez que tenga un lector de datos poblada en sus manos, puede hacer mucho ms. Hay un nmero de mtodos tiles para recuperar informacin de esquema o recuperar informacin relacionada directamente con un conjunto de resultados. La tabla 12-4 describe algunos de los mtodos de metadatos y propiedades de un lector de datos. Tabla 12-4. Data Reader Metadata Propiedades y metodos Metodo o propiedad Nombre descripcin Depth Una propiedad que obtiene la profundidad de anidacin de la fila actual FieldCount Una propiedad que contiene el nmero de columnas de la fila actual GetDataTypeName Un mtodo que acepta un ndice y devuelve una cadena que contiene el nombre del tipo de datos de columna GetFieldType Un mtodo que acepta un ndice y devuelve el tipo de objeto de NET Framework GetName Un mtodo que acepta un ndice y devuelve el nombre de la columna especificada GetOrdinal Un mtodo que acepta un nombre de columna y devuelve el ndice de columna GetSchema Un mtodo que devuelve los metadatos de columna de tabla HasRows Una propiedad que indica si el lector de datos tiene filas RecordsAffected Una propiedad que obtiene el nmero de filas modificadas, insertadas o eliminadas Pruebe: Obtener informacin acerca de un conjunto de resultados con un lector de datos. En este ejercicio, utilizar algunos de estos mtodos y propiedades. Imports System.Data.SqlClient Module Module1 Sub Main() 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)

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -235-

Dim rdr As SqlDataReader = cmd.ExecuteReader 'obteniendo nombres de las columnas Console.WriteLine("Column Name:{0} {1}", rdr.GetName(0).PadRight(20), rdr.GetName(1)) 'obteniendo tipos de datos de las columnas Console.WriteLine("Data Type:{0} {1}", rdr.GetDataTypeName(0).PadRight(20), _ rdr.GetDataTypeName(1)) Console.WriteLine() While (rdr.Read) ' obteniendo valores de las columnas para todas las filas Console.WriteLine("{0} {1} {2} {3}", rdr.GetInt32(0), rdr.GetString(1), rdr.GetDateTime(2), rdr.GetDecimal(3)) End While 'obteniendo numero de columnas Console.WriteLine() Console.WriteLine("Number of columns in a row: {0}", rdr.FieldCount) 'obteniendo informacin acerca de cada columna Console.WriteLine(" nombre columna ' {0} ' indice {1} y el tipo de objeto {2} ", rdr.GetName(0), rdr.GetOrdinal("Nro"), rdr.GetFieldType(0)) Console.WriteLine(" nombre columna ' {0} ' indice {1} y el tipo de objeto {2} ", rdr.GetName(1), rdr.GetOrdinal("CodAlumno"), rdr.GetFieldType(1)) Console.WriteLine(" nombre columna ' {0} ' indice {1} y el tipo de objeto {2} ", rdr.GetName(2), rdr.GetOrdinal("Fechapago"), rdr.GetFieldType(2)) Console.WriteLine(" nombre columna ' {0} ' indice {1} y el tipo de objeto {2} ", rdr.GetName(3), rdr.GetOrdinal("Monto"), rdr.GetFieldType(3)) Console.WriteLine(" nombre columna ' {0} ", rdr.GetDataTypeName(0)) rdr.Close() Catch e As Exception Console.WriteLine("Error Occurred:" & e.ToString) Finally conn.Close() End Try Console.ReadLine() End Sub End Module

Figure 12-4. Displayando resultados de conjunto de metadatos

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -236-

Ahora va a aprender cmo obtener informacin sobre los esquemas. Obtener datos acerca de las tablas. El termino schema tiene varios significados en lo que respecta a bases de datos relacionales. Aqu, lo utilizamos para referirse al diseo de una estructura de datos, especialmente en una tabla de base de datos. Una tabla consta de filas y columnas, y cada columna puede tener un tipo de datos diferente. Las columnas y sus atributos (tipo de datos, longitud, etctera) conforman el esquema de la tabla. Para recuperar informacin de esquema fcilmente, puede llamar al mtodo de GetSchemaTable en un lector de datos. Como sugiere su nombre, este mtodo devuelve un objeto System.Data.DataTable, que es una representacin (esquema) de la tabla de consulta y contiene una coleccin de filas y columnas en forma de objetos DataRow y DataColumn. Estas filas y columnas se devuelven como objetos de coleccin por las propiedades de filas y columnas de la clase DataTable. Sin embargo, aqu es donde generalmente se produce una ligera confusin. Los objetos de columna de datos no son valores de columna; ms bien, son definicione s de columna que representan y controlan el comportamiento de las columnas individuales. Puede ser colocadas a travs de utilizando un indizador de nombre de columna, y le puede decir mucho sobre el conjunto de datos. Obtener informacin de esquema. Aqu podr ver una demostracin prctica del mtodo GetSchemaTable Imports System.Data.SqlClient Module Module1 Sub Main() 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 Console.WriteLine _ ((col.ColumnName + " = " + row(col).ToString)) Next col Console.WriteLine("----------------") Next row rdr.Close() Catch e As Exception Console.WriteLine("Error Occurred:" & e.ToString)

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -237-

Finally conn.Close() End Try Console.ReadLine() End Sub End Module

Figure 12-5. Displayando esquema metadatos Cmo funciona. Este cdigo es un poco diferente de lo que has escrito anteriormente. Cuando se realiza la llamada al mtodo GetSchemaTable, se devuelve una instancia poblada de una tabla de datos: Utilizar el resultado de varios conjuntos con un lector de datos. Por lo tanto, hay una manera que puede obtener un lector de datos a travs de un nico bucle varios conjuntos de resultados? S, los lectores de datos tienen un mtodo, NextResult(), que desplaza el lector hasta el siguiente conjunto de resultados. Procesar varios conjuntos de resultados. En este ejemplo, utilizar NextResult() para procesar varios conjuntos de resultados. Imports System.Data.SqlClient Module Module1 Sub Main() 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)

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -238-

'create data reader Dim rdr As SqlDataReader = cmd.ExecuteReader Dim contador As Integer = 0 Do Console.WriteLine("TABLA {0} ", contador) While rdr.Read() ' imprime una fila en el tiempo Console.WriteLine("{0} : {1} {2}", rdr(0), rdr(1), rdr(2)) End While Console.WriteLine("".PadLeft(60, "=".ToString)) contador = contador + 1 Loop While rdr.NextResult() Catch e As Exception Console.WriteLine("Error Occurred:" & e.ToString) Finally conn.Close() End Try Console.ReadLine() End Sub End Module

CAPITULO 13 USANDO DATASET Y DATAADAPTERS ( FORMA DESCONECTADA)

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -239-

Conjuntos de datos son completamente independientes de y pueden usarse conectados o desconectados de orgenes de datos. Su propsito fundamental es proporcionar una vista relacional de los datos almacenados en una cach en memoria. Pensar en adaptadores de datos como puentes entre conjuntos de datos y orgenes de datos. Sin un adaptador de datos, un conjunto de datos no puede acceder a cualquier tipo de origen de datos. El adaptador de datos se encarga de todos los detalles de conexin para el conjunto de datos, rellena con datos y actualice el origen de datos. Datasets vs.Data Readers. ( lectores de datos y conjuntos de datos) Si simplemente desea leer y mostrar los datos, tendr que utilizar un lector de datos, Si necesita manipular los datos en cualquier forma y, a continuacin, actualizar la base de datos, debe utilizar un conjunto de datos. . Una breve introduccin a los conjuntos de datos. Conjuntos de datos ayudan tremendamente aqu, porque le permiten almacenar y modificar grandes cantidades de datos en una memoria cach local, ver los datos como las tablas y procesar los datos de un modo sin conexin (en otras palabras, est desconectado de la base de datos). Un conjunto de datos almacena datos relacionales como colecciones de tablas de datos. La Figura 13-1 muestra la arquitectura de conjunto de datos. La arquitectura refleja el diseo lgico de una base de datos relacional. Aprender a utilizar las tablas de datos, filas de datos y columnas de datos en este captulo.

Figure 13-1. arquitectura de un Dataset Una breve introduccin a los adaptadores de datos.

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -240-

Cuando crea una instancia de un conjunto de datos, no contiene datos. Se puede obtener un conjunto de datos poblada pasarlo a un adaptador de datos, que se encarga de los detalles de la conexin y es un componente de un proveedor de datos. Un conjunto de datos no forma parte de un proveedor de datos. Es como un cubo, listo para ser llenado con agua, pero necesita una tubera para permitir que el agua en el exterior. En otras palabras, el conjunto de datos necesita un adaptador de datos para rellenarlo con datos y apoyar el acceso al origen de datos. Cada proveedor de datos tiene su propio adaptador de datos de la misma manera que tiene su propio lector de conexin, comando y los datos. Figura 13-2 describe las interacciones entre el conjunto de datos, el adaptador de datos y el origen de datos.

Figure 13-2. interaccion de Dataset, data adapter,y data source puede crear un adaptador de datos de cuatro maneras: puede utilizar su constructor sin parmetros (asignacin de SQL y la conexin ms tarde). Puede pasar su constructor un comando ( cmd es un objeto SqlCommand). Se pueden pasar una cadena SQL y una conexin. Se pueden pasar una cadena SQL y una cadena de conexin. Una breve introduccin a las tablas de datos, columnas de datos y filas de datos. Una tabla de datos es una instancia de la clase System.Data.DataTable. Es conceptualmente similar a una tabla relacional. Como se muestra en la figura 13-1, una tabla de datos tiene colecciones de datos filas y columnas de datos. Puede acceder a estas colecciones anidadas a travs de las propiedades de filas y columnas de la tabla de datos. Obtener la coleccin de columnas de datos utilizando la propiedad de las columnas de la tabla de datos, cuya indizador acepta un nombre de columna o un ndice de base cero, por ejemplo (donde dt es una tabla de datos): Dim col As DataColumn=dt.Columns("FechaNac") Dim col As DataColumn=dt.Column(2) Una fila de datos representa los datos de una fila. Mediante programacin puede agregar, actualizar o eliminar filas en una tabla de datos. Para acceder a las filas de una tabla de datos, utilice su propiedad Rows, cuya indizador acepta un ndice de base cero, por ejemplo (donde dt es una tabla de datos): Dim row As DataRow=dt.Rows(2)

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -241-

Llenar un Dataset con un adaptador de datos. crear un conjunto de datos, rellenarlo con un adaptador de datos y, a continuacin, mostrar su contenido. Imports System.Data.SqlClient Module Module1 Sub Main() Dim connstring As String = ("Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True") 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 'rellena dataset da.Fill(ds, "ALUMNOS") 'obtiene data table Dim dt As DataTable = ds.Tables("ALUMNOS") 'displaya los datos Dim row As DataRow For Each row In dt.Rows Dim col As DataColumn For Each col In dt.Columns Console.WriteLine(row(col)) Next col Console.WriteLine("".PadLeft(20, "="c)) Next row Catch e As Exception Console.WriteLine("Error Occurred:" & e.ToString) Finally conn.Close() End Try Console.ReadLine() End Sub End Module

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -242-

Figure 13-3. Poblando un dataset Cmo funciona. En esta etapa, todo lo que tiene es un conjunto de datos vaco. La clave es que utiliza el mtodo Fill del adaptador de datos para ejecutar la consulta, recuperar los datos y rellenar el conjunto de datos: 'fill dataset da.Fill(ds, "alumnos") Con un conjunto de datos poblada a su disposicin, puede acceder a los datos en tablas de datos individuales. 'get data table Dim dt As DataTable = ds.Tables("alumnos") Para saber numero de columnas '*** nro de columna Dim nrocol As Integer = dt.Columns.Count Modifique la sentencia y vea el resultado 'displaya los datos Dim row As DataRow For Each row In dt.Rows Dim col As DataColumn For Each col In dt.Columns Console.Write(row(col).ToString.PadRight(12)) Next col Console.WriteLine() Next row Catch e As Exception

Ejemplo de for each y for next Ejemplificaremos con arreglos For Each element [ As datatype ] In group [ statements ] [ Exit For ] [ statements ]

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -243-

Next [ element ] Module Module1 Sub Main() Dim A() As Integer = {10, 20, 30, 40, 50} Dim i As Integer Console.WriteLine(" Mostrando con for next") For i = 0 To 4 Console.Write(A(i).ToString.PadRight(10)) Next i Console.WriteLine() Console.WriteLine(" Mostrando con for each") For Each nro In A Console.Write(nro.ToString.PadRight(10)) Next Console.ReadLine() End Sub End Module

Ejemplo 2 Imports System.Data.SqlClient Module Module1 Sub Main() ' crear un array y rellenarlo con valores Dim lsColores() As String = {"Azul", "Verde", "Marino", "Violeta"} Dim lsColor As String ' en cada iteracin se obtiene un elemento ' del array lsColores, y se guarda en la variable lsColor For Each lsColor In lsColores Console.Write("{0} ", lsColor) Next Console.ReadLine() End Sub End Module

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -244-

Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim ncontroles As Integer = Me.Controls.Count ListBox1.Items.Add("Name Text") For Each Control As Control In Me.Controls ListBox1.Items.Add(Control.Name & " " & Control.Text) Next Control ListBox1.Items.Add("nro controles " & ncontroles) End Sub End Class Ejemplo mostrar el elemento de la fila y columna determinada Imports System.Data.SqlClient Module Module1 Dim fila As Integer, col As Integer Sub Main() 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") Console.WriteLine("Nombre de la consulta: {0}", sql) Console.WriteLine("nombre de la tabla: {0}", ds.Tables(0)) Console.WriteLine("valores de los datos") Dim nfilas As Integer = ds.Tables(0).Rows.Count Dim ncol As Integer = ds.Tables(0).Columns.Count For fila = 0 To nfilas - 1 For col = 0 To ncol - 1 Console.Write(" {0}", ds.Tables(0).Rows(fila).Item(col).ToString.PadRight(10)) Next col Console.WriteLine() Next fila Console.WriteLine("Elemento de fila 2 y col 3 = {0}", ds.Tables(0).Rows(2).Item(3)) Console.WriteLine("modificamos elemento")

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -245-

ds.Tables(0).Rows(2).Item(3) = 500 Console.WriteLine("Elemento de fila 2 y col 3 = {0}", ds.Tables(0).Rows(2).Item(3)) Catch e As Exception Console.WriteLine("Error Occurred:" & e.ToString) Finally conn.Close() End Try Console.ReadLine() End Sub End Module

Se podra tambin mostrar otras caractersticas Console.WriteLine("nombre de la columna 0 {0}", ds.Tables(0).Columns(0).ColumnName) Console.WriteLine("nombre de la columna 0 {0}", ds.Tables(0).Columns(0).DataType)

Mostrar todas las tablas Imports System.Data.SqlClient Module Module1 Dim fila As Integer, col As Integer, k As Integer Sub Main() Dim connstring As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\alumnos.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim sql As String = "SELECT * FROM ALUMNOS;SELECT * FROM PAGOS;SELECT * FROM CURSOS " Dim conn As SqlConnection = New SqlConnection(connstring) Try conn.Open() Dim da As SqlDataAdapter = New SqlDataAdapter(sql, conn) Dim ds As DataSet = New DataSet da.Fill(ds, "pagos") ds.Tables(0).TableName = "alumnos" ds.Tables(1).TableName = "cursos" ds.Tables(2).TableName = "pagos" Console.WriteLine("Nombre de la consulta: {0}", sql)

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -246-

Dim ntablas As Integer = ds.Tables.Count Dim nfilas As Integer Dim ncol As Integer For k = 0 To ntablas - 1 Console.WriteLine(" TABLA: {0}", ds.Tables(k)) Console.WriteLine("=============") nfilas = ds.Tables(k).Rows.Count ncol = ds.Tables(k).Columns.Count For i = 0 To ncol - 1 Console.Write(" {0}", ds.Tables(k).Columns(i).ColumnName.ToString.PadRight(12)) Next i Console.WriteLine() For fila = 0 To nfilas - 1 For col = 0 To ncol - 1 Console.Write(" {0}", ds.Tables(k).Rows(fila).Item(col).ToString.PadRight(12)) Next col Console.WriteLine() Next fila Next k Console.WriteLine("Elemento de la tabla 1 fila 2 y col 3 = {0}", ds.Tables(1).Rows(2).Item(3)) Console.WriteLine("modificamos elemento") ds.Tables(1).Rows(2).Item(3) = 500 Console.WriteLine("Elemento de la tabla 1 fila 2 y col 3 = {0}", ds.Tables(1).Rows(2).Item(3)) Catch e As Exception Console.WriteLine("Error Occurred:" & e.ToString) Finally conn.Close() End Try Console.ReadLine() End Sub End Module

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -247-

Puede tambin poblar el dataset de la siguiente manera Dim sql As String Dim conn As SqlConnection = New SqlConnection(connstring) Try conn.Open() Dim da As SqlDataAdapter = New SqlDataAdapter("", conn) Dim ds As DataSet = New DataSet da.SelectCommand.CommandText = "SELECT * FROM ALUMNOS" da.Fill(ds, "alumnos") da.SelectCommand.CommandText = "SELECT * FROM PAGOS" da.Fill(ds, "pagos") da.SelectCommand.CommandText = "SELECT * FROM CURSOS" da.Fill(ds, "cursos") Console.WriteLine("Nombre de la consulta 2: {0}", da.SelectCommand.CommandText) Filtrar y ordenar en un conjunto de datos. En el ejemplo anterior, se vio cmo extraer datos de un conjunto de datos. Con frecuencia, desear dinmicamente filtrar u ordenar los datos. En el siguiente ejemplo, ver cmo se pueden utilizar filas de datos para ello. filtrando y ordenando dinmicamente datos en un Dataset. Imports System.Data.SqlClient Module Module1 Sub Main() Dim cadenaconexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\alumnos.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim sql1 As String = "select nro, codalumno, Monto from pagos" Dim con As SqlConnection = New SqlConnection(cadenaconexion) Try con.Open()

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -248-

Dim da As SqlDataAdapter = New SqlDataAdapter da.SelectCommand = New SqlCommand(sql1, con) Dim ds As DataSet = New DataSet da.Fill(ds, "pagos") ' obtiene la coleccion de la tablas Dim dtc As DataTableCollection = ds.Tables ' displaya datos de la primera tablas Console.WriteLine("Results de la consulta {0} ", sql1) Console.WriteLine(("Nro".PadRight(10) + "Codalumno".PadLeft(10) + "Monto".PadLeft(10) + ControlChars.Lf)) '' poner filtro para displayar Dim fl As String = "codalumno = 'A1'" ' para ordenar Dim srt As String = "Nro" ' display los datos filtrado y ordenados Dim row As DataRow For Each row In dtc("pagos").Select(fl, srt) Console.WriteLine("{0} {1} {2} ", row("Nro").ToString.PadLeft(10), row("CodAlumno").ToString.PadLeft(10), row("Monto").ToString.PadLeft(10)) Next row Catch e As Exception Console.WriteLine("Error Occurred:" & e.ToString) Finally con.Close() End Try Console.ReadLine() End Sub End Module

Mostrar todos los registros de filtrado por codigo del alumno y ordenado por numero Imports System.Data.SqlClient Module Module1 Dim i As Integer Sub Main() Dim cadenaconexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\alumnos.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim sql1 As String = "select * from pagos" Dim con As SqlConnection = New SqlConnection(cadenaconexion) Try

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -249-

con.Open() Dim da As SqlDataAdapter = New SqlDataAdapter da.SelectCommand = New SqlCommand(sql1, con) Dim ds As DataSet = New DataSet da.Fill(ds, "pagos") ' obtiene la coleccion de la tablas Dim dtc As DataTableCollection = ds.Tables Dim nfilas As Integer nfilas = ds.Tables(0).Rows.Count Console.WriteLine("Resultados de la consulta {0} ", sql1) For i = 0 To ds.Tables(0).Columns.Count - 1 Console.Write(" {0} ", ds.Tables(0).Columns(i).ColumnName.ToString.PadRight(12)) Next Console.WriteLine() Dim fl As String = "codalumno = 'A1' " Dim srt As String = "Nro" Dim row As DataRow Dim ncol As Integer = ds.Tables(0).Columns.Count For Each row In dtc("pagos").Select(fl, srt) For k = 0 To ncol - 1 Console.Write("{0} ", row(k).ToString.PadLeft(10)) Next Console.WriteLine() Next row Catch e As Exception Console.WriteLine("Error Occurred:" & e.ToString) Finally con.Close() End Try Console.ReadLine() End Sub End Module

Sin filtro ordenado por monto ( muestra todos los registros) For Each row In dtc("pagos").Select("", "Monto") Sin filtro ordenado por monto en forma descendente For Each row In dtc("pagos").Select("", "Monto Desc") Filtrado por codigo de alumno y ordenado por fechapago For Each row In dtc("pagos").Select("codalumno='A1'", "FECHAPAGO Desc") Si no abre ni se cierra la conexion funciona igual ( es modo desconectado) NOTA se puede realizar lo mismo con

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -250-

Imports System.Data.SqlClient Module Module1 Sub Main() Dim fila As Integer, col As Integer Dim cadenaconexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\alumnos.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim sql1 As String = "select nro, codalumno, Monto from pagos where codalumno='A1' order by Nro Asc" Dim con As SqlConnection = New SqlConnection(cadenaconexion) Try con.Open() Dim da As SqlDataAdapter = New SqlDataAdapter da.SelectCommand = New SqlCommand(sql1, con) Dim ds As DataSet = New DataSet da.Fill(ds, "pagos") For col = 0 To ds.Tables(0).Columns.Count - 1 Console.Write("{0}", ds.Tables(0).Columns(col).ColumnName.ToString.PadRight(12)) Next Console.WriteLine() For fila = 0 To ds.Tables(0).Rows.Count - 1 For col = 0 To ds.Tables(0).Columns.Count - 1 Console.Write("{0}", ds.Tables(0).Rows(fila).Item(col).ToString.PadRight(12)) Next Console.WriteLine() Next Catch e As Exception Console.WriteLine("Error Occurred:" & e.ToString) Finally con.Close() End Try Console.ReadLine() End Sub End Module

Comparacin de FilterSort a PopDataSet. Por lo tanto, aunque los conjuntos de datos son completamente independientes de bases de datos (y conexiones), utiliza un conjunto de datos no significa que ejecuta desconectado de una base de datos. Si desea ejecutar desconectado, utilizar conjuntos de datos, pero no abrir conexiones antes de rellenarles (o, si una conexin est abierta, cirrelo primero). Conjuntos de datos en s mismos no implican operaciones conectadas o desconectadas. Salir con el estndar conn.Close(); en el bloque finally. Ya que se puede llamar Close() sin error en una conexin cerrada, no presenta ningn problema si llama

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -251-

innecesariamente, pero definitivamente garantiza que se cerrar la conexin, pase lo que pase en el bloque try. Usando vistas de datos. Una vista de datos (una instancia de la clase System.Data.DataView) permite crear vistas dinmicas de los datos almacenados en una tabla de datos subyacente, lo que refleja todos los cambios realizados en su contenido y sus pedidos. Esto difiere del mtodo Select, que devuelve una matriz de filas de datos cuyo contenido refleja los cambios en los valores de datos pero no los datos pedidos. Nota Una vista de datos es una representacin dinmica del contenido de una tabla de datos. Como una vista SQL, que realmente no contener datos Perfeccionamiento de datos con una vista de datos. ejemplo que utiliza una vista de datos para ordenar y filtrar una tabla de base de datos de forma dinmica . filtrado por cdigo de alumno y ordenado por monto en forma descendente Imports System.Data.SqlClient Module Module1 Sub Main() 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 Dim da As SqlDataAdapter = New SqlDataAdapter da.SelectCommand = New SqlCommand(sql, conn) Dim ds As DataSet = New DataSet da.Fill(ds, "pagos") Dim dt As DataTable = ds.Tables("pagos") ' crea vista de datos Dim dv As New DataView(dt, "codalumno = 'A1'", "monto desc", DataViewRowState.CurrentRows) Dim drv As DataRowView For Each drv In dv Dim i As Integer For i = 0 To dv.Table.Columns.Count - 1 Console.Write(" {0} ", drv(i)) Next i Console.WriteLine() Next drv Catch e As Exception Console.WriteLine("Error Occurred:" & e.ToString) Finally conn.Close() End Try Console.ReadLine() End Sub End Module

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -252-

Sin filtro y ordenado por codalumno Dim dv As New DataView(dt, "", "codalumno", DataViewRowState.CurrentRows) Cmo funciona. Crea una nueva vista de datos y inicializarlo pasando parmetros a su constructor Dim dv As New DataView(dt, "codalumno = 'A1'", "codalumno", DataViewRowState.CurrentRows) El primer parmetro es una tabla de datos, el segundo es un filtro para el contenido de la tabla de datos, la tercera es la columna de ordenacin y la cuarta especifica los tipos de filas para incluir en la vista de datos. Puede modificar la ordenacion Dim dv As New DataView(dt, "codalumno = 'A1'", "codCurso DESC", DataViewRowState.CurrentRows) System.Data.DataViewRowState es una enumeracin de los Estados que pueden tener filas en la tabla de datos subyacente de una vista de datos. Tabla 13-1 se resumen los Estados Table 13-1. Data View Row States Members Description Added Adiciona una nueva fila CurrentRows Filas actuales incluso sin cambios, nuevos y modificados Deleted Una fila eliminada ModifiedCurrent La version actual de una fila modificada La versin original de una fila modificada ModifiedOriginal Ninguna de las filas None OriginalRows Filas originales, incluyendo sin modificar y eliminan filas Una fila que no ha sido modificado Unchanged Cada vez que una fila es agregada, modificada o eliminada, cambia su estado de fila a la apropiada en el cuadro 13-1. Como una fila de datos representa una fila en una tabla de datos, una vista de fila de datos (quizs hubiera sido mejor llamarlo una fila de la vista de datos) representa una nica fila en una vista de datos. Como sugiere este sencillo ejemplo, vistas de datos ofrecen un medio poderoso y flexible de cambiar dinmicamente qu funciona datos dentro de una tabla de datos. Modificar datos en un Dataset.

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -253-

Note Los cambios realizados a un conjunto de datos no se propagan automticamente a una base de datos. Para guardar los cambios en una base de datos, debe conectarse de nuevo a la base de datos y realizar explcitamente las actualizaciones necesarias. Modificar una tabla de datos en un Dataset. Vamos a actualizar una fila y agregar una fila en una tabla de datos Imports System.Data.SqlClient Module Module1 Sub Main() Dim connstring As String = "Data Source=.\sqlexpress;Integrated Security=True;database=Alumnos" Dim sql As String = "select * from alumnos " Dim conn As SqlConnection = New SqlConnection(connstring) Try Dim da As New SqlDataAdapter() da.SelectCommand = New SqlCommand(sql, conn) Dim ds As New DataSet() da.Fill(ds, "alumnos") Dim dt As DataTable = ds.Tables("alumnos") ' La columna Codalumno debera ser 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 Console.WriteLine("{0} {1} {2}", row("codalumno").ToString().PadLeft(5), row("nombrealumno").ToString().PadRight(20), row("fechanac").ToString.PadRight(40)) Next row Catch e As Exception Console.WriteLine("Error: " + e.ToString) Finally conn.Close() End Try Console.ReadLine() End Sub End Module

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -254-

Figure 13-6.Modificando un data table Propagar cambios a un origen de datos. Un adaptador de datos rellena las tablas de datos de un conjunto de datos. Lo que no ha visto an es cmo un adaptador de datos se actualiza y sincroniza un origen de datos con datos de un conjunto de datos. Tiene tres propiedades que apoyan (anlogo a su propiedad SelectCommand, que apoya las consultas): UpdateCommand InsertCommand DeleteCommand Se describir brevemente cada una de estas propiedades y luego ponerlas a trabajar. Propiedad UpdateCommand. La propiedad UpdateCommand del adaptador de datos contiene el comando que se utiliza para actualizar el origen de datos cuando se llama al mtodo Update del adaptador de datos. Propagacin de cambios de conjunto de datos a un origen de datos. Aqu va a cambiar el nombre del alumnos en la primera fila de la tabla alumnos y persiste el cambio en la base de datos Imports System.Data.SqlClient Module Module1 Sub Main() Dim connstring As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" 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 conn.Open() Dim da As New SqlDataAdapter() da.SelectCommand = New SqlCommand(qry, conn) Dim ds As New DataSet() da.Fill(ds, "alumnos")

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -255-

' get data table reference Dim dt As DataTable = ds.Tables("alumnos") ' modifica nombre en la primera fila dt.Rows(0)("NombreAlumno") = "Alberto" ' display rows Dim row As DataRow For Each row In dt.Rows Console.WriteLine("{0} {1} {2}", _ row("codalumno").ToString().PadRight(15), row("nombrealumno").ToString().PadLeft(20), row("FechaNac")) Next row ' update alumnos Dim cmd As New SqlCommand(upd, conn) cmd.Parameters.Add("@Nombre", SqlDbType.VarChar, 50, "nombrealumno") ' Codalumno 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 e As Exception Console.WriteLine("Error: " + e.ToString) Finally conn.Close() End Try Console.ReadLine() End Sub End Module

Figure 13-7.Modificando una fila Cmo funciona. Puedes agregar una instruccin UPDATE y cambian el nombre de la variable original de cadena de consulta de sql a upd para distinguirse claramente esta declaracin: , A continuacin, llame al mtodo Update del adaptador de datos para propagar el cambio a la base de datos. Aqu tiene slo un cambio, pero ya tiene parmetros SQL, el adaptador de datos buscar todas las filas modificadas en la tabla de datos de empleados y enviar actualizaciones para todos ellos a la base de datos.

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -256-

' Update database da.UpdateCommand = cmd da.Update(ds, "alumnos") se puede ver la ,modificacin en la tabla alumnos

Propiedad InsertCommand. El adaptador de datos utiliza la propiedad InsertCommand para insertar filas en una tabla. Al llamar al mtodo Update, todas las filas en la tabla de datos se buscan y se propaga a la base de datos. Propagacin de nuevas filas de conjunto de datos a un origen de datos. Vamos a propagar una nueva fila a la base de datos, Imports System.Data.SqlClient Module Module1 Sub Main() Dim connstring As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" 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 conn.Open() 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") ' adiciona una nueva fila Dim newRow As DataRow = dt.NewRow() newRow("codalumno") = "A24" newRow("NombreAlumno") = "BETTY" newRow("FechaNac") = "15/06/2002" dt.Rows.Add(newRow) ' displaya filas Dim row As DataRow For Each row In dt.Rows Console.WriteLine("{0} {1} {2}", _ row("codalumno").ToString().PadRight(10), _ row("NombreAlumno").ToString().PadLeft(25), row("FechaNac").ToString) Next row ' inserta alumnos

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -257-

Dim cmd As New SqlCommand(ins, conn) ' mapa de los parametros 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 e As Exception Console.WriteLine(("Error: " + e.ToString)) Finally conn.Close() End Try Console.ReadLine() End Sub End Module

Propiedad DeleteCommand. Utilice la propiedad DeleteCommand para ejecutar instrucciones SQL y eliminar. En este ejemplo, podr modificar de nuevo para eliminar una fila de la base de datos. Imports System.Data.SqlClient Module Module1 Sub Main() Dim connstring As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" 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") Dim cmd As SqlCommand = New SqlCommand(del, conn) cmd.Parameters.Add("@codigo", SqlDbType.NChar, 10, "codalumno") 'select alumnos Dim filt As String = "codalumno = 'A25'" Dim row As DataRow For Each row In dt.Select(filt) row.Delete()

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -258-

Next row da.DeleteCommand = cmd da.Update(ds, "alumnos") ' display rows For Each row In dt.Rows Console.WriteLine("{0} {1} {2}", _ row("codalumno").ToString().PadRight(15), _ row("nombrealumno").ToString().PadLeft(25), row("FechaNac")) Next row Catch e As Exception Console.WriteLine(("Error: " + e.ToString)) Finally conn.Close() End Try Console.ReadLine() End Sub End Module

Figure 13-9. eliminando una fila Constructores de comando. Para poder generar dinmicamente instrucciones INSERT, DELETE y UPDATE, el generador de comando utiliza la propiedad SelectCommand del adaptador de datos para extraer metadatos de la tabla de base de datos. Para crear un generador de comando, se crea una instancia de la clase de generador de comando del proveedor de datos, pasando de un adaptador de datos para su constructor. Por ejemplo, el cdigo siguiente crea un generador de comandos de SQL Server: Dim da As SqlDataAdapter=New SqlDataAdapter Dim cb As SqlCommandsBuilder=New SqlCommandBuilder Nota para un generador de comando para trabajar, la propiedad SelectCommand de adaptador de datos debe contener una consulta que devuelve una clave principal o una clave nica para la tabla de base de datos. Si no est presente, se genera una excepcin InvalidOperation, y no generaron los comandos Utilizando SqlCommandBuilder. Imports System.Data.SqlClient Module Module1 Sub Main()

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -259-

Dim connstring As String = "Data Source=ISMAEL-PC\SQLEXPRESS;Initial Catalog=ALUMNOS;Integrated Security=True" 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) ' create and fill dataset Dim ds As New DataSet() da.Fill(ds, "alumnos") ' get data table reference Dim dt As DataTable = ds.Tables("alumnos") Dim newRow As DataRow = dt.NewRow() newRow("codalumno") = "A7" newRow("nombrealumno") = "MARTIN" newRow("fechaNac") = "1/1/2007" dt.Rows.Add(newRow) ' display rows Dim row As DataRow For Each row In dt.Rows Console.WriteLine("{0} {1} {2}", _ row("codalumno").ToString().PadRight(15), _ row("nombrealumno").ToString().PadLeft(20), row("fechanac")) Next row da.Update(ds, "alumnos") Catch e As Exception Console.WriteLine(("Error: " + e.ToString)) Finally conn.Close() End Try Console.ReadLine() End Sub End Module

Figure 13-10. Adicionando una fila usando un command builder Obviamente, es preferible a manualmente cdigo SQL; utilizar constructores de comando funcionan slo en tablas y que la tabla de base de datos subyacente debe tener una clave principal o nica. Tambin, el propiedad SelectCommand de adaptador de datos debe tener una consulta que incluya las columnas de clave.

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -260-

Utilizando conjuntos de datos y XML. XML es el medio fundamental para transferencia de datos en.ADO.NET. De hecho, XML es una base importante para ADO.NET. Conjuntos de datos organizan datos internamente en formato XML y tienen una variedad de mtodos para leer y escribir en XML. Por ejemplo: Puede importar y exportar la estructura de un conjunto de datos como un esquema XML utilizando mtodos ReadXmlSchema de System.Data.DataSet y WriteXmlSchema. Puede leer los datos (y, opcionalmente, el esquema) de un conjunto de datos y escribir en un archivo XML con ReadXml() y WriteXml(). Esto puede ser til al intercambiar datos con otra aplicacin o hacer una copia local de un conjunto de datos. Se puede enlazar un conjunto de datos a un documento XML (una instancia de System.Xml. XmlDataDocument). El documento de conjunto de datos y los datos se sincronizan, tan bien ADO.Las operaciones de la red o XML pueden utilizarse para modificarlo.

Extraccin de un conjunto de datos a un archivo XML. Puede conservar el contenido y esquema de un conjunto de datos en un archivo XML utilizando el mtodo de WriteXml del conjunto de datos o en archivos separados mediante WriteXml() y WriteXmlSchema(). WriteXml() est sobrecargado, y en este ejemplo mostraremos una versin que extrae los datos y el esquema. Listing 13-9. WriteXML.vb Imports System.Data.SqlClient Module Module1 Sub Main() 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") 'extract dataset to XML file ds.WriteXml("E:\DATOS\alumnostable.xml") Console.WriteLine(" el archivo XML a sido creado") Catch e As Exception Console.WriteLine("Error Occurred:" & e.ToString) Finally conn.Close() End Try

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -261-

Console.ReadLine() End Sub End Module

Figure 13-11. Extracting a data table as XML 4. No parece haber ocurrido, pero eso es porque escribi a un archivo en lugar de a la pantalla. Abra productstable.xml para ver el cdigo XML. (Una forma en Visual Studio es utilizar el archivo abrir el archivo). Figura 13-12 muestra el XML que se extraen de las primeras filas de cinco productos. <?xml version="1.0" standalone="yes"?> <NewDataSet> <Alumnos> <CodAlumno>A1 </CodAlumno> <NombreAlumno>javier </NombreAlumno> <FechaNac>1989-01-01T00:00:00-05:00</FechaNac> </Alumnos> <Alumnos> <CodAlumno>a22 </CodAlumno> <NombreAlumno>JUAN CARLOS</NombreAlumno> <FechaNac>2001-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>EUTAQUIO </NombreAlumno> <FechaNac>2001-01-01T00:00:00-05:00</FechaNac> </Alumnos> <Alumnos> <CodAlumno>A9 </CodAlumno> <NombreAlumno>JOSE</NombreAlumno> <FechaNac>2001-01-01T00:00:00-05:00</FechaNac> </Alumnos> <Alumnos> <CodAlumno>B2 </CodAlumno> <NombreAlumno>KAREN</NombreAlumno> <FechaNac>2007-02-01T00:00:00-05:00</FechaNac> </Alumnos> </NewDataSet> Figure 13-12. Data table extracted as XML

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -262-

De forma predeterminada, documentos extrados XML son archivos de texto sin formato. Puede abrir el archivo productstable.xml en cualquier editor, o incluso utilizar el tipo o ms comandos para verlo desde la lnea de comandos. Tablas de datos sin conjuntos de datos. Como mencionamos en nuestro primer ejemplo, "Llenar un Dataset con un adaptador de datos," tablas de datos pueden utilizarse sin conjuntos de datos. La mayora de los casos esto implica llamando a los mismos mtodos en tablas de datos que utiliza para conjuntos de datos. Daremos un ejemplo. Entonces podr analogize de ella para otros procesos. Note Conjuntos de datos y tablas de datos tambin pueden utilizarse sin adaptadores de datos. Sea ms all del alcance de este libro. Rellenar una tabla de datos con un adaptador de datos . En este ejemplo se basa en nuestro primer ejemplo, PopDataSet.vb (listado de 13 - 1). Crear una tabla de datos, rellenarlo con un adaptador de datos y, a continuacin, mostrar su contenido. Imports System.Data.SqlClient Module Module1 Sub Main() 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) Dim row As DataRow For Each row In dt.Rows Dim col As DataColumn For Each col In dt.Columns Console.WriteLine(row(col)) Next col Console.WriteLine("".PadLeft(20, "="c)) Next row Catch e As Exception Console.WriteLine("Error Occurred:" & e.ToString) Finally conn.Close() End Try Console.ReadLine() End Sub End Module

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -263-

Cmo funciona. En lugar de crear un conjunto de datos Dim ds As New DataSet() crear una tabla de datos: Dim dt As DataTable = New DataTable Y en lugar de rellenar un conjunto de datos: da.Fill(ds, "products") rellenar una tabla de datos: da.Fill(dt) Entendiendo dataset con tipo y sin tipo . Conjuntos de datos pueden ser con tipo sin tipo. Los conjuntos de datos que se ha utilizado hasta ahora han sido sin tipo. Eran casos de System.Data.DataSet. Un conjunto de datos sin tipo no tiene ningn esquema integrado. Un dataset con tipo es uno que se deriva de System.Data.DataSet y utiliza un esquema XML (normalmente en un archivo .xsd) en la declaracin de la clase dataset. Informacin del esquema (tablas, columnas, etc.) es extrada, generada como cdigo de Visual Basic y compilada, as que la nueva clase de conjunto de datos es un real.Tipo de NET con objetos adecuados y propiedades. Conjuntos de datos con tipo o sin tipo son igualmente vlidas, pero datasets con tipo son ms eficientes y puede hacer algo ms que el simple cdigo. Por ejemplo, utilizando un conjunto de datos sin tipo, deber escribir esto: Console.WriteLine(ds.Tables(0).Rows(0)("CompanyName")) para obtener el valor de la columna CompanyName de la tabla Customers, suponiendo que la tabla de datos fue el primero en el conjunto de datos. Con un dataset con tipo, puede acceder a sus tablas de datos y las columnas de datos como miembros de clase. El cdigo anterior se podra reemplazar con esto: Console.WriteLine(ds.Customers(0).CompanyName) hacer el cdigo ms intuitiva. Adems, el editor de cdigo de Visual Studio tiene IntelliSense de soporte para datasets con tipo. Datasets con tipo son ms eficientes que los conjuntos de datos sin tipo porque datasets con tipo tienen un esquema definido, y cuando est rellena con datos, conversin y la identificacin del tipo de tiempo de ejecucin no es necesarios, ya que

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -264-

esto se ha cuidado de en tiempo de compilacin. Conjuntos de datos sin tipo tienen mucho trabajo por hacer cada vez que se carga un conjunto de resultados. Sin embargo, datasets con tipo no son siempre la mejor opcin. Si usted est tratando con datos que bsicamente no est bien definidos, cuya definicin dinmicamente cambia, o es slo de inters temporal, la flexibilidad de los conjuntos de datos sin tipo puede superar los beneficios de los escritos. Tarea Cargar una base de datos excel con ODBC

CONFIGURAR ORIGEN DE DATOS ODBC CON WINDOWS XP

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -265-

Buscar la ayuda y soporte tcnico

Clic en iniciar bsqueda

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -266-

Aparece el siguiente cuadro

Y contine como con el Windows 7 MENU MODO CONECTADO Menu de mantenimiento de base de datos alumnos Imports System.Data.SqlClient Module Module1 Sub Main() 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 sqlqry As String = "select count(*) from alumnos"

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -267-

Dim Opcion As Integer Dim codalumno As String Dim nombrealumno As String Dim FechaNac As String Dim comando As SqlCommand = New SqlCommand(sqlqry, conn) Dim rdr As SqlDataReader Dim nrocol As Integer Dim i As Integer Try Do Console.WriteLine(" 1. listar 2. modificar 3 Agregar 4 Eliminar 5 salir ") Console.WriteLine(" Ingrese opcion ") Opcion = Console.ReadLine() Select Case Opcion Case 1 conn.Open() Console.WriteLine("Conneccion ABIERTA.") comando.CommandText = sqlqry Console.WriteLine(": Numero de alumnos {0}", comando.ExecuteScalar()) comando.CommandText = " SELECT * FROM ALUMNOS" rdr = comando.ExecuteReader Console.WriteLine("Ejecutando sentencia {0}", comando.CommandText) nrocol = rdr.FieldCount While (rdr.Read) For i = 0 To nrocol - 1 Console.Write("{0} ", rdr.GetValue(i).ToString.PadRight(10)) Next Console.WriteLine() End While conn.Close() Case 2 conn.Open() Console.WriteLine("Ingrese el codigo del alumno a modificar") codalumno = Console.ReadLine() Console.WriteLine("Ingrese el NUEVO NOMBRE del alumno a modificar") nombrealumno = Console.ReadLine() Console.WriteLine("Ingrese el NUEVA fecha de nacimiento '1/'1/1988'") FechaNac = Console.ReadLine() comando.CommandText = " UPDATE ALUMNOS SET NOMBREALUMNO ='" & nombrealumno & " ', FECHANAC=' " & FechaNac & "' WHERE CODALUMNO ='" & codalumno & " ' " Console.WriteLine("Ejecutando sentencia {0}", comando.CommandText) comando.ExecuteNonQuery() conn.Close() Case 3 conn.Open() Console.WriteLine("Ingrese el codigo del alumno a Agregar") codalumno = Console.ReadLine()

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -268-

Console.WriteLine("Ingrese NOMBRE del alumno a insertar") nombrealumno = Console.ReadLine() Console.WriteLine("Ingrese fecha de nacimiento '1/'1/1988'") FechaNac = Console.ReadLine() comando.CommandText = " INSERT INTO ALUMNOS ( Codalumno,nombrealumno,fechanac) values ('" & codalumno & "' , '" & nombrealumno & "' , '" & FechaNac & "')" Console.WriteLine("Ejecutando sentencia {0}", comando.CommandText) comando.ExecuteNonQuery() conn.Close() Case 4 conn.Open() Console.WriteLine("Ingrese el codigo del alumno a eliminar") codalumno = Console.ReadLine() comando.CommandText = " DELETE FROM ALUMNOS WHERE CODALUMNO = '" & codalumno & "' " Console.WriteLine("Ejecutando sentencia {0}", comando.CommandText) comando.ExecuteNonQuery() conn.Close() End Select Loop Until Opcion = 5 Catch ex As SqlException Console.WriteLine(ex) Finally conn.Close() Console.WriteLine("Conneccion cerrada.") End Try Console.ReadLine() End Sub End Module

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -269-

FOR EACH CON TRES TABLAS Imports System.Data.SqlClient Module Module1 Sub Main() Dim connstring As String = "Data Source=.\sqlexpress;Integrated Security=True;database=alumnos" Dim conn As SqlConnection = New SqlConnection(connstring) Dim ColTabla As DataColumn Dim filaTabla As DataRow Dim tabla As DataTable Try conn.Open() Dim da As SqlDataAdapter = New SqlDataAdapter("", conn) da.SelectCommand.CommandText = "SELECT * FROM ALUMNOS " Dim ds As DataSet = New DataSet

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -270-

da.Fill(ds, "ALUMNOS") da.SelectCommand.CommandText = "SELECT * FROM PAGOS " da.Fill(ds, "PAGOS") da.SelectCommand.CommandText = "SELECT * FROM CURSOS " da.Fill(ds, "CURSOS") Console.WriteLine(" nombre de dataset {0} ", ds.DataSetName) Console.WriteLine(" numero de tablas {0} ", ds.Tables.Count) For Each tabla In ds.Tables Console.WriteLine(" nombre de la tabla {0} ", tabla.TableName) For Each ColTabla In tabla.Columns Console.Write(" {0} ", ColTabla.ColumnName) Next Console.WriteLine() For Each filaTabla In tabla.Rows For Each ColTabla In tabla.Columns Console.Write(" {0} ", filaTabla.Item(ColTabla)) Next ColTabla Console.WriteLine() Next filaTabla Next tabla Catch e As Exception Console.WriteLine("Error Occurred:" & e.ToString) Finally conn.Close() End Try Console.ReadLine() End Sub End Module

MENU DE BASE DE DATOS EN FORMA DESCONECTADA realizar el mantenimiento de la base de datos alumnos en forma desconectada usando dataset, datatable y/o dataview similar a la mostrada

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -271-

Imports System.Data.SqlClient Module Module1 Sub Main() 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 Opcion As Integer, Pos As Integer Dim codalumno As String Dim nombrealumno As String Dim FechaNac As String 'Dim comando As SqlCommand = New SqlCommand("", conn) Dim nfilas As Integer, ncol As Integer, i As Integer Dim fila, col As Integer Dim da As SqlDataAdapter = New SqlDataAdapter("", conn) Dim ds As DataSet = New DataSet Dim dt As DataTable = New DataTable Dim filaReg As DataRow Try da.SelectCommand.CommandText = "SELECT * FROM ALUMNOS " da.Fill(ds, "ALUMNOS") dt = ds.Tables("alumnos") Do Console.WriteLine(" 1. listar 2. modificar 3 Agregar 4 Eliminar 5 Enviar Cambios 6 salir ") Console.WriteLine(" Ingrese opcion ")

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -272-

Opcion = Console.ReadLine() Select Case Opcion Case 1 nfilas = dt.Rows.Count ncol = dt.Columns.Count Console.WriteLine(" nombre de la tabla {0} ", dt.TableName) For col = 0 To ncol - 1 Console.Write(" {0} ", dt.Columns(col).ColumnName) Next Console.WriteLine() For fila = 0 To nfilas - 1 For col = 0 To ncol - 1 Console.Write(" {0} ", dt.Rows(fila).Item(col)) Next Console.WriteLine() Next Case 2 ' modificar Console.WriteLine("Ingrese la fila de la tabla a modificar") pos = Console.ReadLine Console.WriteLine("Ingrese codigo de alumno a modifcar ") codalumno = Console.ReadLine() Console.WriteLine("Ingrese NOMBRE del alumno a insertar") nombrealumno = Console.ReadLine() Console.WriteLine("Ingrese fecha de nacimiento '1/'1/1988'") FechaNac = Console.ReadLine() ds.Tables(0).Rows(pos).Item(0) = codalumno ds.Tables(0).Rows(pos).Item(1) = nombrealumno ds.Tables(0).Rows(pos).Item(2) = FechaNac Case 3 ' adicionar Console.WriteLine("Ingrese el codigo del alumno a Agregar") codalumno = Console.ReadLine() Console.WriteLine("Ingrese NOMBRE del alumno a insertar") nombrealumno = Console.ReadLine() Console.WriteLine("Ingrese fecha de nacimiento '1/'1/1988'") FechaNac = Console.ReadLine() filaReg = dt.NewRow() filaReg("Codalumno") = codalumno filaReg(1) = nombrealumno filaReg(2) = FechaNac dt.Rows.Add(filaReg) Case 4 Console.WriteLine("Ingrese la fila a eliminar") pos = Console.ReadLine filaReg = ds.Tables(0).Rows(Pos) filaReg.Delete() Case 5 conn.Open() Dim cbd As New SqlCommandBuilder(da)

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -273-

da.Update(ds, "alumnos") conn.Close() End Select Loop Until Opcion = 6 Catch ex As SqlException Console.WriteLine(ex) Finally conn.Close() Console.WriteLine("Conneccion cerrada.") End Try Console.ReadLine() End Sub End Module TAREA Crea una base de datos minimo 3 tablas y practique las Sentancias sql Las sentencias sql puede practicar con EXCEL Accees SQL SERVER 2005 Herramienta de visual basic 2008 Con visual BASIC 2008 modo consola forma conectada y desconectada Con visual basic modo formulario EJECUCION DE CONSULTAS EN MODO CONSOLA Imports System.Data.SqlClient Module Module1 Sub Main() Dim conn As SqlConnection = New SqlConnection("Data Source=.\sqlexpress;Integrated Security=True;database=alumnos") Dim Opcion As Integer Dim consulta As String Dim comando As SqlCommand = New SqlCommand("", conn) Dim rdr As SqlDataReader Dim nrocol As Integer Try Do Console.WriteLine(" 1. Consulta Seleccion 2 salir") Console.WriteLine(" Ingrese opcion ") Opcion = Console.ReadLine() Select Case Opcion Case 1 conn.Open() Console.WriteLine(" Escriba su consulta") consulta = Console.ReadLine comando.CommandText = consulta Console.WriteLine("Ejecutando sentencia {0}", comando.CommandText) rdr = comando.ExecuteReader nrocol = rdr.FieldCount For i = 0 To nrocol - 1 Console.Write("{0} ", rdr.GetName(i).ToString.PadRight(10))

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -274-

Next Console.WriteLine() While (rdr.Read) For i = 0 To nrocol - 1 Console.Write("{0} ", rdr.GetValue(i).ToString.PadRight(10)) Next Console.WriteLine() End While conn.Close() End Select Loop Until Opcion = 2 Catch ex As SqlException Console.WriteLine(ex) Finally conn.Close() Console.WriteLine("Conneccion cerrada.") End Try Console.ReadLine() End Sub End Module

Se tiene una base alumnos llamado empresa que tiene una tabla llamada trabajadores que tiene la Siguiente estructura

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -275-

Preguntas Listar los funcionarios SELECT * FROM TRABAJADORES WHERE TIPO = 3 Promedio de sueldo por sexo Promedio de sueldo por tipo Cual es el trabajador mas antiguo Elaborar un programa en modo consola que obtenga los siguientes datos a) Cantidad de trabajadores por cada tipos b) Datos del trabajador que gana mas c) Elaborar 3 listados uno de cada tipo d) Dado el cdigo del trabajador que me muestre los dato de ese registro e) Filtrar por nombre Obtener los siguientes datos pero con codigo

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -276-

Imports System.Data.SqlClient Module Module1 Sub Main() Dim connstring As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\DATOS\alumnos.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" Dim sql As String = "SELECT * FROM PAGOS " Dim conn As SqlConnection = New SqlConnection(connstring) Try conn.Open() Dim i As Integer 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 nfilas As Integer = ds.Tables(0).Rows.Count Dim ncol As Integer = ds.Tables(0).Columns.Count Dim ntablas As Integer = ds.Tables.Count Console.WriteLine(" numero de tablas de dataset {0}", ntablas) Console.WriteLine(" numero de filas de esa consulta {0}", nfilas) Console.WriteLine(" {0} {1} {2}", ds.Tables(0).Columns(0).ColumnName, ds.Tables(0).Columns(1).ColumnName, ds.Tables(0).Columns(2).ColumnName) Dim SUMA As Single = 0 Dim MAYOR As Single = -1000 Dim MONTO As Single For i = 0 To nfilas - 1 With ds.Tables(0).Rows(i) MONTO = .Item(3) Console.WriteLine(" {0} {1} {2} ", .Item(0), .Item(2), .Item(3)) SUMA = SUMA + MONTO If MONTO > MAYOR Then MAYOR = MONTO End If End With Next Console.WriteLine("LA SUMA ES {0} ", SUMA) Console.WriteLine("el mayor es {0} ", MAYOR) Catch e As Exception Console.WriteLine("Error Occurred:" & e.ToString) Finally conn.Close() End Try Console.ReadLine() End Sub End Module

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -277-

Practica 4 PROCEDIMIENTOS ALMACENADOS Crear un procedimiento almacenado con visual estudio 2008 y ejecutarlo Crear y ejecutar procedimientos almacenados con SQLserver 2005 Mostrar definiciones de procedimientos almacenados. Procedimientos con Parmetros de Salida y Valor de Retorno Trabajar con procedimientos almacenados en VB.NET. CONOCIENDO A ADO.NET. Trabajar con el proveedor de datos SQL Server Listar la tabla alumnos usando proveedor de datos SQLServer Listar la tabla alumnos usando proveedor de datos OLEDB Listar la tabla alumnos usando proveedor de datos ODBC HACIENDO CONEXIONES escribir un programa muy simple, para abrir y comprobar una conexin: Mostrar informacin de conexin. Conectar a SQL Server Express con el proveedor de datos OLE DB. EJECUTANDO COMANDOS Crear un comando con un Constructor. Asociar un comando con una conexin. Configuracin de la propiedad de conexin. Asignacin de texto a un comando. Configuracin de la propiedad CommandText. Ejecucin de comandos Metodos de ejecucin de comandos obtener un solo valor execute scalar Ejecutar comandos con varios resultados. ExecuteReader() la clase SqlDataReader Ejecutar sentencias de modificacin de datos mtodo ExecuteNonQuery. Uso de parmetros de comando USANDO DATA READERS Mostrar un campo , varios campos,etc de una tabla Utilizando los indizadores ordinales. Uso de columnas indexado por nombre Utilizando los mtodos de descriptor de acceso con tipo. Obtener datos sobre datos. Obtener datos acerca de las tablas. Obtener informacin de esquema. Utilizar el resultado de varios conjuntos con un lector de datos. Next result USANDO DATASET Y DATAADAPTERS ( FORMA DESCONECTADA) Datasets vs.Data Readers. ( lectores de datos y conjuntos de datos) Una breve introduccin a las tablas de datos, columnas de datos y filas de datos. Llenar un Dataset con un adaptador de datos Ejemplo de for each y for next

Gua de prcticas de SI2012A \parte 4 ADO NET Modo Consola \Ismael Vliz Vilca -278-

Ejemplo mostrar el elemento de la fila y columna determinada Mostrar todas las tablas filtrando y ordenando dinmicamente datos en un Dataset. Usando vistas de datos. Propiedad UpdateCommand. Propiedad InsertCommand Propiedad DeleteCommand. Constructores de comando. SqlCommandBuilder. Tablas de datos sin conjuntos de datos. Utilizando conjuntos de datos y XML. Extraccin de un conjunto de datos a un archivo XML Rellenar una tabla de datos con un adaptador de datos Uso de for each Menu de mantenimiento de base de datos alumnos modo conectado Menu de mantenimiento de base de datos alumnos modo desconectado EJECUCION DE CONSULTAS EN MODO CONSOLA Obtener datos con cdigo Ejemplo sumar los montos e,tc de los trabajadores

Você também pode gostar