Issuu on Google+

APLICACIONES CON PROCEDIMIENTOS ALMACENADOS BASE DE DATOS NEPTUNO APLICACION DESCONECTADA (OJO A LOS COMENTARIOS !)

Procedimientos almacenados para la aplicación. Create proc usp_Ciudades As Select Distinct Ciudad From Clientes Go Create proc usp_BusClienteporCiudad @ciudad char(30) As Select IdCliente,NombreCompañia,NombreContacto,CargoContacto From Clientes Where Ciudad=@ciudad Go Exec usp_BusClienteporCiudad 'Londres'

Lenguaje de Programación II (Profesor: Carlos García Vergara)

Página 1


Codigo Fuente del Formulario Imports System.Data.SqlClient 'Importando la libreria para SQL Server Public Class Form1 'Creando la cadena de conexión al Servidor de SQL Server Dim cn As New SqlConnection("Server=localhost;Integrated Security=SSPI;Database=Neptuno") Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'El Adaptador de datos (DataAdapter), realiza una llamada de un procedimiento almacenado 'mediante una conexion abierta previamente al servidor de base de datos(cn) Dim da As New SqlDataAdapter("usp_Ciudades", cn) 'Se crea una tabla en memoria, para almacenar el resultado del procedimiento almacenado Dim tbl As New DataTable 'una vez que el Adaptador de datos obtiene el resultado del procedimiento almacenado 'realiza una copia de los datos mediante el metodo Fill a la tabla en memoria, 'para luego desconectarse del servidor de base de datos. da.Fill(tbl) 'Los datos almacenados en la tabla en memoria, serán visualizados en cualquier control 'ya sea recorriendo los datos de la tabla por fila y columna ó 'enlazado la tabla a traves de una propiedad DataSource de un control de Datos. 'Para nuestro caso recorremos la tabla fila por fila para llenar el combobox item por item. For i As Integer = 0 To tbl.Rows.Count - 1 ComboBox1.Items.Add(tbl.Rows(i)(0).ToString) Next 'La lectura de datos de la tabla se realiza por fila y columna ' tbl.Rows(fila)(columna) y convertimos a cadena el resultado ToString ‘En conclusion las aplicaciones desconectadas mantienen los datos en memoria una vez que el Adaptador de datos recupera el resultado del procedimiento almacenado. Lo cual indica que el Adaptador de datos abre, ejecuta y cierra conexión al servidor de SQL Server de forma automatica una vez realizado el proceso . End Sub 'Este evento se dispara cuando ocurre un cambio en su indice seleccionado(cuando 'se ha seleccionado un Item) Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged 'Cuando tenemos un procedimiento almacenado con parametro es recomendable hacer uso 'del objeto Command y Parameters, dado que al hacer la llamada del procedimiento 'almacenado enviamos su parametro con su tipo de dato nativo ó propio.

Lenguaje de Programación II (Profesor: Carlos García Vergara)

Página 2


'Para este caso se hace un pedido al Servidor de SQL Server un procedimiento almacenado, previa 'conexion abierta al servidor (cn) Dim cmd As New SqlCommand("usp_BusClienteporCiudad", cn) 'Se le indica en el tipo de comando que va a ejecutar : 'Existe tres tipos de comandos: 'CommandType.StoredProcedure => ejecuta procedimientos almacenados 'CommandType.Text => ejecuta sentencias transact-sql (predeterminado) 'CommandType.TableDirect => ejecuta una tabla directamente ejemplo: Clientes cmd.CommandType = CommandType.StoredProcedure 'Se define el parametro y su tipo de dato SqlDbType.TipoDato con su longitud 'Add(Nombre del parametro del Procedimiento almacenado, Tipo de dato).Value (valor recibido) cmd.Parameters.Add("@ciudad", SqlDbType.VarChar, 30).Value = ComboBox1.Text 'El comando(Command) con su parametro será ejecutado con el Adaptador de Datos en el Servidor de SQL Server Dim da As New SqlDataAdapter(cmd) 'Creamos la tabla en memoria Dim tbl As New DataTable 'Copiamos el resultado en la tabla en memoria y el adaptador de datos se desconecta del servidor da.Fill(tbl) 'Los datos en memoria se enlazara como fuente de datos(DataSource) al DataGridView DataGridView1.DataSource = tbl 'Mostrando la cantidad de registros de la tabla en memoria lblNRegistros.Text = tbl.Rows.Count 'Redimensionando las columnas del datagridview DataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells) End Sub End Class

