Está en la página 1de 4

BASE DE DATOS HOSPITALNET 1) Realizar una consulta que me devuelva todas las personas que no viven en chimbote de la tabla

empleados. La tabla Empleados tiene estos registros:

Solucion1 incorrecta: La consulta devuelve las personas que no viven en chimbote claro es correcto hasta cierto punto, pero si nos fijamos en la tabla y la comparamos con nuestra consulta vemos que nuestra consulta no nos devuelve el campo nulo. Solucin 1 select nombres,direccion,fechaingreso from empleados where direccion<>'chimbote' Solucin 2 select * from empleados where direccion not in('chimbote')
Solucion2 correcta: Esta consulta es correcta devuelve el campo que nos faltaba osea el nulo

select nombres,direccion,fechaingreso from empleados where direccion<>'chimbote' or direccion is null


Solucion3 correcta: Esta consulta tambien es correcta devuelve el nulo, a diferencia del anterior podemos inserta en el campo nulo una dato, deacuerdo con el tipo de dato del campo, con la instruccin isnull(campo,tipodato). Tipo daton si es cadena va entre apstrofes y si es numrico sin apstrofes. En este caso en direccin una cadena fff y en fecha el nmero cero.

select nombres,d=isnull(direccion,'fff'),fecha=isnull(fechaingreso,0) from empleados where direccion<>'chimbote' or direccion is null Crearemos un procedimiento almacenado con esta ltima consulta create procedure pa_cdirecion as select nombres,d=isnull(direccion,'fff'),fecha=isnull(fechaingreso,0) from empleados where direccion<>'chimbote' or direccion is null
Nota: Debemos tener cuidado con los valores nulos ya que si fueran cientos de registros habra respuestas de datos inconcistentes. Esto va tambien cuando desarrollamos aplicaciones. Lo ms recomendable es que el DBA solucione estos problemas, pudiendo ser mediante un procedimiento almacenado como el anterior. Vamos a crear una aplicacin VB .Net para visualizar los datos del procedimiento almacenado pa_cdirecion, nuestro proyecto se llamar APLICACIONDBA. VB Windows Form Aplication, agregamos dos controles: 1 button y un listview Ctrol Listview: la propiedad view:detalle, GridLines:true; column:agregamos 3 columnas(Nombres, Direccion y Fecha)

BD HOSPITALNET

Pgina 1

Cdigo VB .Net: Imports System.Data.SqlClient Public Class Form1


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim cn As New SqlConnection instanciamos un objeto cn de tipo SqlConnection Dim comando As New SqlCommand instanciamos un objeto comando de tipo SqlCommand Dim lector As SqlDataReader propiedad de lectura Dim fila As ListViewItem Try trusted_connection=forzamos la conexin cn.ConnectionString = "server=(local);trusted_connection=yes;initial catalog=HOSPITALNET" cn.Open() comando.CommandText = "pa_cdirecion" nombre del procedimiento almacenado comando.CommandType = CommandType.StoredProcedure comando.Connection = cn Me.ListView1.Items.Clear() para limpiar los items del ctrl cada vez que se refresca lector = comando.ExecuteReader If lector.HasRows = True Then si hay contenido en el control While lector.Read comienza la lectura de la consulta fila = New ListViewItem fila.Text = CStr(lector.Item(0)) fila.SubItems.Add(CStr(lector.Item(1))) fila.SubItems.Add(CStr(lector.Item(2))) Me.ListView1.Items.Add(fila) End While End If Catch ex As Exception MessageBox.Show(ex.Message) Finally If cn.State = ConnectionState.Open Then finalizamos la conexin en caso de fallas cn.Close() End If End Try End Sub
Nota: Debemos de finalizar la conexin cada vez que terminemos una aplicacin sino se hace este se va a memoria recidente y puede bajar rendimiento a la pc. Ojo que si el procedimiento almacenado se hubiera hecho con la solucin2 nos hubiera devuelto un mensaje deciendonos que hay un objeto nulo que no se puede convertir y unicamente nos hubiera devuelto 2 registros. Por esa razn utilizamos la solucin3 para rellenar el campo nulo y as devolvernos la cantidad de registros verdaderos que son 3. En C# .Net

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient;

BD HOSPITALNET

Pgina 2

namespace APLICACIONCSHARDBA { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { SqlConnection cn = new SqlConnection(); SqlCommand comando = new SqlCommand(); SqlDataReader lector; ListViewItem fila; try { cn.ConnectionString = "server=(local);trusted_connection=yes;initial catalog=HOSPITALNET"; cn.Open(); comando.CommandText = "pa_cdirecion"; comando.CommandType = CommandType.StoredProcedure; comando.Connection = cn; this.listView1.Items.Clear(); lector = comando.ExecuteReader(); if (lector.HasRows == true) { while (lector.Read()) { fila = new ListViewItem(); fila.Text = Convert.ToString(lector.GetValue(0)); fila.SubItems.Add(Convert.ToString(lector.GetValue(1))); fila.SubItems.Add(Convert.ToString(lector.GetValue(2))); this.listView1.Items.Add(fila); }//fin de while }//fin de if } //fin de try catch (Exception ex) { MessageBox.Show(ex.Message); }// fin de catch finally { if (cn.State == ConnectionState.Open) cn.Close(); }//fin de finally }// fin de button } }

BD HOSPITALNET

Pgina 3

2) Obtener la fecha en Espaol (no en Ingls) select CONVERT(varchar,GETDATE(),103)devuelve 15/10/2011


Devuelve fecha en espaol de la tabla empleados.

select nombres,feching= CONVERT(varchar,fechaingreso,103), ingresolaboralenaos=year(getdate())-year(fechaingreso) from empleados

3) Consulta para mostrar los empleados que estn en chimbote Soluc 1 select * from empleados where direccion in('chimbote') Soluc 2 select * from empleados where direccion = 'chimbote' 4) Consulta para mostrar nombre con tildes en este caso mara Soluc 1: En esta consulta solamente le indicamos el nombre con tilde o sin ella. Devuelve todas las personas con ese nombre select * from empleados where SOUNDEX(nombres)=SOUNDEX('marcarmen') Soluc 2: En esta consulta utilizamos la instruccin like. Devuelve todos los nombres que empiezan con mar seguido de la i o seguido de cualquier carcter o caracteres select * from empleados where nombres like 'mar[i-]%' vemos que mas factible es la primera opcin, ya que nicamente colocamos el nombre. 5) Consulta que devuelve el nombre , salario del empleado y el rea al que pertenecen select empleados.nombres,Areadept.nombre,empleados.salario from empleados inner join Areadept on empleados.iddep=Areadept.iddep

BD HOSPITALNET

Pgina 4