Lenguaje de Programación II (Profesor: Carlos García Vergara)

Página 3


APLICACION CONECTADA (OJO A LOS COMENTARIOS !)

Lenguaje de Programación II (Profesor: Carlos García Vergara)

Página 4


Procedimientos almacenados para la aplicacion Create proc usp_CiudadDestino As Select Distinct CiudadDestinatario From Pedidos Go Create proc usp_PedidosporCiudadDestino @Ciudad varchar(40) As Select d.IdPedido,Sum(PrecioUnidad*Cantidad) as Total From Pedidos P, [Detalles de Pedidos] d Where P.IdPedido=d.IdPedido and CiudadDestinatario=@Ciudad Group by d.IdPedido Go Exec usp_PedidosporCiudadDestino 'Barcelona' Create proc usp_Tablas As Select IdProducto,NombreProducto From Productos Select IdProveedor,NombreCompañia From Proveedores Select IdCategoria,NombreCategoria From Categorias Go

Codigo Fuente del Formulario Imports System.Data.SqlClient Public Class Form2 'Creando la cadena de conexion Dim cn As New SqlConnection("Server=localhost;Integrated Security=SSPI;Database=Neptuno") Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Llamando al procedimiento almacenado mediante un commando,previa conexion al servidor Dim cmd As New SqlCommand("usp_CiudadDestino", cn) 'estableciendo el tipo de comando a ejecutar cmd.CommandType = CommandType.StoredProcedure 'abriendo la conexion al servidor para ejecutar el procedimiento almacenado cn.Open() 'ejecutando el comando y retornando un conjunto de registros (ExecuteReader), enviando 'los datos al objeto SqlDataReader para su lectura de datos en los controles Dim dr As SqlDataReader = cmd.ExecuteReader 'recorriendo el SqlDataReader, mientras la propiedad Read sea verdadero(true), lo cual indica que 'existe datos para su lectura. While dr.Read 'recuperando el dato dr(nombre del campo de la tabla) ó tambien puede ser dr(indice de campo de la tabla) ListBox1.Items.Add(dr("CiudadDestinatario")) Lenguaje de Programación II (Profesor: Carlos García Vergara)

Página 5


End While 'una vez leido el resultado se cierra la conexion al servidor de SQL Server cn.Close() 'En conclusion las aplicaciones conectadas se caracterizan por que su lectura de datos se realiza con una ' conexion abierta al servidor. End Sub Private Sub ListBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.Click Try 'Cuando se realiza una llamada a un procedimiento almacenado con un parametro,haciendo uso 'su lectura mediante el DataReader se aconseja utilizar el controlador de Errores Try Catch 'Try ' verifica errores en codigo 'Catch ex as Exception ó SqlException(si se utiliza el proveedor SQLCLIENT) ' muestra el error ocurrido 'finally ' se establece un codigo de finalizacion, este bloque de codigo se ' ejecuta exista ó no error. 'end try Dim cmd As New SqlCommand("usp_PedidosporCiudadDestino", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@Ciudad", SqlDbType.VarChar, 40).Value = ListBox1.Text cn.Open() Dim dr As SqlDataReader = cmd.ExecuteReader 'Limpiamos el resultado anterior del ListBox2 mostrado ListBox2.Items.Clear() 'Creamos una variable tipo double para sumar el total de cada pedido Dim totalgeneral As Double = 0 While dr.Read 'Lectura de cada campo de la tabla, recuerden que puede ser por nombre de campo o indice. ListBox2.Items.Add(dr("IdPedido") & Space(3) & dr("Total").ToString) 'a medida que recorre el While, se va incrementando el total recuperado totalgeneral += CDbl(dr("Total")) End While lblNPedidos.Text = ListBox2.Items.Count lblTotal.Text = totalgeneral.ToString("c") ' c => mostrando el total en formato de moneda actual Catch ex As Exception 'recuperando el mensaje de error, en caso ocurra un error. MessageBox.Show("Error en codigo:" & ex.Message) Finally 'existe ó no exista error, cerramos conexion al servidor, con esto evitamos 'que si en caso ocurra un error, la conexion al servidor no quede abierta. Lenguaje de Programación II (Profesor: Carlos García Vergara)

Página 6


cn.Close() End Try End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'Llamamos al procedimiento almacenado que contiene como resultado varias tablas Dim cmd As New SqlCommand("usp_Tablas", cn) cmd.CommandType = CommandType.StoredProcedure cn.Open() 'abriendo conexion al servidor Dim dr As SqlDataReader = cmd.ExecuteReader 'iniciando lectura al SqlDataReader con la primera tabla Productos While dr.Read 'lectura de las columnas de la tabla por indice, dando dos espacios por resultado ListBox3.Items.Add(dr(0) & Space(2) & dr(1)) End While 'le indicamos al SqlDataReader, la siguiente lectura de la tabla(NextResult) 'que seria la tabla Proveedores dr.NextResult() While dr.Read ListBox4.Items.Add(dr(0) & Space(2) & dr(1)) End While 'le indicamos al SqlDataReader, la siguiente lectura de la tabla(NextResult) 'que seria la tabla Categorias dr.NextResult() While dr.Read ListBox5.Items.Add(dr(0) & Space(2) & dr(1)) End While 'finalizada la lectura de la tablas en un procedimiento almanacenado 'cerramos conexion al servidor. cn.Close() End Sub End Class

Lenguaje de Programación II (Profesor: Carlos García Vergara)

Página 7


APLICACION UTILIZANDO DISPLAYMEMBER Y VALUEMEMBER (OJO A LOS COMENTARIOS !)

Procedimientos almacenados de la aplicación Create proc usp_Proveedores As Select IdProveedor,NombreCompañia From Proveedores Go Create proc usp_ProdporProveedor @idproveedor int As Select IdProducto,NombreProducto From Productos Where IdProveedor=@idproveedor Go Exec usp_ProdporProveedor 1 Create proc usp_PedidosdondesevendioelProducto @idProducto int As Select d.IdPedido,FechaPedido,Cargo,Sum(PrecioUnidad*Cantidad) as Total From Pedidos P,[Detalles de Pedidos] d Where P.IdPedido=d.IdPedido and IdProducto=@idProducto Group by d.IdPedido,FechaPedido,Cargo Go EXEC usp_PedidosdondesevendioelProducto 1 Lenguaje de Programación II (Profesor: Carlos García Vergara)

Página 8


Codigo Fuente del Formulario Imports System.Data.SqlClient Public Class Form3 'Creando la cadena de conexion Dim cn As New SqlConnection("Server=localhost;Integrated Security=SSPI;Database=Neptuno") Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Try 'Realizamos un pedido de un procedimiento almacenado Dim da As New SqlDataAdapter("usp_Proveedores", cn) 'creamos una tabla en memoria Dim tbl As New DataTable 'guardamos los datos en la tabla en memoria da.Fill(tbl) 'La tabla en memoria con los datos recuperados por el Adaptador de datos 'lo enlazamos a una fuente de datos mediante la propiedad DataSource ComboBox1.DataSource = tbl 'Una vez establecida la tabla en el control, establecemos el nombre del campo que se va a visualizar 'en el control en la propiedad DisplayMember ComboBox1.DisplayMember = "NombreCompañia" 'Tambien guardamos un campo mas en el control como valor del dato mostrado en el control, en la 'propiedad ValueMember 'Para recuperar el dato del campo guardado como valor, lo hacemos con la propiedad SelectedValue ComboBox1.ValueMember = "IdProveedor" Catch ex As Exception MessageBox.Show(ex.Message) 'muestra el error si en caso existiere End Try End Sub Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged Try 'como los datos estan enlazados en el control, es recomendable establecer un try catch sin mensaje ' de error,porque este evento se disparara 2 veces, cuando se enlaza la tabla, y cuando se enlaza 'el campo en la propiedad DisplayMember, y ocurrira debido a que cada vez que se dispara(ejecuta) el evento 'ejecutara el codigo asociado, y ocurrira un error dado que en el procedimiento almacenado 'establecemos como valor del parametro el codigo del proveedor seleccionado(SelectedValue) 'pero como aun no lo hemos seleccionado el SelectedValue,recuperaria un dato Nulo.

Lenguaje de Programación II (Profesor: Carlos García Vergara)

Página 9


Dim cmd As New SqlCommand("usp_ProdporProveedor", cn) cmd.CommandType = CommandType.StoredProcedure 'Establecemos como valor del parametro, el codigo del proveedor seleccionado. 'SelectedValue solo se utiliza cuando se ha establecido un campo en la propiedad 'ValueMember. 'Ejemplo: 'ComboBox1.ValueMember="IdProveedor", recuperamos el codigo establecido con ' ComboBox1.SelectedValue. cmd.Parameters.Add("@idproveedor", SqlDbType.Int).Value = ComboBox1.SelectedValue Dim da As New SqlDataAdapter(cmd) Dim tbl As New DataTable da.Fill(tbl) 'Igual tambien enlazamos la tabla en memoria y los campo en sus respectivas propiedades. ListBox1.DataSource = tbl ListBox1.DisplayMember = "NombreProducto" ListBox1.ValueMember = "IdProducto" Catch ex As Exception End Try End Sub Private Sub ListBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.Click Try 'Nota: Cuando se utiliza un ListBox y enlaza una tabla y campos como datos, es recomendable 'utilizar la propiedad Click no selectedindexchanged,porque si no tendria que utilizar 'un try..catch sin mensaje de error. Dim cmd As New SqlCommand("usp_PedidosdondesevendioelProducto", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@idProducto", SqlDbType.Int).Value = ListBox1.SelectedValue Dim da As New SqlDataAdapter(cmd) Dim tbl As New DataTable da.Fill(tbl) 'Aqui enlazamos los datos de la tabla en memoria al datagridview DataGridView1.DataSource = tbl 'iif(condicion, verdadero, falso) <-- condicional en linea 'IsDbNull(campo) <-- evalua si el campo es nulo, si fuera nulo es verdadero si no sera falso. 'El metodo compute se utiliza para realizar una funcion en la columna,la funcion puede ser 'sum(campo),avg(campo), min(campo),max(campo). 'Y la condicion se establece cuando la funcion a realizar en el campo puede ser mediante un criterio 'por ejemplo: tbl.Compute("Sum(Total)","Total>1500) <-- le indicamos que sume el campo total de la tabla 'en memoria, pero la suma lo hara en base al criterio de que si el total es mayor a 1500. Lenguaje de Programación II (Profesor: Carlos García Vergara)

Página 10


'si no establecemos un criterio,y lo dejamos vacio,se asume que sumara todo el campo Total. 'tbl.Compute("funcion(campo)",criterio de computo de campo) 'Aqui le preguntamos si en el caso la suma del campo total es nula, entonces se establece como valor 0, 'si no mostramos la suma completa. lblTotalVenta.Text = IIf(IsDBNull(tbl.Compute("sum(total)", "")), 0, tbl.Compute("sum(total)", "")) Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub End Class

Lenguaje de Programación II (Profesor: Carlos García Vergara)

Página 11


Conexiones Conectadas y Desconectadas VB.NET SQL Server