You are on page 1of 241

MICROSOFT VISUAL

2010 (ASP.NET) Y
SQL SERVER


























MICROSOFT VISUAL 2010
(ASP.NET) Y
SQL SERVER








FREDYS A. SIMANCA H.
Ingeniero de Sistemas con nfasis en Telecomunicaciones
Especialista en Redes de Telecomunicaciones
Especialista en Multimedia para la Docencia
Magster en Informtica Aplicada a la Educacin.

FABIAN BLANCO GARRIDO.
Ingeniero de Sistemas
Especialista en Redes de Telecomunicaciones
Especialista en Multimedia para la Docencia
Magster en Informtica Aplicada a la Educacin.
Magster en Telemtica.























Microsoft Visual Studio 2010 (ASP.NET) y SQL Server
Fredys A. Simanca Herrera Fabin Blanco Garrido


Los autores han intentado a lo largo de este libro distinguir las marcas registradas, sin
intencin de infringir la marca y solo en beneficio del propietario de la misma.

Reservados todos los derechos de publicacin de este libro.

Ninguna parte de este libro puede ser reproducida, grabada en sistemas de
almacenamiento o transmitida en ninguna forma ni por cualquier procedimiento, ya
sea electrnico, mecnico, por fotocopia, magntico o por otro mtodo, sin el permiso
previo o por escrito de los autores del Copyright.



DERECHOS RESERVADOS 2013, primera edicin por Fredys A. Simanca Herrera
Fabin Blanco Garrido

Bogot D.C. Abril de 2013.

































Agradecimientos

Estetrabajo se ha llevadoacabogracias alaporte denuestros exalumnosyalumnosyen


especialalaUniversidadLibre,locualnoshallevadoacumplirunsueodetantoaosquepor
fin hemos culminado y esperamos que sea un aporte a la comunidad como herramienta de
apoyodeconsulta.


FredysAlbertoSimancaHerrera
FabinBlancoGarrido

CONTENIDO

INTRODUCCIN
1.CONCEPTOSPREVIOS 10
1.1CONTROLESDESERVIDOR 10
1.2CONTROLESDEVALIDACIN 14
1.3CONTROLESAJAX 18
1.4MASTERPAGES 22
1.4.1QusonlosMasterPages? 23
1.4.2DefinicindeunMasterPage 24
1.5WEBSERVICES 27
1.5.1CaractersticasdelosWebServices 27
1.5.2EstructuraInternadelosServiciosWeb 27
1.5.3TiposdeServiciosWeb 28
1.5.4CreacindeServiciosWebcon.NET 29
1.6CONTROLESDEINICIODESESIN 35
1.7CONEXINAUNABASEDEDATOSDESQLSERVERDESDEASP.NET 53
1.7.1ProyectoSaberPro 53
1.7.2Insertarunnuevoregistro 60
1.7.3UsodelGridViewparatrabajartablas 61
1.7.4PedirconfirmacindelbotnEliminarenelGridView 64
1.7.5InsertarbotnNuevoenelGridView 67
1.7.6InsertarunDropDownListaleditarunregistro 70
1.7.7ValidacindeUsuariosyperfil 71
1.7.8EnvodeCorreodesdeASP.NET 74
1.7.9MduloEntrenadorPruebasSaberPro 75
1.7.10Seleccionaraleatoriamenteregistrosdeunatabla 77
1.7.11Mostrarunaimagendeunatablaenunagrilla 78
1.7.12ValidarDropDownListinsertadodentrodeunGridView 81
1.8ProyectoBancodeProyectosdeGrado 86
1.8.1CambiarelMasterPagedinmicamente 91
1.8.2LafuncinInsertarRegistro 94
1.8.3PedirconfirmacindelbotneliminarenelGridView 89
1.8.4MduloAdministracindereasdeInvestigacin 102
1.8.5Mduloadministracindelneasdeinvestigacin 103
1.8.6Agregarenlagrillauncampodedescripcindeotratabla 104
1.8.7SeleccionarvalordeunaceldadeunGridView 127
1.9GENERACINDEREPORTES 136
1.10GENERACINDEGRFICOS 138
2.SQLSERVER 160
2.1INTRODUCCINASQL 160
2.1.1QuesSQL? 160
2.2LASCONSULTASSIMPLES 161
2.2.1SintaxisdelaSELECT(paraconsultassimples) 161
2.2.2Ordenarlasfilas(ORDERBY) 163
2.2.3LasclusulasDISTINCT/ALL 163
2.2.4LaclusulaTOP 164
2.2.5LaclusulaWHERE 164
2.2.5Condicionesdeseleccin 166
2.2.6CaracteresComodines 168
2.3Lasconsultasmultitablas 168
2.3.1Launindetablas 169
2.3.2Lacomposicindetablas 170
2.3.3LasfuncionesdeColumna 176
2.3.4LaclusulaGROUPBY 177
2.3.5LaclusulaHAVING 178
2.4PROCEDIMIENTOSALMACENADOS 179
2.4.1CreacinProcedimientoAlmacenado(SinParmetrosDeEntrada) 180
2.4.2EjecutarUnProcedimientoAlmacenado 180
2.4.3FormaGeneraldeunProcedimientoAlmacenado 180
2.4.4ModificacindeunProcedimientoAlmacenado 181
2.5TRIGGERSENTRANSACTSQL 189
2.5.1LosDesencadenadoresDML 189
2.5.2LosdesencadenadoresDDL 191
2.5.3EjemploprcticodecmocrearunTriggersenTransactSQL 191
2.6TRANSACCIONESENTRANSACTSQL 198
2.6.1Transaccionesimplcitasyexplicitas 199
2.6.2Transaccionesanidadas 203
2.6.3Puntosderecuperacin(SavePoint) 203
2.6.4Ejerciciodetransacciones 205
2.7FUNCIONESENTRANSACTSQL 208
2.7.1FuncinEscalar 208
2.7.2Funcionesconvaloresdetabladevariasinstrucciones 210
2.7.3Funcionesconvaloresdetablaenlnea 211
2.8CURSORESENTRANSACTSQL 213
2.8.1VentajasdelosCursores 213
2.8.2EstructuradeunCursor 213
2.8.3AsignacinyAsociacindeCursores 226
2.8.4ProcedimientosAlmacenadosyCursores 226
2.9SQLDINMICOENTRANSACTSQL 227
2.10CERTIFICADOSDIGITALES 231
2.10.1FirmaDigital 235
2.10.2UtilizarCertificadosDigitalesDesde.NET 236
2.10.3Consultarlainformacindelcertificadoysusextensiones 239
2.10.4EncriptacinyDesencriptacinUtilizandounCertificado 241










INTRODUCCIN


Hoy en da las capacidades de comunicacin, el trabajo en grupo y los
conocimientos tcnicos, son iniciativas que apoyan a la adaptacin de nuestro pas a
las nuevas tecnologas de aprendizaje, es por ello que se pretende con este material
de clase apoyar el desarrollo de stas capacidades.

Este libro se presenta como el resultado de la experiencia que se ha desarrollado en la
asignatura Electiva Profesional VI (ASP.NET SQL Server) en la Universidad Libre y
al desarrollo de proyectos en el sector empresarial.

Con esta recopilacin de apuntes se busca que los estudiantes conozcan los controles
ms utilizados en ASP.NET, como tambin realizar las operaciones bsicas de las
bases de datos: crear, modificar y borrar tablas, actualizar datos, seleccionar datos de
una tabla, establecer relaciones entre tablas para la seleccin de dos o ms tablas y
realizar consultas avanzadas de bases de datos desde ASP.NET, conocer la
conceptualizacin de los Servicios Web, procedimientos almacenados, funciones con
Transact SQL, Triggers, Transacciones en Transact SQL y Cursores.

A medida que se va siguiendo el material se encontraran ejemplos prcticos buscando
con ello aclarar los conceptos tericos aplicando la prctica, y a su vez sean referentes
para ser aplicados en otros proyectos de ambientes laborales, tomando como base las
situaciones planteadas en los ejercicios que se encuentran en el presente libro.

Los Autores






10

1.CONCEPTOSPREVIOS

1.1CONTROLESDESERVIDOR
DropDownList1.Permitealosusuariosrealizarunaseleccinenunalistadesplegabledeseleccinnica.
Lalistadesplegablepuedecontenercualquiernmerodeelementos.
Utilice el control DropDownList para crear un control de lista desplegable de seleccin nica. Para
controlar la apariencia del control DropDownList, establezca el valor de las propiedades BorderColor,
BorderStyleyBorderWidth.
ParaespecificarloselementosquevanafigurarenelcontrolDropDownList,coloqueunelementoListItem
porcadaentradaentrelasetiquetasdeaperturaydecierredelcontrolDropDownList.
ElcontrolDropDownListtambinadmiteelenlacededatos.Paraenlazarelcontrolaunorigendedatos,
cree primero un origen de datos, como una lista ArrayList, que contenga los elementos que se van a
mostrarenelcontrol.Acontinuacin,utiliceelmtodoDataBindparaenlazarelorigendedatosalcontrol
DropDownList. Utilice las propiedades DataTextField y DataValueField para especificar qu campo del
origendedatossevaaenlazaralaspropiedadesTextyValue,respectivamente,decadaelementodelista
delcontrol.Ahora,elcontrolDropDownListmostrarlainformacindelorigendedatos.Estaopcinla
veremosenfuncionamientocuandoutilicemoselcontrolennuestroaplicativo.
La propiedad que se tiene que tener en cuenta es la SelectedIndex para determinar mediante
programacin el ndice del elemento seleccionado por el usuario en el control DropDownList. A
continuacin,sepodrutilizarelndicepararecuperarelelementoseleccionadodelacoleccinItemsdel
control, la otra propiedad es la propiedad SelectedValue, esta nos determina el valor del elemento
seleccionado.
Ejemplo:
InserteloscontrolesqueobservaenlaimagenenunWebForms(TextBox1,Button1yDropDownList1).

Ingresemosenelbotnelcdigoqueseobservaenlaimagen.
11

Ejecutelaaplicacin(F5)eingresevaloresenelTextboxydeclicenelbotn,observeelresultado.
DeestaformaseagregantemsalDropDownListpormediodecdigo,sepuededeigualmaneraagregar
valores de manera manual, para ello, seleccione el Control, de Clic en la pestaa ( ),
seleccioneEditarElementos,yobservelasiguienteimagen.

ObservelaspropiedadesTextyValue,estassonlasdospropiedadesqueluegopodremosevaluarcuando
seseleccioneunaopcin.ClicenAceptar.
SiqueremosprogramarloseventosdelDropDownList,debemosdeactivarelHabilitarAutoPostBack.
12

InsertemosunLabel1,alfrentedelcontrolparamostrareltemseleccionado.
Elcdigoeselsiguiente:

EnestecasoelmismovalordelSelectedItemesigualalSelectedValue,editeloselementosdelControl
nuevamenteycambielapropiedadValue,cuandosetraendatosdesdeunabasededatosmuchasveces
estasdospropiedadesdebendetenervaloresdistintos,supngasequealusuarioseledeseamostrarlos
nombresdeunosclientes,perointernamenteelvalorquenosinteresaeselnmerodedocumentodel
cliente,perocomonuestrousuarionosesabelosnmerosdedocumentosloqueseledebedemostrar
a l, son los nombres. El siguiente cdigo nos agrega opciones diferentes a text como a value, tiene la
mismafuncionalidadcuandosedeseahacerconbasededatos.

ListBox.ElcomponenteListBoxtieneelmismocomportamientoqueelcontrolDropDownList.
FileUpload.Creauncontrol<inputtype=file>(queporlogeneralsemuestracomouncontroldecuadro
detextoy unbotndeexaminar) que permitealosusuariosseleccionar unarchivoparacargarloenel
servidor.
Ejemplo:EnelejemplosiguientesemuestracmocrearuncontrolFileUploadqueguardalosarchivosen
una ruta de acceso especificada en cdigo. Se llama al mtodo SaveAs para guardar el archivo en el
servidor en la ruta de acceso especificada. La aplicacin ASP.NET que contiene el ejemplo debe tener
derechos de escritura en el directorio especificado del servidor. Se puede conceder explcitamente
13

derechodeescrituraalacuentaenqueseestejecutandolaaplicacin,eneldirectorioenquesevana
guardarlosarchivoscargados.Siseprefiere,sepuedeaumentarelniveldeconfianzaqueseconcedeala
aplicacinASP.NET.
Diseeunavistacomoladelaimagen.

SeleccioneelBotn(UpLoad)yenelcdigoingreseelsiguiente:

Ejecutelaaplicacin,elresultadodebesercomoseobservaenlaimagen.

Hagamos ahora unas pequeas modificaciones para tener informacin sobre el archivo. Modifique el
cdigoydjelocomoseveenlaimagen.
14

Ejecuteyobserveloscambios.
1.2CONTROLESDEVALIDACIN
Se usan para validar los valores que se especifican en otros controles de la pgina. Los controles de
validacinrealizanlavalidacinenelcliente,elservidoroambos,segnlascapacidadesdelexploradoren
elquesemuestralapgina.Loscontrolesdevalidacinproporcionanlasventajassiguientes:
Puedeasociarunoovarioscontrolesdevalidacinacadacontrolquedeseevalidar.
Lavalidacinserealizacuandoseenvaelformulariodelapgina.
Puede especificar mediante programacin si debera realizarse la validacin, lo que resulta de
utilidadsideseaproporcionarunbotndecancelacinparaqueelusuariopuedasalirsintener
querellenarcondatosvlidostodosloscampos.
Loscontrolesdevalidacindetectanautomticamentesisedeberealizarlavalidacinenelclienteoen
elservidor.
15

RequiredFieldValidator.ElcontrolRequiredFieldValidatorseutilizaparaconvertiruncontroldeentrada
enuncampoobligatorio.Elcontroldeentradanosuperalavalidacinsielvalorquecontienenocambia
conrespectoalvalorinicialcuandoserealizlavalidacin.Estoimpidequeelusuariodejeelcontrolde
entradaasociadosinmodificar.Demanerapredeterminada,elvalorinicialesunacadenavaca(""),loque
indicaquesedebeespecificarunvalorenelcontroldeentradaparaquesuperelavalidacin.
CompareValidator.ElcontrolCompareValidatorpermitecompararelvalorespecificado porelusuario
enuncontroldeentrada(porejemplo,uncontrolTextBox)conelvalorespecificadoenotrocontrolde
entradaoconunvalorconstante.TambinsepuedeusarelcontrolCompareValidatorparadeterminarsi
el valor especificado en un control de entrada se puede convertir al tipo de datos especificado por la
propiedadType.
Especifique el control de entrada que desee validar estableciendo la propiedad ControlToValidate. Si
desea comparar un control de entrada especfico con otro control de entrada, establezca la propiedad
ControlToCompareenelnombredelcontrolquedeseecomparar.
Enlugardecompararelvalordeuncontroldeentradaconotrocontroldeentrada,sepuedecompararel
valordeuncontroldeentradaconunvalorconstante.Especifiqueelvalorconstantequevaacomparar
estableciendolapropiedadValueToCompare.
CustomValidator. El control CustomValidator permite crear un control de validacin con lgica de
validacinpersonalizada.Porejemplo,sepuedecrearuncontroldevalidacinquecompruebesielvalor
especificadoenuncuadrodetextoesunnmeropar.
Loscontrolesdevalidacinsiemprerealizanlacomprobacindevalidacinenelservidor.Tambintienen
unaimplementacincompletaenelclientequepermitealosexploradorescompatiblesconDHTML(como
MicrosoftInternetExplorer4.0posterior)realizarlavalidacinenelcliente.Lavalidacinenelcliente
mejoraelprocesodevalidacinyaquesecompruebanlosdatosproporcionadosporelusuarioantesde
enviarlos al servidor. De este modo se pueden detectar los errores en el cliente antes de enviar el
formularioyseevitalaaccindeidayvueltadelainformacinnecesariaparalavalidacinenelservidor.
Para crear una funcin de validacin de servidor, proporcione un controlador para el evento
ServerValidatequerealizalavalidacin.Sepuedeobteneraccesoalacadenadelcontroldeentradaque
se va a validar utilizando la propiedad Value del objeto ServerValidateEventArgs que se pasa al
controlador de eventos como parmetro. El resultado de la validacin se almacena despus en la
propiedadIsValiddelobjetoServerValidateEventArgs.
Paracrearunafuncindevalidacinenelcliente,agregueprimerolafuncindevalidacinenelservidor
que se ha descrito anteriormente. A continuacin, agregue a la pgina .aspx la funcin de script de
validacinenelcliente.
SiutilizaVisualBasic,lafuncindebetenerelsiguienteformato:
16

SubValidationFunctionName(source,arguments)
SiutilizaJScript,lafuncindebertenerlasiguienteforma:
FunctionValidationFunctionName(source,arguments)
Utilice la propiedad ClientValidationFunction para especificar el nombre de la funcin de script de
validacindeclientequeestasociadaalcontrolCustomValidator.Comolafuncindescriptseejecuta
enelcliente,debeestarenunlenguajequeelexploradordedestinoadmita,comoVisualBasicoJScript.
Aligualqueenelcasodelavalidacinenelservidor,lapropiedadValuedelparmetroargumentsobtiene
acceso al valor que se va a validar. Para devolver el resultado de la validacin, establezca la propiedad
IsValiddelparmetroarguments.
RangeValidator.ElcontrolRangeValidatorpermitecomprobarsilaentradadeunusuarioseencuentra
entreunlmiteinferioryunlmitesuperiorespecificados.Sepuedencomprobarintervalosentreparejas
denmeros,caracteresalfabticosyfechas.Loslmitesseexpresancomoconstantes.
Utilice la propiedad ControlToValidate para especificar el control de entrada que se va a validar. Las
propiedades MinimumValue y MaximumValue especifican los valores mnimo y mximo del intervalo
vlido,respectivamente.
LapropiedadTypeseutilizapara especificarel tipodedatos de losvaloresquesevanacomparar.Los
valores que se van a comparar se convierten a este tipo de datos antes de realizarse cualquier
comparacin.
RegularExpressionValidator.ElcontrolRegularExpressionValidatorseutilizaparadeterminarsielvalor
deuncontroldeentradacoincideconunpatrndefinidoporunaexpresinregular.Estetipodevalidacin
permitecomprobarsecuenciasdecaracteresprevisibles,comolasdelosnmerosdelaseguridadsocial,
lasdireccionesdecorreoelectrnico,losnmerosdetelfonoyloscdigospostales,entreotras.
ValidationSummary.ElcontrolValidationSummary permiteresumirlosmensajesdeerrordetodoslos
controlesdevalidacindeunapginaWebenunasolaubicacin.Elresumenpuedeaparecerenforma
delista,listaconvietasounnicoprrafo,enfuncindelvalordelapropiedadDisplayMode.Elmensaje
de error que se muestra en el control ValidationSummary para cada control de validacin de la pgina
vieneespecificadoporlapropiedadErrorMessagedecadacontroldevalidacin.Sinoestestablecidala
propiedadErrorMessagedelcontroldevalidacin,nosemostrarningnmensajedeerrorenelcontrol
ValidationSummarycorrespondienteadichocontroldevalidacin.Tambinsepuedeespecificarunttulo
personalizado en la seccin de encabezado del control ValidationSummary estableciendo la propiedad
HeaderText.
Vamosaverentoncesunejemplodecmofuncionanloscontrolesdevalidacin.
Descarguedeinternetoutiliceotromedioparacrearunahojadeestilo(css).
17

Copie el archivo css a la raz de su sitio web, para adjuntar la hoja de estilos a su pgina, vaya al men
contextualaFormatoAdjuntarhojadeestilos.

Seleccionelahojadeestilo,luegodeclicenAceptar.Despusdehaberadjuntadolahojadeestilohagamos
elsiguientediseo:

Ahora en vista diseo, vamos a arrastrar los siguientes controles de Validacin, tal y como se puede
observarenlafigura.

Vamos a usar los siguientes controles de validacin: RequiredFieldValidator, RangeValidator,


RegularExpresionValidator,CompareValidatoryporltimoValidationSumary.
RegularExpresionValidator
ControlToValidator ElControlquequieresvalidar,enelprimercaso
sereldeemailyeldefechadenacimiento.
ErrorMessage Elmensajedeerrorquesequieremostrar
cuandosepresentaunerror.
ValidationExpression Seleccioneelformatoquedesea,paraelcasode
fechadebebuscareninternetlaexpresin
regularparavalidarlafecha.
ControlToValidator Seleccioneelcontrolelcualquierevalidar
ErrorMessage Elmensajequesequieremostrarcuandoseha
presentadounerror.
RangeValidator MaximunValue Valormximoquequiereparaelrango
MinimunValue Valormnimoquequiereparaelrango,
supongamosquesolamenteaceptamospersonas
18

entre18y25aos.
CompareValidator ControlToValidate Elcontrolquequeremosvalidar,enestecasoes
elpassword.
ControlToCompare Elcontrolquequeremoscomparar,enestecaso
sereldeReingresePassword.
ErrorMessage Elmensajedeerrorquesequieremostrar
cuandosepresentaunerror.
RequiredFieldValidator ControlToValidator Seleccioneelcontrolelcualquierevalidar
ErrorMessage Elmensajequesequieremostrarcuandose
hapresentadounerror.

En el control ValidatorSummary no hay necesidad de estipular nada, ya que lo que hace es sacar un
resumendetodosloserrorespresentados.
Alfinaldebequedarundiseocomoelquesepuedeobservaracontinuacin.

Ejecutelaaplicacinypruebelosresultados.
1.3CONTROLESAJAX
VisualStudio2010yASP.NET3.5permiteeldiseoydesarrollodeaplicacionesconsoporteAJAX.
AJAXsonlassiglasdeAsynchronousJavaScriptAndXML,oloqueeslomismo,JavaScriptyXMLasncrono,
queenotraspalabras,eslacapacidaddelasaplicacionesWebdeestableceruncaminodecomunicacin
asncronoconelservidoryensegundoplano,paranuestrasaplicacionesweb.
Enrealidad,estatcnicatienemuchaimportanciaconaspectoscomoSOA(ServiceOrientedArchitecture)
yRIA(RichInternetApplications).
Aunque no debe haber problemas en el uso de AJAX ya que la mayora de los navegadores Web lo
soportan,hayquetenerencuentaqueexistennavegadoresWebquenosoportanAJAX.
Para crear aplicaciones AJAX en aplicaciones Web con Visual Studio 2010, disponemos de diferentes
objetosqueencontraremosdentrodelCuadrodeherramientastalycomoseindicaenlasiguienteimagen:
19

AtendiendoalCuadrodeherramientas,encontramosdiferentesobjetos
AJAX, como son el objeto ScriptManager, ScriptManagerProxy, Timer,
UpdatePanelyUpdateProgress.
A continuacin se expone un ejemplo sencillo del uso de AJAX en
aplicacionesWeb.
Partimos de una aplicacin Web ASP.NET 3.5 dentro de la cul
insertaremosdoscontrolesLabelyuncontrolButton.
LosnombresdeloscontrolesLabelsonHoraActualyMensaje.Elobjetivo
es mostrar en HoraActual la hora actual del sistema, y en Mensaje un
mensaje de texto que nos servir para indicar que el cdigo pasa por
dondequeremos.
NuestraaplicacinWebenlafasedediseotendrunaspectosimilaral
queseindicaenlasiguienteimagen:

Acontinuacin,indicaremoselcdigodenuestraaplicacinWeb:

20

Esteejemplo,mostrarunadeterminadainformacinlaprimeravezqueseejecutanuestraaplicaciny
mostrarlasiguienteinformacin:

Sipulsamoselbotn,laaplicacinrealizarunrefrescodetodalaaplicacinWebyejecutaruncamino
deidayvueltarefrescandotodoslosobjetosdelaaplicacin.Elresultadounavezejecutadoelcontrol
Buttoneselsiguiente:

Enesteprocesonoobstante,nohemosutilizadoAJAXan.
Comovemos,esteeselmecanismotradicionaldeejecutaraplicacionesWeb,concaminosdeidayvuelta
yrefrescodetodalapginawebcompleta.
ImaginemosentoncesquetenemosvariasfuentesdedatosasociadasanuestrapginaWebyquecada
vezquerefrescamos,sevuelvenalanzartodaslasaccionesdeconsultasobrelasbasesdedatos.
Enlaredse produciraungranconsumodeanchodebanda,y adems,penalizaramosseguramente al
servidorWeb.
LaideadeAJAXesladerefrescarnicamenteaquellainformacinquequeremosrefrescar.
Porlotanto,basndonosenelejemploquehemosdesarrollado,vamosavalernosdeloscontrolesAJAX
deVisualStudio2010yvamosacrearunaaplicacinquerefresquenicamenteaquellainformacinque
queremosrefrescar,ynotodalapginaWeb.
Para hacer esto, vamos a insertar primero un control ScriptManager, y posteriormente un control
UpdatePanel.EstosdoscontrolesestndentrodelgrupodecontrolesdeAJAX.
Una vez hecho esto, insertaremos los controles Button y Label de nombre Mensaje en el control
UpdatePanel.
NuestraaplicacinWebquedarenelentornodediseotalycomoseindicaacontinuacin:
21

Comoelcdigodenuestraaplicacineselmismo,acontinuacinejecutaremosnuestraaplicacinWeb:

PulsaremoselcontrolButtondenuestraaplicacinyobservaremoselresultadoobtenido,quesersimilar
alqueseindicaenlasiguienteimagen:
22

Atendiendo a los resultados, podemos deducir que mientras en el primer caso en el que no usbamos
AJAX,elresultadodelapginaweberauncaminodeidayvueltarefrescandotodalapginaweb,enel
uso de AJAX ese camino de ida y vuelta se ha reducido nicamente a aquellos controles u objetos que
hemoscolocadodentrodelcontrolUpdatePanel.
Este control acta como repositorio contenedor de aquellos controles que queremos actualizar,
permitiendoqueelrestodelaaplicacinnoquedeafectadaporestaactualizacin.
PruebeporejemplocolocandountextboxporfueradelcontrolUpdatePanelparaquenotemejorcomo
lapginanoserefrescaalmomentodedarclicsobreelbotn.
1.4MASTERPAGES
LomshabitualcuandosecreaunaaplicacinounsitioWebesquelaspginasqueloconformansean
todasbastanteparecidasoalmenosqueexistanvariosgruposdepginassimilaresqueslovaranciertos
contenidosentreellas.Porejemplo,puedehaberunacategoradepginasparamostrarartculosenel
quetodassonigualesexceptoporelcontenidodelpropioartculoensupartecentral,mientrasqueen
otrazonadelaaplicacineldiseoescompletamentediferenteperosuspginasseparecentodasentre
s.
Porejemplo,lasiguientefiguramuestracapturasdedospginaspertenecientesalportalMSDN:
23

Ejemplode
dospginassimilaresenMSDN
Ambaspginasdifierennicamenteenelcontenidoylosmensquemuestranenellateral(losbanners
dellateralsonrotativos),yconservanunaestticayunaseriedeelementosquepermanecenconstantes
entodaslaspginasdelsitio.
Tradicionalmenteparaconseguirestasimilitudentrepginashabaquecrearlasindividualmenteorecurrir
aartificiospropioscomoporejemploeldeutilizararchivosdeinclusinpararenderizarciertaspartesde
las pginas desde un mismo origen en disco. An en este ltimo caso la capacidad de modificacin era
limitadaynormalmentesereducaalascabecerasypiesdelaspginasypocoms.Enelprimerodelos
casos(retocarunaauna)cualquiercambioestticodeunsitiomedianamentegrandeerapocomenosque
unalocuraderealizar.
ApartirdeASP.NET2.0seofreceuna nuevacaractersticadestinadaapaliarestatradicionalcarencia y
permitedefinirpginascuyoaspectoyfuncionalidadderivadeunaspginasespecialescomunesllamadas
PginasprincipalesoMasterPages.
1.4.1QusonlasMasterPages?
Una Master Page proporciona una forma de definir una estructura e interfaz comn para un grupo de
pginas pertenecientes a un mismo sitio Web. Esta estructura comn se almacena en un nico archivo
independiente.Ellofacilitamuchosumantenimientopuestoque,paraactualizartodaslaspginasquelo
utilizan,bastaconeditardichoarchivo.
24

UnaMPesenrealidadcomounapginaASPXnormalquecontienecdigo,elementosHTMLycontroles
Web de servidor. Sin embargo posee una extensin diferente (.master) y utilizan una directiva <% @
master%>enlugardeunadirectiva<%@page%>.Porlodemssepuedenconsiderarprcticamente
equivalentes.Estoesimportanteporquesignificaqueyasabemostodolonecesarioparacrearlas.
Una pgina ASPX normal puede derivar su estructura a partir de una MP simplemente aadiendo un
atributoMasterPageFileasudirectivadepgina,as:

Queindicaelarchivodepginaprincipalqueseutilizarparasuestructura.
1.4.2DefinicindeunaMsterPage
ParaagregarunaMsterPageanuestroproyectoslohayqueelegireliconoPginaPrincipaleneldilogo
deagregarnuevareferenciadecualquiercarpetadelmismo:

AlabrirunaMPapareceundiseadoridnticoaldeunapginaASPXnormal.Podemosarrastrarsobresu
superficie cualquier control as como editar su HTML de la manera usual. Tambin lleva un archivo de
cdigo asociado en el que se puede responder a sus diversos eventos. La nica diferencia apreciable a
simple vista respecto a una pgina normal es que contiene por defecto un control de tipo
ContentPlaceHolder.Lasintaxisdeestecontrolesanlogaalasiguiente:
<asp: Cont ent Pl aceHol der i d=" head" r unat =" ser ver " >
</ asp: Cont ent Pl aceHol der >
25

Sunicapropiedadinteresanteesprecisamentesuidentificadoryaqueestetipodecontrolseutilizapara
marcar las posiciones en las que irn los diferentes contenidos de las pginas derivadas dentro de la
plantilladeestructuraqueesunaMasterPage.
Deestemodo,cuandounapginanormalderivedeunaMP,slosepodrintroducircdigodentrodelas
zonasdefinidasporestoscomodinesdecontenido.
CuandoaadimosunanuevapginaASPXanuestroproyectoyexistealmenosunaMasterPage,podemos
marcarunaopcinparaque,antesdecrearla,nospermitaseleccionardequMPderivar.
Paraelloagregueunanuevapgina,comosemuestraenlaimagen.

EstonosevitatenerqueescribirelatributoMasterPageFilemanualmente.
AleditarunapginaquederivadeunaMasterPageapareceelaspectoyestructuradelapginaprincipal
eneldiseador,peroslosepuedentocarlaspartescorrespondientesaloscomodinesdecontenido.
Diseemosahoralapginamaster.Puedeusarcomogualaimagenqueseveenlasiguientefigura.

Envistawebsedebedeveras:
26

EnlapginamastercambieelnombredelContentPlaceHolder:
<asp: Cont ent Pl aceHol der i d=" Det al l es" r unat =" ser ver " >
</ asp: Cont ent Pl aceHol der >
IgualmenteenlaPaginaHija.aspxmodifiquetambienlasiguientelnea:
<asp: Cont ent I D=" Cont ent 1" Cont ent Pl aceHol der I D=" Det al l es" Runat =" Ser ver " >
</ asp: Cont ent >
AhoravayamosalaPaginaHija.aspx,debeyaapareceralgocomoesto:

EscribeodiseaalgodentrodelaetiquetaDetalles,luegopresionaF5paraverelresultadodelapgina.
Deestamaneratodasnuestraspginaspuedentenerelmismodiseosinnecesidadquetengamosque
repetireldiseoencadaunadeellas.
Observelasiguienteimagenparaverlosresultados.

27

1.5WEBSERVICES
Los servicios web pretenden dar un paso ms en el desarrollo de aplicaciones para la web, ya que su
objetivoesquestaspuedanserutilizadasporotrosprogramascapacesdeprocesarlasrespuestascon
otro fin que no sea el de la presentacin de informacin en pantalla, permitiendo adems automatizar
ciertosprocesosenlawebalposibilitartransaccionesdedatossinintervencindeunusuario.

Un servicio web es un componente de software que expone un conjunto de operaciones en la Web


(mtodos),quepuedenserutilizadosdesdeotrosprogramas.

1.5.1CaractersticasdelosServiciosWeb

Losservicioswebposeenunaseriedecaractersticasqueloshacenpreferiblesaestastecnologas.Entre
ellassepuedendestacar:
Utilizacin de estndares existentes. La base de la arquitectura de servicios web la constituye el
protocoloHTTPyelestndarXML.LacomunicacinclienteservicioWebsellevaacabomedianteel
intercambiodedocumentosXMLentreambos.UtilizandoHTTPcomoprotocolodecomunicacin.

WebService
Figura1.Accesoaunserviciowebdesdeuncliente

Independenciadelaplataforma.LautilizacindeXMLcomoformatodeintercambiodeinformacin
entre el cliente y el servicio web permite que la comunicacin entre ambos pueda realizarse
independientemente de la tecnologa o lenguaje con el que tanto uno como otro estn
implementados,ascomolaplataformaenlaqueseejecuten.
Nuevos estndares abiertos.HTTPy XML constituyenla baseprincipaldelosserviciosweb.Sehan
desarrolladounaseriedetecnologasquepermitenestandarizaroperacionescomoladescripcinola
publicacindeunservicioweb.

1.5.2EstructuraInternadelosServiciosWeb

Laestructuraylacomplejidaddeunserviciowebdependendelasfuncionesarealizarydeltipodeservicio
quesetrate.Encualquiercasosepuedendistinguirdoscomponentesbsicos:
Request(XML)
Response
28

Componentes software. Se trata de componentes de cdigo reutilizable que implementan la


funcionalidad del servicio, sus mtodos pueden incluir acceso a diferentes fuentes de datos. La
funcionalidadqueproporcionanpuedesercompartidaporelrestodemdulosqueformanpartede
la aplicacin web. Estos componentes pueden estar implementados con cualquier tecnologa
software; en este caso de .NET, esta funcionalidad estara implementada mediante clases
independientescompiladasenunensambladordll.
Servidor SOAP. Hace de interfaz entre el cliente y el componente que implementa el servicio. La
comunicacin entre el cliente y el servicio web se realiza va XML, utilizando un protocolo de
codificacinconocidocomoSOAP.Asqueporunlado,estemdulodebeencargarsededecodificar
laspeticionesSOAPquellegandesdeelclienteeinvocaralosmtodosdelcomponente,mientrasque
porotrolado,debecodificarlosresultadosdevueltosporelcomponenteenmensajeSOAPyenviarlos
al cliente. En .NET esta labor se llevara a cabo mediante pginas aspx dentro de una aplicacin
ASP.NET

PeticinSOAP

RespuestaSOAP

Servidor
Figura2.Serviciowebcon.NET

1.5.3TiposdeServiciosWeb

Enfuncindecmovaaserprocesadalainformacinporunservicioweb,sepuedendividirestosendos
categoras:

Serviciosweborientadosamtodo
Se basan en una interaccin de tipo Invocacin Remota a Mtodo (RPC), donde el documento XML de
peticin del servicio web representa la llamada a un mtodo o procedimiento con sus respectivos
parmetros de entrada, mientras que el documento XML generado como repuesta representa el valor
devuelto por dicho mtodo. Es el caso ms sencillo de servicio web y el ms utilizado, donde cliente y
serviciosecomunicandeformaasncrona.

Serviciosweborientadosadocumento
El documento XML enviado por el cliente al servicio web es procesado por este en su totalidad. Este
procesosellevaacabodeformaasncronayelmismopuedeimplicarllamadasadiferentesmtodosy
procedimientosenloscomponentesdelservidor.
Lallamadadeestetipodeservicioswebserealizadeformaasncrona,loquesignificaqueelclientepuede
continuarsuejecucinmientraselserviciowebprocesaeldocumento.
Servicioweb
ASP.NET
ensamblad
29

1.5.4CreacindeServiciosWebcon.NET

ParacrearunserviciowebvamosaArchivo>NuevoSitioWeb
Luegoenlaventanasiguienteseleccionamoslasopcionesquesevenenlaimagen.

ClicenAceptar.PordefectocreaunmtodollamadoHelloWorld

Vamosacrearnuestropropiomtodo,elmtodoquesevahacerdeejemplosereldevolverunvector
connnmeroderegistrosdependiendodeunfiltro.

Paraellonecesitamoslaclasequenosconectaalabasededatosenelservicioweb.

Seleccionael
FrameWord3.5
SeleccionaServicioWeb
ASP.NET
30

Volvemosalserviciowebycreamoslafuncinquenosinteresa.

Estaeslatabladelacualsacaremoslosregistrosaleatorios.

31

LuegoejecutamoslaaplicacinparaellopresionamosCtrl+F5

Luegoenelnavegadorpodemosobservarqueelserviciowebseestejecutando

SiqueremosprobarelServicioWeb,declicsobreelprocedimientoeingreselosdatos.

32

ClicenInvocaryelresultadosera:

Enestecaso,sedebedetenerenlatablaunbuennmeroderegistros,sisequiereingresarparmetros
mayores.Vamosahoraaelaborarunproyectowebdelcualconsumiremoselservicioweb.

Despusdecrearelsitioweb,vamosaSitioWebAgregarReferenciaWeb

33

Nosmostraraunaventanacomolasiguiente,enURLcopielarutadelserviciowebqueestenejecucin.
ClicenelbotnContinuar,ingreseunnombredeReferenciayclicenAgregarReferencia.

Elresultadoser:

34

Ahoravamosaconsumirelservicioweb,paraelloenelarchivoDefault.aspx,diseemosunavistacomo
lasiguiente.

SeleccionamoselbotnTraerPreguntaseingresamoselsiguientecdigo.

35

Ejecutelaaplicacin,ingreselosdatosyobserveelresultado.

1.6CONTROLESDEINICIODESESIN

1. ChangePassword:Permitealosusuarioscambiarlacontrasea.Elusuariodebeproporcionarprimero
lacontraseaoriginaly,acontinuacin,crearyconfirmarlanuevacontrasea.Silacontraseaoriginal
es correcta, la contrasea de usuario se cambia a la nueva contrasea. El control tambin permite
enviarunmensajedecorreoelectrnicoacercadelanuevacontrasea.

2. CreateUserWizard: Permite crear un asistente para la creacin de nuevo usuario donde se puede
capturar la informacin necesaria para tal fin. De hecho, se requiere informacin, asimismo, de la
contrasea del usuario nuevo grupo, direccin de correo electrnico, la pregunta de seguridad y
respuesta.

3. Login: Muestra una interfaz de usuario para la autenticacin de usuarios. El control Login contiene
cuadrosdetextoparaelnombredeusuarioylacontraseayunacasilladeverificacinquepermitea
los usuarios indicar si desean que el servidor almacene su identidad mediante la suscripcin de
ASP.NETyquelosautentiqueautomticamentelaprximavezquevisitenelsitio.

4. LoginName:Permitemostrarelnombredeiniciodesesindeunusuariosiestehainiciadolasesin
mediante la suscripcin de ASP.NET. Por el contrario, si el sitio utiliza la Autenticacin de Windows
integrada,elcontrolmuestraelnombredecuentadeWindowsdelusuario.

5. LoginStatus: Este control muestra un vnculo de inicio de sesin para los usuarios que no estn
autenticadosyunvnculodecierredesesinparalosqueestnautenticados.Elvnculodeiniciode
sesin lleva al usuario a una pgina de inicio de sesin. El vnculo de cierre de sesin restablece la
identidaddelusuarioactualyloconvierteenunusuarioannimo.

6. LoginView:Permitemostrarinformacindiferentealosusuariosannimosyalosquehaniniciado
unasesin.Elcontrolmuestraunadelasdosplantillas:AnonymousTemplateoLoggedInTemplate.
En las plantillas, puede agregar marcado y controles que muestren informacin apropiada para
usuariosannimosyusuariosautenticados,respectivamente.

36

7. PasswordRecovery:Permiterecuperarlascontraseasdeusuariobasndoseenladireccindecorreo
electrnicoqueseusalcrearlacuenta.ElcontrolPasswordRecoveryenvaalusuariounmensajede
correoelectrnicoconlacontrasea.
Creamosunsitionuevo

YagregamosdosWebFormunoconelnombredeLoginyotrocreateaccount

37

AgregamosunMasterPage

AgregamosunWebFormconelnombredehomeyseleccionamoselMasterPageyotroDefault2.
38

39

VamosalformulariologinyagregamosuncontrolLoginView.

40

AgregamosjuntoalLoginViewelcontrolLogin

41

Enautoformseleccionamosunestilo

VamosapropiedadesalaopcinDestinationPageUrlseleccionamoshome
42

43

Vamos al administrador del sitio, seguridad, asistente de configuracin, vamos al paso dos seleccionar
mtododeacceso(desdeinternet)yfinalizar



AbrimoscreateaccountseleccionamoselcontrolcreateUserWizard,autoformat,despusvamosa
propiedadesopcinDestinationPageUrlseleccionamosHome
44

45

46

AhoraenelMasterPageseleccionamosloscontrolesLoginNameyLoginStatus

EnLoginStatusvamosapropiedadesaLogoutActionyseleccionamosRedirectToLoginPasteyen
LogoutPageUrlseleccionamosLogin

47

Abrimoshome.aspxeinsertamosunLoginName.

AbrimosahoraelDefault2.aspx,einsertamosigualmenteunLoginName

Abrimos el Login.aspx agregamos un HyperLink en las propiedades modificamos Text: (Register) y en


navigateUrlseleccionamosCreateacount.aspx

48

Enelhome.aspxagregamosunHyperLinkenlaspropiedadesmodificamosText:(Opciones)ynavigateUrl
seleccionamosdefault2.aspx

49

Corremosnuestraaplicacinparaverificarsipodemosregistrar.

Intenteloguearsecon
cualquierusuario
Debesalirunmensajedeerror,
comoelqueseobservaenla
imagen,declicenRegister
Ingreselosdatosdelusuarioaregistraryde
clicenCrearUsuario
Enlapropiedad
navigateURL,seleccione
Default2.aspx
50

Ahora vamos a agregar un nuevo formulario para cambiar la contrasea con el nombre
Changepassword.aspx,tengapresenteseleccionarlapginamaestra.
EnChangePassword.aspxseleccionamoselcontrolChangePassword.

EnlaspropiedadesdelChangePassword,puedemodificarelformatodevista,siaslodesea.

Listo,ahorapodrloguearseconelusuario
queacabadecrear.
51

NosdirigimosaDefault2.aspxyagregamosunHyperLinkenlaspropiedadesmodificamosText:(Cambiar
Contrasea)yenlapropiedadnavigateUrl,seleccionamoslapginaChangePasword.aspx

CreamosunnuevoWebFormlollamamosPasswordRecovery.aspx
EnlagregamoselcontrolPasswordRecovery,cambieelformatosilodesea.

52

Ahoraenlogin.aspxagregamosunHyperLinkenlaspropiedadesmodificamosText:(Olvidemi
contrasea)yenlapropiedadnavigateUrl,seleccionelapginaPasswordrecovery.aspx

Ejecutamoslaaplicacinyobservamoslosresultados.

53

1.7CONEXINAUNABASEDEDATOSDESQLSERVERDESDEASP.NET

1.7.1ProyectoSaberPro

Cree un proyecto web (usaremos cdigo C#), luego de crear el proyecto agregue una clase, observe la
imagen.

Despusdecrearlaclase,ingreseelsiguientecdigo.

EstafuncinesparartrabajarconlatablaUsuarios,sepuedeusarlamismaparatrabajarcondiferentes
tablas,tododependedelasnecesidadesquesetengaenelformularioqueseesttrabajando.
54

Agregarahoraunformulario,paratrabajarlatablallamadaTbUsuarios,enlaimagensepuedeobservar
eldiseodelatabla.

Agregamos el formulario (frmregistro.aspx), tenga presente seleccionar la opcin que dice Seleccione
pginamaestra.

Tengapresentequealmomentodecrearelproyecto,sedebitenerencuenta,primerocrearelproyecto
vaco,segundocrearunapginamaestraparaelsitioweb.

55

DisearenelWebForms,elformularioderegistrodeusuarios,verlaimagensiguiente.

Nombreloselementosdelasiguientemanera:
TxtDocumento
TxtNombres
TxtApellidos
CmbUniversidad
TxtTelefonoFijo
TxtTelefonoCelular
TxtCorreo
TxtLogin
TxtPassword
CmbPerfil

VamosahoralistarenelCmbUniversidades,lasuniversidadesqueseencuentranregistradasenlabase
dedatos.
56

Seleccioneelcombo,clicenlapestaadeladerechayElegirorigendedatos.

Enlapestaaseleccione<NuevoOrigendeDatos>

57

ClicenelBotnNuevaConexin
SeleccionarMicrosoftSQL
ServeryclicenContinuar
Ingresarelnombredelservidory
seleccionarlabasededatosyclicen
Aceptar
58

ClicenelbotnSiguiente
ClicenelbotnSiguiente
Seleccionamoslatablade
nuestrointers,enestecaso
TbUniversidadesyclicenel
botnSiguiente.
59

ClicenelbotnSiguiente
ClicenelbotnAceptar,yesta
seralavistadelformulario.
60

AhoraprocederemosaconfigurarlasopcionesdelCmbPerfilseleccioneelcombo,clicenlapestaadela
derechayclicenEditarElementos,agreguetresopcionescomosemuestraenlaimagen.ClicenAceptar.

Ejecutelaaplicacin(F5)yenlavistageneraltendralgocomoloqueseobservaenlaimagen.

1.7.2InsertarunNuevoRegistro

Vamosahoraaingresarelcdigoparaingresarunnuevoregistro,elcdigoseriaelsiguiente.

61

Ejecutelaaplicacinyobservelosresultados.

ObservelosencillodeaplicarunaclaseenC#,adicionalaellotienelaventajaquereducemuchocdigo
innecesario.

Sedebecomplementaresteformularioconalgunoscriterios,talescomolavalidacindecadaunodelos
campos,quenoseenvencamposnulos,etc.;Otracosainteresanteparaimplementaraqu,esenviarle
un correo al administrador informndole que se ha registrado un nuevo usuario, para que l revise el
usuarioyloactiveoeliminesegncorresponda.

1.7.3UsodelGridViewparatrabajartablas

El GridView es un elemento de ASP.NET que es muy til al momento de trabajar con las tablas, en las
pginassiguientesvamosavercmopodemostrabajarlo.

AgreguemosunWebFormsllamadofrmadminusuarios.aspx.

Inserteenesteformulariounatabla,conunacolumnaytresfilas,enlasegundafilainserteunGridView,
observalaimagen.
62

Vuelvaaseleccionarlagrilla,clicenlapestaayenElegirOrigendeDatos,declicenNuevoOrigende
Datos.

Seleccionelagrilla,declicenla
pestaasuperiorderecha,
seleccioneFormatoAutomtico,
seleccioneeldesuagradoyde
clicenAceptar.
63

SeleccionalaconexinqueyaestallcreadayclicenelBotnSiguiente.

Seleccionelatabla
TbUsuariosyluegode
clicenelbotn
Avanzadas,yseleccione
laopcinGenerar
instruccionesInsert,
UpdateyDeleteyde
clicenAceptar.
64

ClicenSiguienteyluegoSiguienteparafinalizarelasistente.

Elresultadoseracomoseobservaenlaimagen.

EnlastareasdeGridView,habilitarlassiguientesopciones:

Ejecutelaaplicacinyobservelosresultados.

Vamos a realizar algunas modificaciones en la grilla, para ver ms en detalle las utilidades que tiene,
empezaremosporrealizarunaconfirmacinenelbotneliminar,yaquesiprueba,estebotneliminael
registrodirectamentesinantespedirconfirmacindelusuario.

1.7.4PedirconfirmacindelbotneliminarenelGridView

Parallevaracaboelprocedimiento,seleccionelagrillaydesmarquelaopcinHabilitarEliminacin.
65

DeclicenEditarColumnas

Seleccione
ButtonFieldyclic
enelbotn
Agregar
Propiedad
ButtonTypeen
Link,Text:
Eliminarydeclic
enlaopcinque
diceConvertir
esteinformeen
TemplateField
66

Comoresultadotendremos:

Seleccionelagrilla,vayaalcdigoasp,ubiquelassiguienteslneasyhagaloscambioscorrespondientes
paraquequedecomoseubicaenelresaltadodelaimagen.

Ejecutelaaplicacinynotarqueantesdeeliminarelregistro,pideconfirmacin.

Conlosbotones
deArriba,Abajo,
silodeseaubique
elbotneliminar
desegundo(ver
imagen),Clicenel
botnAceptar.
67

1.7.5InsertarbotnnuevoenelGridView

El GridView debe tener activada sus opciones Habilitar Paginacin, Habilitar Ordenacin y Habilitar
Edicin,seleccionelaopcinEditarColumnas.

Aada un ButtonField a
la grilla y establezca su
propiedad
CommandName en
Insert. Los usuarios
podrn hacer clic en el
botn Insertar para
insertar un nuevo
registro.Enlapropiedad
Textcoloquelomismo.
Hagaclicderechoenel
GridViewyseleccioneEditar
plantillas,luegoEmptyData
Template.Arrastreysuelteun
controlDetailsView(opcin
Datos)dentrodelaplanilla,
establezcalapropiedad
DataSourceIDpara
SqlDataSource1,seleccione
HabilitarInsercin
68

EstablezcalapropiedadDefaultModeenInsertardelDetailsView1,deestamaneracuandolaplantillade
datossemuestra,aparecelistoparaingresardatos(verimagenanterior).

Ahora vaya al cdigo y escriba el siguiente cdigo en el evento RowCommand del gridView como se
muestraacontinuacin.

EnelDetailsView,eneleventoItemInserted,insertarelsiguientecdigo.

69

Ejecutelaaplicacinyhastaaquelresultadodebesercomosemuestraenlassiguientesimgenes.

Seleccione ahora el
DetailsView, y en la
pestaa tareas de
DetailsView,seleccionela
opcinEditarPlantillas.

SeleccioneFooterTemplatee
inserteunbotn,talycomo
seveenlaimagen,la
programacindelbotnser
lasiguiente:
70

Hagaloscambioscorrespondientesparaqueeltemplatequedemejorparaelingresodedatosdeparte
del usuario, tales como cambiarles el tamao a los campos de texto, en Universidad debe aparecer el
comboconlasuniversidades;Enperfil,uncombo,aligualqueenestado,queenpasswordseadeltipo
correspondiente,etc.

1.7.6InsertarenDropDownListaleditarunregistro

AhoraeditelaplantilladelGridView.

EnlasTareasdelGridView,seleccionelacolumnadeUniversidadEditItemTemplate,yallinserteun
DropDownList.

Repita el procedimiento hecho para listar las universidades en el combo, como resultado se tiene un
SqlDataSource2.SeleccioneelDropDownListyvayanapropiedades.

Seleccioneel
GridView,seleccione
laopcinEditar
Columnas,seleccione
lascolumnasenlas
cualesdeseaingresar
elDropDownList
(Universidad,Perfil),y
declicenlaopcin
ConvertirEste
Informeen
TemplateField.Clicen
Aceptarparafinalizar.
71

SeleccioneelDropDownList,yseleccioneEditarEnlacedeDatos,dejelosvalorescomoseobservanenla
imagen.

Verifiquequelas
propiedadesdel
DropDownListestn
comoseobservanenla
figura.
72

Ejecutelaaplicacinyobserveloscambios.

SerecomiendahacerlomismoconelPerfildeUsuario.

1.7.7ValidacindeUsuariosyperfil

Crear dos nuevos master pages, MasterDocente.aspx y MasterEstudiante.aspx y dos Web Pages,
frmmenudocente.aspx(CuyamasterpageserMasterDocente)yfrmmenuestudiante.aspx(Cuyamaster
pageserMasterDocente).

Abrirelcdigodondesevalidaelusuarioyhacerlasiguientemodificacin.

73

Ymodificarlaclasefunciones.

74

1.7.8EnvodeCorreodesdeASP.NET

Frmcontacto.aspx

CdigodeBotnEnviar.

Importarlalibrera

Cambiarlosdatosdeacuerdoaunacuentadeustedes,estemtododeenvodecorrespondenciausauna
autenticacin SMTP, para que funcione con una cuenta de ustedes, deben tener una cuenta con stas
caractersticas.

75

1.7.9MduloEntrenadorproyectoPruebasSaberPro

Inserteunnuevowebforms,elcualllamaremosfrmentrenador.aspx.

Enelnuevoformulariodiseeunavistacomoladelaimagen.(Inserteundropdownlist,unaGridViewy
unBoton).

La primera situacin que hay que resolver es que en el Combo solamente se deben de listar los
componentesdelaUniversidaddelestudiantequeestactualmenteloqueado.

Paraellodefinalassiguientesvariablesydentrodelpageload,ingreseelsiguientecdigo.

76

Session["NombreUsuario"]="estudiante";

Enestalnealoquesehaceesdefinirunusuariodelosquesetienenregistradoenlabasededatos,para
noestarhaciendoel procesodeloqueo,mientrassehacenlasrespectivaspruebassepuededejaresto
as.

LuegosellamaunafuncinqueloquehaceesretornarlaUniversidadalacualperteneceeseusuario.

Univ=fun.traerUniversidad(Session["NombreUsuario"].ToString());

Estalneadebedeestararrojandounerror,yaqueannohemoscreadolafuncin,comopodrnobservar
estafuncindebeestardentrodelalibrera.

Yaenmdulospasadoslahabamoshecho,mssinembargoparaaquellosquenolatengan,lapueden
copiar.

Hastaaqupuedenejecutarlaaplicacinyloquedebeestarhaciendohastaestemomentoeslistarlos
componentesdeestauniversidad.

77

Ahoraalseleccionarunodeloscomponentesdelcombo,debelistarnoslaspreguntasdeesecomponente,
delauniversidaddelusuarioloqueado.

1.7.10Seleccionaraleatoriamenteregistrosdeunatabla

SeleccioneelcomboyhabilitelaopcindeAutoPostBack,ydobleclicparacrearelprocedimiento.

NumPre=fun.traerPreguntas(Convert.ToInt16(DropDownList1.SelectedValue));

Estalneadecdigonostraeelnmerodepreguntasqueestnconfiguradasenbasededatosparaeste
componente.

Comopodrnobservarfaltalafuncinquenosretornaestevalor.

78

Ejecutelaaplicacin,elresultadodebesercomoloquesemuestraenlaimagen.

Pero,primeronoqueremosquenosmuestrelarespuestacorrectaysegundo,queremosquenosmuestre
laimagen.

1.7.11Mostrarunaimagendeunatablaenunagrilla

Paraelloseleccionelagrilla,clicenEditarColumnas.

Deseleccionalaopcin
Generarcampos
automaticamente
79

SeleccioneunoaunoycoloquedeacuerdoasucampoenlabasededatoslaPropiedadDataFielddeigual
maneramodifiquelapropiedadHeaderTextestaesparaelencabezadoquedeseacolocarlealagrilla.

Ejecutelaaplicacinhastaaquyelresultadodeberser:

Agreguecinco
BoundField
80

Ahoradebemosdemostrarlaimagen.

Paraello,seleccionelagrilla,yseleccioneAgregarnuevacolumna,configurelasiguienteventanacomose
veenlaimagen.

Ejecutelaaplicacinyelresultadoser:

81

1.7.12ValidarDropDownListinsertadodentrodeunGridView

Ahora debemos agregar una columna nueva para agregar un Combo, en el cual vamos a seleccionar la
respuestadeseadaporelusuario.

Paraelloseleccionelagrilla,seleccioneEditarColumnas,agregueunanuevaopcinydeclicenConvertir
esteinformeenTemplateField.EnHeaderText,escribaSeleccione.Clicenaceptar.

CliceneditarplantillasyenItemTemplate,elemineelLabelyagregueunDropDownList.

Seleccioneelcomboyagreguelassiguientesopciones.

82

Ejecutelaaplicacinyobservelosresultados.

Bien,ahorasedeseaquealmomentodedarleclicenenviar,nosdebeguardarunregistroenunatablade
cuantaspreguntascorrectashubieronycuantaserradas.

Peroantesdeesto,vamosamostrartemporalmenteenunalistalarespuestacorrectaylarespuestaque
estamosseleccionando,comoparairviendoelprocedimientopasoapaso.

83

Elcdigodelbotnser:

Ejecutelaaplicacin,despusdeseleccionarlasrespuestayaldarclicenelbotnenviar,enlalistadeben
aparecerlasopcionesseleccionadas.

Ahoranecesitamoslasrespuestascorrectas,paraellodebemosdevolveralmomentoenquellenamosla
grilla, tomaremos las respuestas correctas y las guardaremos en un vector. Puede ser tambin en una
cadenadetexto,separadosporalgnsignoespecial.Hagmoslousandoesteltimomtodo.

AntesdelPage_Load

publicstaticstringcadRes="";

Modifiquemoseldropdownlist1.

84

Modifiquemosahoraelbotnenviar.

Ejecutelaaplicacin,debemostrarenellistbox,lasrespuestasdelusuarioconlasrespuestascorrectas.

85

Perononosinteresamostrarestoesunagrillasinoguardarloenlabasededatos.

Latablaparaelloeslasiguiente.

Haganlasmodificacionesalcdigoparaqueestoseaposible.

Lesdejounamuestradealmenoscomosacarlascorrectasylasincorrectas.

Ahora,quesedebedehacer,grabarenlatablaestosdatosyseledebemostraralusuariounresumen,
porejemplo:

Fechadelentrenamiento: 30/10/2012
Usuario 78742034FredysSimancaHerrera
Componente Escritura
PreguntasCorrectas 5
PreguntasIncorrectas 4
Imprimir

86

1.8ProyectoBancodeProyectosdeGrado

Diseodelastablas.Hastaelmomentosedebendetenerlassiguientestablas.

Basededatos:banproyectos

Tabla:TbUsuarios

Tabla:TbProgramas

87

Tabla:TbPropuestas

Tabla:TbPropuestasEstudiantes

Tabla:TbAreasInvestigacion

Tabla:TbLineasInvestigacion

Tabla:TbFechasPropuestas

88

Hastaahoraestassonlastablas,creadas,msadelantecuandosecrearnlasquehacenfalta.

VamosahoraaldiseodelaplicativoenVisualStudio.

Creeunnuevoproyecto(banproyectos)

Insertarunpagemaster,llamadomaster.master,enestemasterpage,diseeunapresentacincomola
queseobservaenlaimagen.

Ntesequesehainsertadounmen,puededescargarunmendeinterneteinsertarlodentrodelmaster
page.

Lasopcionesdelmenson:
Inicio
InformacinGeneral
o Queselcomit
o Funciones
o Integrantes
Contctenos
Regstrese
IniciarSesin
Mas(Opcional)
Colciencias
MinisteriodeEducacin
Correodecontacto(Puedeirenelpedepgina).
89

AgregarunWebFormsllamadoDefault.aspx,elcualvaasernuestrapginaprincipal,porahorapueden
escribiralgocomoloqueseobservaenlaimagen.

Culessonlospasoslgicosaseguir?
Hacerlaautenticacindeusuarios
Disearinicialmentelainterfazdeadministrador
Haceringresosalabasededatosde:
o Programas
o reasdeInvestigacin
o LneasdeInvestigacin
o FechasdePropuestas

Estseralaideaporahora,paraeldesarrollodelproyecto.

Procesamos entonces a insertar un formulario llamado frmlogin.aspx, al momento de insertar este


formulario seleccione la pgina maestra master.master, y disee un formulario de autenticacin de
usuarios,comoelquesepuedeobservarenlaimagen.

Cambielaspropiedadesdeloscontroles.

90

Control Propiedad
TextBox1 Name:TxtLogin
TextBox2 Name:TxtPassword

Paraunmejorfuncionamiento,vamosadejartodoloquetienequeverconvariablesyconexionesala
basededatosenunaclasellamadaFunciones.cs,observelaimagen.

Elcdigodelaclase,eselqueseobservaenlaimagen.

TenerpresentequedebedehacerlasreferenciasalaslibrerasparapodertrabajarelaccesoalSQLServer
yenelnombredelservidor,alldebeirelnombrequetengaensucomputador.

Ahora nos vamos a frmlogin.aspxfrmlogin.aspx y en la siguiente imagen podr observar el cdigo del
formularioqueseincluirporahora.

LasLibreras:

Elcdigocompletodelaclasefrmlogin:
91

Lo primero que hay que hacer es insertar la referencia a la clase que acabamos de crear (Funciones),
dentro del Button1, lo que se hace es hacer la consulta que deseamos, ejecutamos la consulta, con las
respectivasvariables(DA,DT)yvalidamoselresultado,siseencuentraporlomenosconunregistroque
cumpla las condiciones dadas en la consulta, se declaran unas variables de tipo sesin, esto con el
propsitodepoderteneraccesoaestasvariablesdesdecualquierotrapartedelproyecto,ydependiendo
delperfildelusuariomostrarlasopcionesdelmen.

Ntese que se est haciendo referencia a un archivo llamado frmmenu.aspx, este archivo an no est
creado, pero antes de crearlo insertemos tres page master ms (masteradmin, masterdocente y
masterestudiante).Hagalonecesarioparaquelainterfazenlostresmasterquedeigual.

Ahorasiagreguemoselarchivofrmmenu.aspx,almomentodeagregarloseleccionecomopginamaestra
delarchivolamasteradmin.master,ejecutelaaplicacin,declicenIniciarSesinyobservelosresultados.

1.8.1CambiarelMasterPagedinmicamente.

Enelfrmmenu.aspx,ingresedosLabeleingreseelsiguientecdigo.

92

Lafuncinesparacambiarlapginamaestradelarchivodependiendodelperfildelusuarioloqueado.Y
enelpageloadsemuestraenlosdoslabellasvariablesdesesinusadasenelformularioanterior,esto
soloconelpropsitodeverqueefectivamenteestfuncionandoelmanejodevariablesdetiposesin.

Modifiquemoselmenadministradorconlassiguientesopciones(estasopcionessontemporales,sonlas
quenecesitamosporahora,esposiblequemsadelantesedebanincluirms).

Inicio
Fechas
o Fechaspropuestas
o Fechasproyectos
Revisiones
o Propuestas
o Proyectos
Parmetros
o Programas
o reasInvestigacin
o LneasInvestigacin
Seguridad
o NuevoUsuario
o AdminUsuarios
CerrarCesin

Insertarahoradosformularios,frmprogramas.aspxyfrmlogout.aspx,lavistadelproyectodebeir:

93

Eldiseodelformulariofrmprogramas.aspx.

Elcdigodelformulario.

NotequehayunafuncinllamadaInsertarRegistro,estafuncinestdentrodelaclaseFuncionessehace
deestamaneraparapoderinvocarladetodoslosformulariosdondesenecesite.

TxtPrograma
GridViewIDGrilla
94

1.8.2LafuncinInsertarRegistro:

Ahora,laideaesmostrarenlaparteinferiorenlagrillalosregistrosquesevaningresando.

Seleccionelagrilla,clicenlapestaadeladerechayElegirorigendedatosyNuevoOrigendeDatos.

SeleccioneSQL(BasedeDatos)yclickenAceptar.

95

C
l
i
c

e
n

e
l

B
o
t

N
u
e
v
a

C
o
n
e
x
i

S
e
l
e
c
c
i
o
n
a
r

M
i
c
r
o
s
o
f
t

S
Q
L

S
e
r
v
e
r

c
l
i
c

e
n

C
o
n
t
i
n
u
a
r

I
n
g
r
e
s
a
r

e
l

n
o
m
b
r
e

d
e
l

s
e
r
v
i
d
o
r

s
e
l
e
c
c
i
o
n
a
r

l
a

b
a
s
e

d
e

d
a
t
o
s

c
l
i
c

e
n

A
c
e
p
t
a
r

96

ClicenelbotnSiguiente
ClicenelbotnSiguiente
Seleccionamoslatablade
nuestrointers,eneste
casoTbProgramas,ydamos
clicenelbotnAvanzadas
97

Seleccionelaopcindela
imagenydeclicenAceptar
ClicenelbotnSiguiente
ClicenelbotnFinalizar
98

Ejecutelaaplicacinyobservelosresultados,debensercomolosquesemuestranenlaimagen.

Volvamos al diseo del formulario, seleccionamos la grilla y en las tareas de GridView, habilitar las
siguientesopciones.

Ejecutelaaplicacinyobservelosresultados.

99

Vamos a realizar algunas modificaciones en la grilla, para ver ms en detalle las utilidades que tiene,
empezaremosporrealizarunaconfirmacinenelbotneliminar,yaquesiprueba,estebotneliminael
registrodirectamentesinantespedirconfirmacindelusuario.

1.8.3PedirconfirmacindelbotneliminarenelGridView

Parallevaracaboelprocedimiento,seleccionelagrillaydesmarquelaopcinHabilitarEliminacin.

DeclicenEditarColumnas

Seleccione
ButtonFieldy
clicenelbotn
Agregar
100

Comoresultadotendremos.

Seleccionelagrilla,vayaalcdigoasp,ubiquelassiguienteslneasyhagaloscambioscorrespondientes
paraquequedecomoseubicaenelresaltadodelaimagen.
Propiedad
ButtonTypeen
Link,Text
Eliminarydeclic
enlaopcinque
diceConvertir
esteinformeen
TemplateField
Conlosbotones
deArriba,Abajo,
silodeseaubique
elbotneliminar
desegundo(ver
imagen),Clicenel
botnAceptar.
101

Ejecutelaaplicacinynotarqueantesdeeliminarelregistro,pideconfirmacin.

Muybien!Ahoravamosadevolvernosunpocoenlaejecucindelproyectoyvamosahacerelformulario
decontctenos,queestenlaparteinicialdenuestroproyecto.

Inserte un Web Forms, con el nombre de frmcontacto.aspx, recuerde seleccionar la pgina maestra
(master.master)paraesteformulario.

CdigodeBotnEnviar.

Importarlalibrera

102

Cambiarlosdatosdeacuerdoaunacuentadevalida,estemtododeenvodecorrespondenciausauna
autenticacinSMTP,paraquefuncione,debentenerunacuentaconestascaractersticas.

1.8.4MduloAdministracindereasdeInvestigacin(frmareasinvestigacion.aspx).

Este formulario es muy igual al anterior (frmprogramas), haga el siguiente diseo que observa en la
imagen.

ControlTextBox,name=TxtArea

Noolvideninsertarlalibrera.

CdigodelBotnEnviar.

103

Repitaenesteformulario,elprocedimientohechoconelformularioanterior,paraagregarunagrilla,al
finaleldiseodelformulariodebesercomoseobservaenlaimagen.

1.8.5Mduloadministracindelneasdeinvestigacin(frmlineasinvestigacion.aspx)

Paraesteformulario,elaborenelsiguientediseo.

Controles:
DropDownList:Nombre(CmbArea)
TextBox:Nombre(TxtLinea)

AliniciarelformulariolaideaesqueenelcombodereasdeInvestigacinselistelatablareas,paraello
enelpageloadingreseelsiguientecdigo.

LafuncinllenarCombo,debeirenelmismoformulario,cuyocdigoes:

104

NotequeenlafuncinllenarCombo,hayunafuncinllamadaf.consultarRegistros(),estafuncindebeir
enlaclaseFuncionesyelcdigoeselsiguiente.

CdigodelbotnCancelar

Response.Redirect("frmmenu.aspx");

CdigodelbotnEnviar

1.8.6Agregarenlagrillauncampodedescripcindeotratabla

Comoleshabacomentadoen,cuandoinsertamoslagrillaparaadministrarlatablaTbLineasInvestigacin,
enelcampo deIdArea,noerabueno mostrarlealusuariosolamenteelcdigodelrea,yaquepara el
usuario este cdigo no le dice mayor cosa, lo que podemos hacer entonces es mostrarle el cdigo y el
105

nombre del rea. Para ello repita el mismo procedimiento aplicado en las anteriores grillas, pero en la
ventanadeConfigurarlainstruccindelSelect,seleccionamoslaprimeracondicin,observelaimagen.

Ingreselossiguientescomandosparacadaunadelasopcionesqueobservaenlasimgenes.

106

Yterminenelprocedimientonormal,comoenlosanteriorescasos.

Activelassiguientesopcionesdelastareasdeldatagrid

107

Ejecutelaaplicacinyobservelosresultados.

Agregue el botn de eliminar, explicado en el formulario de frmprogramas.aspx, para que pida


confirmacindeeliminacindelosregistros.

Lavistageneraldelformulariodebequedarcomoseobservaenlaimagen.

Declicenelbotneditar,notequeenelcampodeIdArea,lagrillamuestrauncdigo(1,2,2)paraelcaso
delosregistrosquesevenenlaimagen,estonoesconvenienteparaelusuario,yaquelnotieneforma
desaberculessonloscdigosparaunadelasreas,loidealesmostrarleuncomboconlasreas.Observe
laimagenquesemuestraacontinuacin.

108

Parahaceresto,sigalossiguientespasos:

Seleccionelagrilla,cliceneditarcolumnas,seleccionelacolumnaIdAreaydeclicenConvertirInforme
enTemplateField,observelaimagen.

Vuelvaaldiseodelformularioyestavez,seleccionedentrodelasopcionesdelagrillaEditarPlantillas.

Y en tareas del grid view, seleccione EditItemTemplate, al seleccionar esta opcin debe aparecerle un
textbox,elimineeltextboxeingreseunDropDownList,observelaimagenparaunamejorgua.

109

Usandoelasistente,lleneelDropDownListconlatablaTbAreasInvestigacion,comoresultadosetieneun
SqlDataSource2.

SeleccioneelDropDownList,yseleccioneEditarEnlacedeDatos,dejelosvalorescomoseobservanenla
imagen.

Ejecutelaaplicacinypruebequetodoestfuncionando.

Hasta ahora del mdulo Administrador hemos elaborado las opciones de Programas, reas de
InvestigacinyLneasdeInvestigacin.

Para dejar este mdulo por ahora hasta aqu, inserte un formulario llamado frmlogout.aspx, ha este
formulariodebellevarnoslaopcindeCerrarSesin,yenelinserteelsiguientecdigo.

110

Esto lo que hace es que al momento en que el usuario de clic en esta opcin el cierra la sesin y se
direccionaalDefault.aspx,queeselarchivoinicialdelaaplicacin.

Porahoravamosadejardealadoelmduloadministradoryvamosalainterfazinicialeinsertemoslos
formulariosparalasopcionesquehacenfalta.

Ingrese los formularios que hacen falta (observe la imagen). Para todos ellos el master, es el
master.master

En los formularios frmfunciones.aspx, frmintegrantes y frmqueeselcomite, lo que debe ir all es la


informacinrespectoalcomitdetrabajosdegrado.

Enestepuntoledebende
hacerfaltaestos
formularios:
Frmconfirmar.aspx
Frmfunciones.aspx
Frmintegrantes.aspx
Frmqueeselcomite.aspx
Frmregistro.aspx

Yaveremosparaquees
cadaunodeellos.
111

Elformulariofrmregistroyfrmconfirmar,ladinmicadelregistroesquealmomentoenqueunusuario
ingresesusdatosalsistema,inicialmentesegrabacomounusuarioinactivoyseleenvaunlinkalcorreo
quehayaregistradoparaqueingresealaplataformayactivesucuenta.

Empecemosentoncespordisearelformulariofrmregistro.aspx

NoolvidelaconfiguracindelcomboCmbPrograma

Coloque los nombres de los controles iguales a los que se encuentran en la tabla, anteponindole tres
letrasdeltipodecontrol,puedeobservarlosnombresenel cdigoigualmente.(Txtparatextbox,Cmb
paraDropDownList,FulparaFileUpload).

ElcdigoparaelbotnIngresareselqueseobservaenlaimagen.

Lleneelcomboconla
tablaTbProgramas
usandoelasistente.
Estassonlasopciones
delCmbPerfil
112

Observebienelcdigo,interpreteloqueseesthaciendoenl.Observeporejemploquesehacreado
unafuncinllamadaenviarCorreo,estodebidoaqueestolovamosanecesitarmuchoeneltranscursode
la ejecucin del proyecto, entonces para no estar duplicando cdigo se crea la funcin, la funcin la
podemosencontrarenlaclaseFunciones.Esteeselcdigo.

113

Sitodoestfuncionandoalcorreodebellegarlaconfirmacin.Observelaimagen.

Elresultado
114

Ahoratocahacerelcdigodelformulariofrmconfirmar.aspx

Envistadiseo:

Elcdigo:

LoniconuevoqueseencuentraaqueslainstruccinRequest.QueryString,estafuncinloquehacees
tomarelvalordelavariablequehasidoenviadaporlabarradedirecciones.

115

Bien,estonosdejalisto,todoloqueeselmduloinicial,lainformacindelcomitdetrabajosdegrado
sedebedebuscaroincluiralgoall.

Qusigue?RetomarelmduloAdministrador,ycontinuarconeldesarrollodelproyecto.

ComotrabajoquedahacerlasdosopcionesdelMdulodeSeguridad.

Nuevos Usuarios. La idea aqu es hacer lo mismo que est en frmregistro.aspx pero, aqu no hay
necesidaddeenviarcorreodeconfirmacin,yaquesesuponequeelqueestcreandoestenuevousuario
eselAdministrador,porconsiguientehayqueenviaruncorreoperoinformandoalqueseestregistrando
quehasidoregistradoyculessunombredeusuarioysucontrasea.Y,estavezseleenvaellinkcon
direccionamientoalfrmlogin.aspx.

Cmosegundoatenerencuentaesqueelusuariodebequedarenestadoactivado.

En tercer lugar, en las opciones de perfiles deben aparecer los tres perfiles (Administrador, Docente y
Estudiante).

AdminUsuarios.Estaopcindelmdulo,nosdebepermitirmodificardatosalusuario,eliminarelusuario
(no se debe eliminar completamente, solo cambiar su estado a inactivo), pueden hacerlo como mejor
puedan,tenerpresentequeaquellosusuarios(estudiantes)quetenganfoto,sepuedamodificarsufoto
oeliminarlafoto.

El formulario frmadminusuarios.aspx, la vista diseo debe quedar como se observa en la imagen a


continuacin.

116

Enprograma,debelistarselosprogramasqueseencuentranenlatablaTbProgramas.
Enperfil,debeaparecerlastresopcionesdeperfiles:Administrador,DocenteyEstudiante.

Enelformulariofrmadminusuarios.aspx,puedenverenvistadiseocomopodraquedar,esunaopcin,
haymltiplessoluciones.

AldarclicenelBotnBuscar,debe
mostrarmeelusuarioconeldocumento
ingresado.
117

Mdulo Administrar Fechas. La idea de esta opcin es programar las fechas de presentacin de las
propuestasyproyectosdegrado,latablaesTbFechasPropuestas,cuyodiseoes:

Eldiseodelformulario,seracomoseobservaenlasiguienteimagen.

Seeditaelregistro,siempreycuandoencuentreunacoincidenciaenlabasededatos
TbUsuarios,elcampodocumentonodebesermodificable,yaqueeslallaveprimaria,aldar
clicenActualizarseguardarloscambiosenelregistrosiloshubierayvuelvealapantalla
anterior,aldarclicenelbotnEliminar,seeliminarelregistroactual,previaconfirmacinpor
partedelusuariodelaoperacin.
Esrecomendablebuscaruncontrolpara
poderseleccionarlafecha,observela
siguienteimagen,yentipode
documento,PropuestasoProyectos
118

Elcdigodelformulario,botnEnviar

CdigodelPageLoad

Enestecasoheusado
uncontrolAJAX
Lasopcionesdelcombo
119

LafuncinllenarCombo

YelbotnCancelar

Usando el asistente como en casos anteriores, se debe llenar la grilla con la tabla TbFechasPropuesta,
comolasopcionesquesepuedenobservarenlasiguienteimagen.

QuedapendienteenelmduloAdministradorlasopcionesdeRevisarPropuestasyRevisarProyectos.

Adicionalaellosedebetenerpresentequesedebevalidarquenoesposibletenerdosfechasactivas,ya
seaparalaspropuestasoparalosproyectos.

MduloEstudiante(frmuploaddocumentos.aspx)

OpcinUploadDocumentos.Enestaopcinlaideaesquelosestudiantessubanlosdocumentos,yasea
delaspropuestasodelosdocumentos.

Latablaparaestaopcineslasiguiente:

Noolvidarvalidarel
botndelEliminar
120

TbPropuestas

TbPropuestasEstudiantes

Diseeelsiguienteformulario:

InsertarunScriptManager,yaquesevaa
usarAJAX,enelformulario,enla
siguienteimagenseexplicarcondetalle
enquemomento.
UsandoelasistentelleneelComboBox
conlatablaTbLineasInvestigacion
Sellenaporcdigocon
lafuncinllenarDirector
Laideaesquesellenanlosdatosdelapropuesta,seseleccionaelarchivo,quedebeserenformatoWord,seledaclicen
enviar,ypasoseguidoldebemostrarnoslaopcindepoderseleccionarlosestudiantesqueestnpresentandola
presentepropuesta,paraelloseagregarenotrafiladelatabla,primerounUpdatePanel(AJAX),segundounPanel,ypor
ultimounformularioyunagrilla,observelaimagen.
121

Empecemosporelcdigodelform_loaddelformulario.

PrimeroVaun
UpdatePanel
DentrodelUpdatePanel,
debeirunPanel
Diseeelformulariocomose
observaenlaimagen.
Estagrillavaenlazadaalatabla
TbPropuestasEstudiantes,perodebetraer
losdatoscomoelttulodelapropuesta,y
losnombresyapellidosdelosestudiantes.
PropiedadReadOnlyentrueo
cambiarloporunlabel.
122

Elcdigoprimerovalidaqueexistenfechasparasubirpropuestasactivas,sihayfechasactivascontinua,
casocontrario,muestraelmensaje.

LafuncinllenarDirector

CdigodelBotnEnviar

123

BotnCancelar

124

CdigodelBotnAceptar

CdigodelBotnTerminar

Hastaestemomentosedebeejecutarlaaplicacinyelresultadodebesercomoelquesemuestraenlas
imgenes.

Sellenan
losdatosy
clicenel
botn
Enviar
125

Seingresaeldocumento
delestudianteyAgregar
Esteserelresultado,
puedeagregarvarios
estudiantes.
126

Una validacin que debe ir aqu, pero que por cuestiones didcticas no se incluye, se deja como tarea
extraclasealestudianteesquenosedebepermitiringresarmsdetresestudiantesaunapropuesta.

Paraterminar,declicenelbotnTerminar.

ElprocesoparaelUpLoaddelosproyectosesigualaeste,serecomiendacrearunacarpetaparaproyectos,
haymuchasvalidacionesycontrolesquesedebendetenerpresenteenesteformulario,perosesiguen
dejandoparatrabajoextraclase.

Como ya hemos ingresado las propuestas, volvemos al perfil de administrador, para completar las dos
opcionesqueestnpendiente,RevisarPropuestasyRevisarProyectos.

OpcinPropuestas

Insertar un nuevo formulario con el nombre, frmrevisarpropuestas.aspx, con pgina maestra


masteradmin.master.

EnlagrillasolosedebendelistarlaspropuestascuyoestadoseaRevisin,lopodemoshacerporcdigo
o por el asistente, como en pasos previos lo hemos hecho por el asistente, esta vez lo vamos a hacer
medianteelusodecdigo.

Enelpage_loadiraelsiguientecdigo.

127

Loquenosarrojacomoresultado:

Laideaahoraesaadirunbotnquenoslleveaotroformularioparaverlosdetallesdelapropuesta.

1.8.7SeleccionarvalordeunaceldadeunGridView

Seleccionamoslagrilla,editamosTareas
deGridView,enelegirorigendedatos,
seleccionamosSqlDataSource1yluego
clicenEditarColumna
DelosCampos
Disponiblesseleccione
CommandFieldy
agreguelaopcin
Seleccionar,en
Aparienciaenmicasohe
seleccionadoImage,
paracolocarunaimagen.
128

Resultado:

Enlapropiedad
InsertImageURL,
seleccionelaimagen
quedese.Clicen
Aceptar
Silaimagenhaquedadomuy
grande,puedeconvertirlacolumna
enTemplateFieldyluegoeditarla
parapodercambiareltamaodela
imagen.
VayaalaspropiedadesdelGridView
ycreeeleventoen
SelectedIndexChanged
129

Sitodovabien,elcdigohtmlseracomoseveenlaimagen.

Seleccionamos la grilla, damos doble clic sobre ella e insertamos el siguiente cdigo para probar si
efectivamentenoesttomandoelvalorquedeseamos,enestecasoelnmerodelapropuesta.

Vamosaprobarprimero,siefectivamentenosesttomandoelvalordelacolumna.
Enlapropiedad
DataKeyNamesdelagrilla
escribaoseleccione
NumeroPregunta
130

Ahora,aldarclicsobreelregistrovamosadireccionarloaotroformulario,endondevamosamostraro
editarelregistro,paraqueelrevisoringreselosdatos.

Modifiquemoselcdigo,quedaracomoseobservaenlasiguienteimagen.

Insertar el formulario frmdetallespropuesta.aspx, page master masteradmin.master, con el siguiente


diseo.

LaideaesqueelComitdeGradoserene,porconsiguiente,setomaelnmerodepropuestaysegraba
enunatablalaevaluacindelcomitconlasobservacioneshechasalapropuesta.

CmbDirector
CmbEstadoAgregartems:
Revision,Aprobada,Aprobada
conCondicionesyRechazada
TxtObservacion
131

Eldiseodelatabla:TbEvaluacionPropuestas

Empecemosconelcdigodelformulario.

Cdigodelpage_load

LafuncinllenarDirector

132

FuncintraerEstudiantes

ElcdigodelbotnEnviar

RepasemoslasopcionesdelmduloAdministrador.

InicioOK
Fechas
o ProgramarFechasOK
Revisiones
o PropuestasOK
o Proyectos*
Parmetros
o ProgramasOK
o reasInvestigacinOK
o LneasInvestigacinOK
Seguridad
o NuevoUsuarioOK
o AdminUsuariosOK
CerrarCesinOK

133

*RevisionesdeProyectos,elcomportamientodeestaopcineselmismoqueparapropuestas,sedebe
listar los proyectos que estn en estado de revisin, se selecciona el que se desea, se pasa a otro
documentoyenesedocumentoseleasignanlosdosrevisoresalproyecto,elcomitdetrabajodegrado
no revisa proyectos, solamente mira la informacin del proyecto, quien es el director, etc, y asigna los
jurados.

Deberaseralgocomo:

Frmrevisarproyectos.aspx

LatablaTbProyectos

Al dar clic sobre la imagen, debe llevar a frmdetallesproyectos.aspx, al igual que en la propuesta, el
formulariodebeseralgocomoelquesemuestraacontinuacin.

Sinotanenlatablaanterior
estelNmerodePropuesta,
conestenmeropodemos
traerdelatablapropuestala
informacincorrespondiente
alproyecto,estoquieredecir
queunestudiantenopodr
ingresarproyectossinotienen
lapropuestaAprobada
CampoAutonumrico
134

EstodejaralistoelmdulodeAdministrador

LasopcionesdelmduloEstudiante.

Inicio
Documentos
UploadPropuestasOK
UpLoadProyectos
RevisionesPropuestas
RevisionesProyectos
CerrarSesin

OpcinUploadProyectos

Lavistadeldiseodelformulario.

Sedebendetenerpresentaalgunasconsideraciones,enelenvodelproyecto.
Quelestudiantequeestsubiendoelproyectotengalapropuestaaprobada
Quehayafechaabiertaparasubidadeproyectos
Queelestudiantenohayasubidoyaelproyectoparalafecha

Opcin Revisiones Propuestas. En esta opcin lo nico que se debe hacer es listar la tabla
TbEvaluacionPropuestas,tenerpresentequeelestudianteloqueadosolopuedeverlaolasevaluaciones
desupropuesta.

Opcin Revisiones Proyectos. Igualmente en esta opcin, solo se debe listar la tabla
TbEvaluacionProyectos(enelmdulodocentesemostrareldiseodelatabla),tenerencuentaqueel
estudiantesolopuedeverlaevaluacindesuproyecto.

LasopcionesdelMduloDocente

Inicio
RevisinDocumentos
Proyectos
CerrarSesin

OpcinProyectos(frmevaluacionproyectos.aspx)

135

Eldiseodelformulario.Eldocentesolopodrverlosproyectosasignadosal.

Yporltimoelformulariodondeeldebersubirelproyectoconlascorreccionesylasobservaciones.

LatablaTbEvaluacionProyectos

Frmcalificarproyectos.aspx

136

1.9 GENERACIN DE REPORTES


Visual Studio 2010 permite trabajar reportes por medio de Reporting Service y Crystal
reports, en este caso se explicara cmo crear un reporte con Reporting Service.
Los pasos para crear un proyecto empleando reportes:
En el men de Visual Studio seleccione la opcin Archivo y luego en la opcin Nuevo
Proyecto.

En la siguiente interfaz se muestra un conjunto de plantillas entre las cuales se encuentra la
opcin Reporting, una vez se selecciona esta, se presentar un recuadro y all se elegir
trabajar: Aplicacin de informe (es lo mismo para lenguaje C#o VB).

137


Si desea guardar el proyecto en una ruta especfica se debe dar clic en el botn ,
donde se abrir un explorador de Windows el cual corresponde a la ubicacin del directorio
como se muestra a continuacin:

138

Una vez seleccionado el directorio, se procede a digitar el nombre con el que se creara (Ej:
Reportes) y luego damos clic en el botn para crear el proyecto.

A continuacin se despliega el asistente para configurar el origen de los datos que incluiremos
en el reporte, para lo cual se selecciona la opcin Base de datos y damos clic en el botn
.

A continuacin seleccionamos la opcin Conjunto de datos y damos clic en el botn .

139

Es indispensable la conexin con la base de datos que requerimos, para ello se debe dar clic en
el botn Nueva conexin.

En la ventana de configuracin de la conexin se presenta la opcin .

En la opcin se presentan los diferentes tipos de base de datos a los cuales
podremos conectarnos segn el origen de la base de datos, en este caso conectaremos con el
Proveedor de datos de .NET Framework para SQL SERVER. Seleccionar origen de datos
(Microsoft SQL Server) y dar clic en botn .

140

Una vez seleccionado el origen de datos, seleccionamos la instancia del servidor SQL
(normalmente se instala SQL SERVER la instancia por defecto queda como
NOMBRE_EQUIPO\SQLEXPRESS).

Seleccionamos el modo Login al servidor SQL SERVER. Si es por credenciales ingresar el
usuario y el password.

Ahora bien, si ya estn los parmetros correctos en el origen de datos y la conexin con el
servidor se presentara un combo con la lista de las bases de datos de SQL SERVER,
procedemos a seleccionar la requerida.

141

Una vez ingresados todos los requisitos de configuracin del servidor a continuacin podemos
probar la conexin dando clic en el botn .

Si la conexin es satisfactoria, damos clic en el botn de la prueba de conexin y clic
en el botn de la ventana de configuracin de la nueva conexin.
(Se puede desplegar la opcin cadena de conexin para ver la cadena del datasource para la
conexin a la base de datos, como se muestra en la siguiente imagen):

142

Continuamos con el ingreso del nombre con el que se guardara la configuracin, dar clic en el
botn .

A continuacin se presenta una lista con los objetos de la base de datos entre los cuales estn
las tablas creadas en Microsoft SQL Server 2008 R2, seleccionamos la tabla que se requiera e
ingresamos el nombre del dataset y dar clic en el botn .

143

En este paso ya obtenemos el origen de datos y los objetos de la base de datos; de all
seleccionamos la tabla donde se encuentran los datos a presentar en el reporte y dar clic en el
botn .

Al dar clic en , con el anterior paso se presentara un asistente para elaborar el
informe, en este se observan los campos de la tabla que deben ser parametrizados y sern
incluidos en el informe.

144

El asistente permite adicionar funciones de SQL para presentar los datos, como se muestra en
la siguiente imagen:

Una vez seleccionados los campos que se presentan en el informe, damos clic en el botn
siguiente, se genera una vista previa del diseo, damos clic en el botn .

El asistente tiene opciones para modificar el color del estilo, una vez seleccionado dar clic en el
botn .

145

Una vez configurado el origen de datos y diseado el informe con el asistente, los controles que
se presentan en el formulario son los siguientes:
ReportViewer: este proporciona un entorno de diseo integrado para que pueda generar
definiciones de informe de cliente (.rdlc) utilizando datos de cualquier objeto de datos ADO.NET

El reportViewer tiene asociado el reporte de reporting service Report1.rdlc.

En el explorador de la solucin, encontramos el archivo Report1.rdlc.

DataSource: es la fuente de acceso a nuestro origen de datos.

146

Una vez verificado cada uno de los componentes se procede a Compilar la solucin.

El reporte se presenta de la siguiente forma:

Reporting Service: trae la opcin de exportar el informe a formato EXCEL, PDF o WORD.

El proceso se da seleccionando el formato y se guarda en un directorio.


147

Informe en formato Word:



Informe en formato PDF:

Informe en formato EXCEL


148

1.10 GENERACIN DE GRFICOS



Para este proceso, el manejo de graficas con Reporting service, generalizando bsicamente se
aconseja seguir los siguientes pasos:

1. Creacin de consulta en Microsoft SQL Server 2010 con el fin de que retorne los datos que
se requieren mostrar en la grfica del reporte.
2. Creacin de proyecto en Visual Studio 2010.
3. Agregar objeto reportViewer al formulario del proyecto.
4. Agregar el origen de datos.
5. Agregar un nuevo elemento reporte .rdlc al proyecto.
6. Agregar el objeto grafica en el diseo del reporte.
7. Asociar campos a la grfica.
8. Asociar reporte y origen de datos al objeto reportViewer
9. Finalmente compilar el proyecto.

A continuacin se presenta una gua y la descripcin de los pasos anteriormente mencionados:

Creacin de consulta en Microsoft SQL Server 2008 con el fin de que retorne los datos
que se requieren mostrar en la grfica del reporte.

Agregar un nuevo procedimiento almacenado en la base de datos sobre la cual se trabajara
para extraer los datos que se vern en el reporte. Para adicionar un nuevo procedimiento
almacenado en el ambiente SQL Server Management Studio, expandir los objetos de la base de
datos, expandir opcin Programacin, dar clic derecho sobre: y
seleccionar . Para mayor informacin vaya al apartado de
Procedimientos Almacenados.


149

Crear un procedimiento almacenado, el cual retornara la consulta de los datos que se desean
mostrar en la grfica.



Ejecutar el Procedimiento Almacenado mediante la instruccin EXEC
nombre_procedimiento, para asegurarse que la consulta sea exitosa y el resultado sea el
esperado.



Creacin de proyecto en Visual Studio 2010

Una vez que se tenga lista, por decirlo as, la capa de datos en SQL, crear un nuevo proyecto
en Visual Studio 2010. Para crear el nuevo proyecto vamos al men - - .



Seleccionamos el tipo de proyecto y le colocamos el nombre con el que se desea crear.
150



Agregar objeto reportViewer al formulario del proyecto.

Cuando ya se tiene cargado el proyecto, abrir el nuevo formulario y del cuadro de herramientas
seleccionar el objeto reportViewer. Arrstrelo a la forma para agregar dicho objeto.


Para que el objeto quede del tamao del formulario, seleccione la propiedad acoplar al
contenedor, quedar como se muestra a continuacin:
151



Agregar el origen de datos

El siguiente paso es adicionar el origen de datos, para agregar el origen de datos dar clic
derecho sobre la solucin en el explorador de soluciones, seleccione la opcin y
luego seleccione .


152

Se presentara una lista de los elementos visual C# entre los cuales se encuentra la opcin de
Datos, seleccinelo y a continuacin escoja el tipo de elemento Conjunto de datos. Ingrese el
nombre (Ej: DataSet1.xsd) y dar clic en el botn .



En el explorador de soluciones se visualizara en el despliegue de opciones un elemento
DataSet.



En el diseador del DataSet se encuentra la opcin o link de ir al Explorador de servidores, este
presentara la lista de conexiones a base de datos configurada con anterioridad.
153



Una vez se muestre la ventana del explorador de soluciones se pueden visualizar todos los
objetos de la base de datos, en este caso utilizaremos el procedimiento almacenado creado
anteriormente. Seleccionar el procedimiento almacenado y agregar objeto al diseador del
dataset.



Una vez se agrega al diseo del DataSet se visualizan los campos que retorna la ejecucin del
procedimiento almacenado.




154

Agregar nuevo elemento reporte .rdlc al proyecto.



Ahora bien, en este punto se tiene un formulario con el componente para ver el reporte y un
DataSet parametrizado con los datos que se generan. El siguiente paso ser agregar un
elemento informe para disear el reporte. Para agregar un elemento informe dar clic derecho
sobre la solucin en el explorador de soluciones, seleccione la opcin y luego
seleccione .




Se presentara una lista de los Elementos de Visual C#en las Plantillas y escogemos la opcin
Reporting, al seleccionarlo, escogemos el tipo de elemento Informe. Ingrese el nombre y dar
clic en el botn Agregar.


155

Agregar un objeto grafica en el diseo del reporte.



Del cuadro de herramientas seleccionar el objeto Grfico. Arrstrelo al diseador del reporte
para agregar dicho objeto.



Se presentar una ventana con varios tipos de grfica para implementar, seleccionamos el
formato y damos clic en el botn . (A continuacin se abre un asistente para agregar un
origen de datos, omita el paso, ya que la conexin se encuentra definida en caso tal que se
requiera una nueva realice la configuracin.)


156

Asociar los campos a la grafica



Cuando se agrega el objeto Grfica al diseador del reporte se abrir una ventana Datos de
informe en la cual encontramos el DataSet agregado al proyecto y su respectivo origen de
datos. Para activar las opciones del objeto para agregar los campos dar doble clic sobre el
objeto.





Segn requerimiento de datos que se deben mostrar un esquema, donde debemos seleccionar
el campo contenedor y agregar en la seccin de la grfica correspondiente. En la grfica se
encuentran tres secciones:
Campos de datos
Campos de categora
Campos de serie


157

Se puede modificar la escala de la grfica, modificando la propiedad LogScale=True y


LogBase=nmero de escala.



Asociar reporte y origen de datos al objeto reportViewer

Despus de tener el diseo del reporte listo, se debe asociar el reporte al objeto reportViewer
que se agreg anteriormente. En este cuando se selecciona se muestra en la parte superior
derecha una flecha, seleccionar. Se muestra una ventana con las tareas del objeto y un combo
con la opcin de elegir el informe, seleccionar el informe correspondiente.


158

En la ventana de las tareas del componente se muestra la opcin Elegir orgenes de datos.
Seleccionar.



A continuacin se presenta el DataSet y la instancia. Seleccionamos la correspondiente.


Verificar en el cdigo del formulario que el enlace de los datos este correcto.

159

Compilar proyecto

Ahora solo queda compilar el proyecto. Presione tecla F5 o de clic en el botn compilar de
Visual Studio.



Reporte generado:



El reporte ya tiene la opcin de exportar diferentes formatos como Excel, PDF o Word.



Seleccione el formato e ingrese el directorio con el nombre que se va a guardar.
160

2. SQL SERVER

2.1 INTRODUCCIN A SQL

2.1.1 Qu es SQL?

La sigla que se conoce como SQL corresponde a la expresin inglesa Structured
Query Language (entendida en espaol como Lenguaje de Consulta
Estructurado), la cual identifica a un tipo de lenguaje vinculado con la gestin de bases
de datos de carcter relacional que permite la especificacin de distintas clases de
operaciones entre stas. Gracias a la utilizacin del lgebra y de clculos relacionales,
el SQL brinda la posibilidad de realizar consultas con el objetivo de recuperar
informacin de las bases de datos de manera sencilla.
El cientfico Edgar Frank Codd (1923-2003) fue quien propuso un modelo relacional
para las bases de datos y cre un sublenguaje para acceder a los datos a partir del
clculo de predicados. En base al trabajo de Codd, IBM (International Business
Machines) defini el lenguaje conocido como Structured English Query Language
(SEQUEL).
El SEQUEL se considera el antecesor de SQL, un lenguaje de cuarta generacin que
se estandariz en 1986. La versin ms primitiva de SQL, por lo tanto, fue la que se
bautiz como SQL-86 (tambin conocida como SQL1).
En esencia, el SQL es un lenguaje declarativo de alto nivel ya que, al manejar conjuntos
de registros y no registros individuales, ofrece una elevada productividad en la
codificacin y en la orientacin a objetos. Una sentencia de SQL puede resultar
equivalente a ms de un programa que emplee un lenguaje de bajo nivel.
161

Una base de datos, dicen los expertos, implica la coexistencia de mltiples tipos de
lenguajes. El denominado Data Definition Language (tambin conocido como DDL) es
aqul que permite modificar la estructura de los objetos contemplados por la base de
datos por medio de cuatro operaciones bsicas. SQL, por su parte, es un lenguaje que
permite manipular datos (Data Manipulation Language o DML) que contribuye a la
gestin de las bases de datos a travs de consultas.

2.2 LAS CONSULTAS SIMPLES.

2.2.1 Sintaxis de la SELECT (para consultas simples)

La sentencia SELECT nos permite consultar los datos o campos almacenados en una
tabla de la base de datos.
La tabla origen (clusula FROM)
Esta sentencia Indica la tabla (o tablas) desde la que queremos recuperar los datos. En
el caso de que exista ms de una tabla se denomina a la consulta "consulta combinada"
o "join". En las consultas combinadas es necesario aplicar una condicin de
combinacin a travs de una clusula WHERE.

Seleccin de columnas

Como ya vimos anteriormente la sentencia SELECT sirve para seleccionar datos de una
tabla especfica, si queremos que aparezca todas las columnas de la tabla basta con
colocar SELECT * y nos traer todas las columnas, pero si solo queremos ver unas
columnas especificas es necesario colocar el SELECT y el nombre de las columnas o
campos que desea ver en las consulta.
A continuacin vamos a hacer un ejemplo de las sentencias SELECT y FROM
respectivamente supongamos que tenemos una tabla en nuestra base de datos llamada
162

Tbcarros con los siguientes campos: matricula, marca, modelo, color,


numero_kilometros de la siguiente manera:

Con los siguientes datos en la tabla:

La consulta que se va a realizar es que a partir de la tabla Tbcarros vamos a recuperar
nicamente los campos de matrcula, marca, color, para ellos debemos ejecutar la
siguiente consulta. Para crearla le podemos dar clic derecho a la base y nos aparecer
una opcin que dice New Query.

Una vez hallamos hecho la consulta la ejecutamos lo podemos hacer dando F5 y nos
debe aparecer la siguiente informacin:


163

2.2.2 Ordenar las filas (ORDER BY)

Presenta el resultado ordenado por las columnas indicadas. El orden puede expresarse
con ASC (orden ascendente) y DESC (orden descendente). El valor predeterminado
es ASC.
Ahora vamos a ver un ejemplo del order by utilizando nuevamente la tabla Tbcarros del
ejemplo anterior vamos a organizar segn la marca para ello debemos adicional la
siguiente sentencia:

El resultado debe ser el siguiente:

Si nos damos cuenta lo ha organizado en orden alfabtico segn la marca.
2.2.3 Las clusulas DISTINCT / ALL
La sentencia DISTINCT Indica que queremos seleccionar slo los valores distintos a
una referencia y la referencia ALL indica que queremos seleccionar todos los valores.
Es el valor por defecto y no suele especificarse casi nunca.


164

El resultado sera:

2.2.4 La clusula TOP

La Sentencia TOP se emplea para obtener slo una cantidad limitada de registros, la
primera n registros de una consulta.
En este caso solo mostraremos los primeros dos.

2.2.5 La clusula WHERE

Especifica una condicin que debe cumplirse para que los datos sean devueltos por la
consulta. Admiten los operadores lgicos AND, OR y NOT.
165

Para esta sentencia el ejemplo que vamos a realizar es que nos muestre la informacin
del carro o carros con matriculas 'ZMU-084' O matricula ='MAA-566' solo tiene que
encontrar la primera ya que la segunda que colocamos no existe en la base de datos ya
que es un condicional O puede encontrar cualquiera de las dos o las dos la consulta
seria de la siguiente forma:

Y el resultado sera el siguiente:

Como nos podemos dar cuenta solo nos muestra la informacin de un solo carro que
cumple con la condicin de la matrcula. En cuanto el operador lgico AND se trabaja
en la misma sentencia nicamente cambiamos donde est el OR en la consulta anterior
por el AND con este operador lgico si es necesario que las dos condiciones se
cumplan para que pueda ver el resultado. El NOT nos muestra todos menos el dato que
coloquemos en la consulta.

Operadores permitidos en la sentencia WHERE



Con la sentencia WHERE, los siguientes operadores pueden ser usados:

166

2.2.5 Condiciones de seleccin



Las condiciones de seleccin son las condiciones que pueden aparecer en la clusula
WHERE.
En SQL tenemos cinco condiciones bsicas:
Test de comparacin: Compara el valor de una expresin con el valor de otra.
=igual que
<>distinto de
<menor que
<=menor o igual
>mayor que
>=mayor o igual
Ejemplo:
Mostrar los carros que sean modelo mayor al 1996.


Test de rango: Examina si elvalorde la expresin estcomprendidoentrelosdos
valoresdefinidos por exp1 y exp2. (Between).
167

Ejemplo:
Consultar carros modelos entre 2000 y 2008.

Test de pertenencia a un conjunto: Examina si elvalorde la expresin es uno de
los valoresincluidosenlalistade valores.
Test de valor nulo: Una condicin de seleccin puede dar como resultado el valor
verdadero TRUE, falso FALSE o nulo NULL

Ejemplo

Consultar los carros que no tiene registrado color.



Resultado:


168

En este caso no sali ningn resultado por que el color lo dejamos como No Null.

Test de correspondencia con patrn: Se utiliza cuando queremosutilizar
caracteres comodinespara formar el valor con el compara

Ejemplo:

Consultar todos los carros que sean Nissan:

2.2.6 Caracteres Comodines

Los comodines SQL pueden ser usados en la bsqueda de datos en una base de datos
pueden sustituir a uno o ms caracteres cuando se busquen los datos

Los comodines deben usarse con el operador LIKE Se pueden usar con SQL los
siguientes comodines:

169

COMODN SIGNIFICADO
% Cualquiercadenadeceroomscaracteres.
_ Cualquiercarcter.
[] Cualquiercarcterindividualdelintervalo(porejemplo[abcdef])especificado.
[^] Cualquiercarcterindividualfueradelintervalo(porejemplo[^af)especificado.

Ejemplo
Ahora seleccionaremos los carros que empiecen con "ZM" la matricula.

2.3 LAS CONSULTAS MULTITABLA

2.3.1 La unin de tablas



Esta operacin se utiliza cuando se tienen dos tablas con las mismas columnas y se quiere
obtener una nueva tabla con las filas de la primera y las filas de la segunda.

Cuando se habla de tablas pueden ser tablas reales almacenadas en la base de datos o tablas
lgicas (resultado de una consulta), esto permite utilizar la operacin con ms frecuencia ya
que pocas veces se tiene en una base de datos tablas idnticas en cuanto a columnas. El
resultado siempre es una tabla lgica.

El operador que permite realizar esta operacin es el operador UNION.

170


Fuente: www.aulaclic.com/sql

2.3.2 La composicin de tablas

La composicin de tablas consiste en concatenar filas de una tabla con filas de otra. En este
caso se obtiene una tabla con las columnas de la primera tabla unida a las columnas de la
segunda tabla, y las filas de la tabla resultante son concatenaciones de filas de la primera tabla
con filas de la segunda tabla.


Fuente: www.aulaclic.com/sql


Existen distintos tipos de composicin, se utiliza siempre el ms apropiado segn el caso. Los
tipos de composicin de tablas son:
El producto cartesiano
El INNER J OIN
El LEFT / RIGHT J OIN

El operador UNION

El operador UNION combina el resultado de dos o ms instrucciones SELECT en un
nico conjunto de resultados.

Se utiliza el operador UNION cuando los datos que se desean residen en ubicaciones diferentes
y no se puede tener acceso a ellos con una nica consulta. Al utilizar el operador UNION, tenga
en cuenta los siguientes hechos e instrucciones:

171

SQL Server requiere que las tablas a las que se hace referencia tengas tipos de datos
similares, el mismo nmero de columnas y el mismo orden de columnas en la lista de seleccin
de cada consulta.

SQL Server quita las filas duplicadas del conjunto de resultados. Sin embargo, si utiliza la
opcin ALL, se incluyen todas las filas en el conjunto de resultados.

Debe especificar los nombres de las columnas en la primera instruccin SELECT. Por lo tanto,
si desea definir nuevos encabezados de columnas en el conjunto de resultados, deber crear
los alias de columnas en la primera instruccin SELECT.

Sintaxis lgica del operador:

Instruccin SELECT UNION [ALL] Instruccin SELECT

Se presenta el siguiente ejemplo:



Se utiliza el operador UNION




El resultado es:

172




El Producto Cartesiano

El producto cartesiano es un tipo de composicin de tablas, aplicando el producto cartesiano a
dos tablas se obtiene una tabla con las columnas de la primera tabla unidas a las columnas de
la segunda tabla, y las filas de la tabla resultante son todas las posibles concatenaciones de
filas de la primera tabla con filas de la segunda tabla.

La sintaxis es la siguiente:

FROM nombreTabla AS aliasTabla

El producto cartesiano se indica poniendo en la FROM las tablas que queremos componer
separadas por comas, podemos obtener as el producto cartesiano de dos, tres, o ms tablas.

Para el ejemplo las dos tablas de donde se consultan los datos estn de la siguiente manera:




173

El resultado implementando el producto cartesiano es el siguiente:







El INNER JOIN

El INNER J OIN es otro tipo de composicin de tablas, permite emparejar filas de distintas
tablas de forma ms eficiente que con el producto cartesiano cuando una de las columnas de
emparejamiento est indexada. Ya que en vez de hacer el producto cartesiano completo y
luego seleccionar la filas que cumplen la condicin de emparejamiento, para cada fila de una
de las tablas busca directamente en la otra tabla las filas que cumplen la condicin, con lo cual
se emparejan slo las filas que luego aparecen en el resultado.

La sintaxis es la siguiente:

FROM tabla1 INNER J OIN tabla2 ON tabla1.col1 comparar tabla2.col2

Por ejemplo en una base de datos donde se gestionan notas, se consultara el nombre del
estudiante y que materias tiene suscritas.

174



El resultado es:






El LEFT JOIN y el RIGHT JOIN

El LEFT JOIN y RIGHT JOIN son otro tipo de composicin de tablas, tambin denominada
composicin externa. Son una extensin del INNER JOIN.

La sintaxis del LEFT J OIN es la siguiente:

FROM tabla1 LEFT J OIN tabla2 ON tabla1.col1 comparar tabla2.col2

La descripcin de la sintaxis es la misma que la del INNER JOIN, lo nico que cambia es la
palabra INNER por LEFT (izquierda en ingls).

Esta operacin consiste en aadir al resultado del INNER JOIN las filas de la tabla de
la izquierda que no tienen correspondencia en la otra tabla, y rellenar en esas filas los campos
de la tabla de la derecha con valores nulos.

En el siguiente ejemplo se busca traer tambin las materias que no est viendo ningn
estudiante.

175



El resultado es:




La sintaxis del RIGHT JOIN es la siguiente:

FROM tabla1 RIGHT J OIN tabla2 ON tabla1.col1 comparar tabla2.col2

La sintaxis es la misma que la del INNER JOIN, lo nico que cambia es la palabra INNER
por RIGHT (derecha en ingls).

Esta operacin consiste en aadir al resultado del INNER JOIN las filas de la tabla de la
derecha que no tienen correspondencia en la otra tabla, y rellenar en esas filas los campos de
la tabla de la izquierda con valores nulos.

En el siguiente ejemplo se busca traer solamente las materias que estn viendo ningn
estudiante.




El resultado es:

176




2.3.3 Las funciones de Columna


En la lista de seleccin de una consulta de resumen aparecen funciones de columna tambin
denominadas funciones de dominio agregadas. Una funcin de columna se aplica a una
columna y obtiene un valor que resume el contenido de la columna.

Las siguientes son funciones de columna:

SUM (expresin) AVG (expresin) STDEV (expresin) STDEVP (expresin)
MIN (expresin) MAX (expresin) COUNT (expresin) COUNT (*)

La funcin SUM() calcula la suma de los valores indicados en el argumento. Los datos que se
suman deben ser de tipo numrico (entero, decimal, coma flotante o monetario...). El resultado
ser del mismo tipo aunque puede tener una precisin mayor.



StDev() y StDevP() calculan la desviacin estndar de una poblacin o de una muestra de la
poblacin representada por los valores contenidos en la columna indicada en el argumento. Si
la consulta base (el origen) tiene menos de dos registros, el resultado es nulo. AVG(), STDEV(),
STDEVP() los resultados no sern los mismos con valores 0 que con valores nulos. Vemoslo
con un ejemplo:



Las funciones MIN() y MAX() determinan los valores menores y mayores respectivamente. Los
valores de la columna pueden ser de tipo numrico, texto o fecha. El resultado de la funcin
tendr el mismo tipo de dato que la columna. Si la columna es de tipo numrico MIN() devuelve
177

el valor menor contenido en la columna, si la columna es de tipo texto MIN() devuelve el primer
valor en orden alfabtico, y si la columna es de tipo fecha, MIN() devuelve la fecha ms
antigua y MAX() la fecha ms reciente.

La funcin COUNT(nb columna) cuenta el nmero de valores que hay en la columna, los datos
de la columna pueden ser de cualquier tipo, y la funcin siempre devuelve un nmero entero.
Si la columna contiene valores nulos esos valores no se cuentan, si en la columna aparece un
valor repetido, lo cuenta varias veces.



COUNT(*) permite contar filas en vez de valores. Si la columna no contiene ningn valor
nulo, COUNT(nbcolumna) y COUNT(*) devuelven el mismo resultado, mientras que si hay
valores nulos en la columna, COUNT(*) cuenta tambin esos valores mientras que
COUNT(nb columna) no los cuenta.




Seleccin en el origen de datos

El origen de datos se encuentra en la clusula FROM la cual es una lista separada por comas
de nombres de tablas, nombres de vistas y clausulas JOIN.

Si queremos eliminar del origen de datos algunas filas, basta incluir la clusula WHERE que
ya conocemos despus de la clusula FROM.


Origen mltiple

Si los datos que necesitamos utilizar para obtener el resumen se encuentran en varias tablas,
se debe formar el origen de datos adecuado en la clusula FROM como si fuera una consulta
multitabla normal.

2.3.4 La clusula GROUP BY

Agrupa un conjunto de filas seleccionado en un conjunto de filas de resumen de acuerdo con
los valores de una o ms columnas o expresiones. Se devuelve una fila para cada grupo. Las
funciones de agregado de la lista de seleccin de la clusula SELECT proporcionan informacin
sobre cada grupo en lugar de filas individuales.

La clusula GROUP BY tiene una sintaxis que cumple la norma ISO y otra sintaxis que
no cumple dicha norma. Solo se puede usar un estilo de sintaxis en cada instruccin SELECT.
178

En el ejemplo siguiente se recupera el promedio de las notas obtenido por estudiante en el


semestre:



El resultado es:




2.3.5 La clusula HAVING


Especifica una condicin de bsqueda para un grupo. HAVING solo se puede utilizar con la
instruccin SELECT. Normalmente, HAVING se utiliza en una clausula GROUP BY. Cuando no
se utiliza GROUP BY, HAVING se comporta como una clausula WHERE.

En el ejemplo siguiente, donde se utiliza una clausula HAVING simple, se recupera el total de
cada promedio de estudiante por semestre que obtuvo ms del 3,0.



El resultado es:


179

2.4 PROCEDIMIENTOSALMACENADOS
Un procedimiento almacenado (stored procedure en ingls) es un programa el cual es almacenado
fsicamenteenunabasededatos.Suimplementacinvaradeunmanejador debasesde datosaotro.
La ventaja de un procedimiento almacenado es que al ser ejecutado, en respuesta a una peticin de
usuario, es ejecutado directamente en el motor de bases de datos, el cual usualmente corre en un
servidor separado. Como tal, posee acceso directo a los datos que necesita manipular y slo necesita
enviar sus resultados de regreso al usuario, deshacindose de la sobrecarga resultante de comunicar
grandes cantidades de datos salientes y entrantes. Usos tpicos para procedimientos almacenados
incluyen la validacin de datos siendo integrados a la estructura de base de datos (los procedimientos
almacenados utilizados para este propsito a menudo son llamados disparadores; triggers en ingls), o
encapsular un proceso grande y complejo. El ltimo ejemplo generalmente ejecutar ms rpido como
un procedimiento almacenado que de haber sido implementado como, por ejemplo, un programa
corriendo en el sistema cliente y comunicndose con la base de datos mediante el envo de consultas
SQL y recibiendo sus resultados. Los procedimientos pueden ser ventajosos: Cuando una base de datos
esmanipuladadesdemuchosprogramasexternos.Alincluirlalgicadelaaplicacinenlabasededatos
utilizando procedimientos almacenados, la necesidad de embeber la misma lgica en todos los
programasqueaccedenalosdatosesreducida.Estopuedesimplificarlacreaciny,particularmente,el
mantenimientodelosprogramasinvolucrados.Podemosverun claroejemplodeestosprocedimientos
cuandorequerimosrealizarunamismaoperacinenunservidordentrodealgunasotodaslasbasesde
datos y a la vez dentro de todas o algunas de las tablas de las bases de datos del mismo. Para ello
podemos utilizar a los Procedimientos almacenados autocreables que es una forma de generar ciclos
redundantesatravsdelosprocedimientosalmacenados.

180

2.4.1CreacinProcedimientoAlmacenado(SinParmetrosDeEntrada)
En la cabecera de definicin de un procedimiento almacenado primero se escriben las palabras
reservadas CREATE PROCEDURE a continuacin el nombre del procedimiento de almacenamiento
dejandounespacioenblanco.
En tercer lugar la lista de los parmetros cada uno de ellos debe empezar con @ no se colocan entre
parntesis,vacadaparmetroconsutipodedato,yvanseparadosporcomasnoseindicanadasison
de entrada, sin embargo si el parmetro es de entrada salida se incluye al final la palabra reservada
OUTPUT.
CREATE PROCEDURE Nombr ePr ocedi mi ent o
@Par am1 i nt ,
@Par am2 i nt ,
@Par am3 i nt OUTPUT
AS
BEGI N
- - aqui vi enen l as i nst r ucci ones del pr ocedi mi ent o al macenado
END
Ya veremos que los parmetros de cursor se utiliza una clusula diferente; por ltimo un parmetro
puede tener un valor por omisin adems tambin hay que decir que no hay un marcador que indique
donde termina un procedimiento almacenado, muchas veces se coloca la palabra GO al final de cada
procedimiento lo cual considera que el procedimiento termina, antes de la palabra GO o hasta el final
delficheroloqueocurraprimero.EncerrarBEGINlaslneasdelprocedimientoentrelaspalabrasBEGIN
yEND(FinaldelProcedimiento).
2.4.2EjecutarUnProcedimientoAlmacenado
Se utiliza la instruccin EXECUTE y a continuacin espacio en blanco el nombre del procedimiento
almacenado si tienen parmetros se deben aadir todos los parmetros separados por comas se debe
repetirlaclusulaOUTPUTparapoderrecibirvaloresenunparmetrodesalidasinoseincluyeOUTPUT
habrtratadoelparmetroenunadireccindeentrada.

EXECUTE Nombr ePr ocedi mi ent o
2.4.3FormaGeneraldeunProcedimientoAlmacenado
EnconclusinunProcedimientoalmacenadosecreaconlaspalabrasreservadasCREATEPROCEDUREa
continuacin el nombre, luego se colocan los parmetros con su tipo de dato. Se deben encerrar las
instrucciones entre las palabras reservadas BEGIN Y END luego se debe ejecutar el programa el cual se
almacenaenelServidor.

181

Enlasiguienteimagensepuedeverelejemplodeunprocedimientoalmacenado.

2.4.4ModificacindeunProcedimientoAlmacenado
ParamodificarelprocedimientoalmacenadosedeberealizarconlapalabraALTERdespusdelnombre
colocarlosparmetros.

182

Unrepasogeneral

183

184

Usos. Los usos 'tpicos' de los procedimientos almacenados se aplican en la validacin de datos,
integradosdentrodelaestructuradelbancodedatos.Losprocedimientosalmacenadosusadoscontal
propsito se llaman comnmente disparadores o triggers. Otro uso comn es la 'encapsulacin' de un
APIparaun procesocomplejoograndeque podra requerirla 'ejecucin' devariasconsultasSQL,tales
comolamanipulacindeun'dataset'enormeparaproducirunresultadoresumido.
Tambin pueden ser usados para el control de gestin de operaciones, y ejecutar procedimientos
almacenados dentro de una transaccin de tal manera que las transacciones sean efectivamente
transparentesparaellos.
Ventajas. La ventaja de un procedimiento almacenado, en respuesta a una peticin de usuario, est
directamentebajoelcontroldelmotordelmanejadordebasesdedatos,locualcorregeneralmenteen
un servidor separado de manejador de bases de datos aumentando con ello, la rapidez de
procesamientoderequerimientosdelmanejadordebasesdedatos.Elservidordelabasededatostiene
accesodirectoalosdatosnecesariosparamanipularyslonecesitaenviarelresultadofinalalusuario.
LosprocedimientosalmacenadospuedenpermitirquelalgicadelnegocioseencuentrecomounAPIen
labasededatos,quepuedensimplificarlagestindedatosyreducirlanecesidaddecodificarlalgica
en el resto de los programas cliente. Esto puede reducir la probabilidad de que los datos sean
corrompidosporelusodeprogramasclientesdefectuososoerrneos.Deestemodo,elmotordebase
de datos puede asegurar la integridad de los datos y la consistencia, con la ayuda de procedimientos
185

almacenados. Algunos afirman que las bases de datos deben ser utilizadas para el almacenamiento de
datossolamente,yquelalgicadenegocioslodeberaseraplicadaenlacapadenegociodecdigo,a
travs de aplicaciones cliente que deban acceder a los datos. Sin embargo, el uso de procedimientos
almacenadosnoseoponealautilizacindeunacapadenegocio.
Acontinuacinnosdetenemosaexplicarlaforma generaldeunprocedimientoalmacenadoycomose
modifica utilizando la palabra reservada ALTER. Se explica cmo es posible utilizar parmetros de
entradaycomoejecutarunprocedimientoalmacenadoconparmetrosdeentrada.Alfinaltambinse
detallacmoutilizarvalorespordefectoparalosparmetrosdeentrada.
Vamos a ejecutar un ejemplo con procedimientos almacenados a travs de parmetros, vamos a
emplearlabasededatoscustomers.
En esa Base de datos se va escoger una seleccin donde aparezca Identificador, el nmero de la
compaa,elcontactoydelpas.
SevaacrearunprocedimientoquesellameClientescomoyanosencontramosdentrodeNorthwindno
tenemosningnproblema,ejecutamos.

En la parte de abajo y despus de darle ejecutar nos debe mostrar el mensaje de que ha sido creado
correctamente.

Como ya lo hemos ejecutado y no hemos dado ningn parmetro de entrada ni de salida debemos
ejecutarelprocedimientoClientesloseleccionamosydamosejecutar.
Comopodemosvernosdevuelve93filasperoenrealidadnosestdevolviendotodaslasfilastodoslos
registrosdelatablaaunquesolonosdevuelva4camposporregistro.

186

Vamos a cambiar un poco nuestro procedimiento para que sea ms flexible nuestra consulta, vamos a
decirlequenosfiltreporlosclientesingleses.Simplementeaadimoslaclusulaquesemuestra.

Como se haba mencionado anteriormente para alterar un procedimiento que ya est creado debemos
emplearlasentenciaALTER
Procedemosaejecutarloynosdebemostrarquelohaejecutadocorrectamente.

Por cierto una manera de ver los procedimientos es dirigirse a la ventana de la derecha minimizamos
tabladandoclicenelsmbolo

187

Loquenosvaaaparecerestodoloquerepresentalabasededatos.

Despus de esto debemos desplegar el men denominado Procedimientos Almacenados luego


buscamoselprocedimientoClientes.

Acontinuacinejecutamosclientessimplementeseleccionamosydamosejecutar.
EXECUTE Cl i ent es
Nosdebemostraracontinuacin7filasycomolehabamosdichonosdebedevolverlosclientesingleses
nicamente los cuatro campos y esta filtrado como lo habamos indicado que lo realizara en la tabla
anterior.
Despus de observar esto
desplegamos el men de
programacin dando clic
enelsmbolo+
Luego de encontrar el
procedimiento Clientes
desplegamos el men, aparece
otro con nombre Parmetros y
aparece uno que dice Devuelve
entero en este momento no nos
muestra los parmetros.
188

Pero como se haba indicado anteriormente a un procedimiento almacenado se le pueden aadir


parmetros de entrada, as que probaremos colocando clientes ingleses, clientes espaoles, clientes
brasileos. Para realizar esto debemos ingresar el parmetro que se muestra, pero antes de esto
debemosingresarunparmetrodeentradaleotorgamosunavariableenestecasoser@Pas.

No olvidemos agregar los parmetros para los debidos clientes segn lo tengamos en la tabla deberan
sercomosemuestraenlaimagenyotroparmetrodeentradacolocandolapalabraALTER,elnombre
delavariable@Pas

Lo dems es lo mismo que lo que habamos hecho anteriormente lo nico que cambia es la clusula
Whereyesevalorseasociaalavariable@Pais

Se ejecuta el procedimiento almacenado, el resultado es clientes ingleses, espaoles o los clientes


brasileos,segnseaelcaso.

Ahora generamos un valor por defecto, se aade despus de la variable el valor por defecto, que el
stringseacualquiernumerooletras,fraseopalabra,laconsultaeslamisma.Ejecutamosclientesynos
debetraertodos.

189

Ejecuteelprocedimientoalmacenadoparacadacaso,yobservelosresultados.

Observeconlossiguientesejemplos:

EXECUTE Cl i ent es ' s%'


EXECUTE Cl i ent es ' [ a- d] %'
EXECUTE Cl i ent es ' %p%'

Observequeocurreparacadacaso.

2.5TRIGGERSENTRANSACTSQL

Un trigger (o desencadenador) es una clase especial de procedimiento almacenado que se ejecuta


automticamentecuandoseproduceuneventoenelservidordebasesdedatos.
Los desencadenadores DML se ejecutan cuando un usuario intenta modificar datos mediante un
evento de lenguaje. Los eventos DML son instrucciones INSERT, UPDATE o DELETE de una tabla.
Estos desencadenadores se activan cuando se desencadena cualquier evento vlido, con
independenciadequelasfilasdelatablaseveanonoafectadas.
Los desencadenadores DDL se ejecutan en respuesta a una variedad de eventos de lenguaje de
definicin de datos (DDL). Estos eventos corresponden principalmente a instrucciones CREATE,
ALTERyDROP.
Los desencadenadores logon se activan en respuesta al evento LOGON que se genera cuando se
establece la sesin de un usuario. Los desencadenadores se pueden crear directamente a partir de
instruccionesTransactSQLodemtodosdeensambladosquesecreanenMicrosoft.NETysecargan
en una instancia de SQL Server. SQL Server permite crear varios desencadenadores para una
instruccinespecfica.

2.5.1LosDesencadenadoresDML

Lasintaxisgeneraldeuntriggereslasiguiente.
190

LasinstruccionesdetriggersDMLutilizandostablasespeciales
La primera tabla (inserted) solo est disponible en las operaciones INSERT y UPDATE y en ella
estn los valores resultantes despus de la insercin o actualizacin. Es decir, los datos
insertados.InsertedestarvacaenunaoperacinDELETE.
En la segunda (deleted), disponible en las operaciones UPDATE y DELETE, estn los valores
anteriores a la ejecucin de la actualizacin o borrado. Es decir, los datos que sern borrados.
DeletedestarvacaenunaoperacinINSERT.

Lasiguienteinstruccinprovocarqueeltriggerseejecute:

Podemosespecificaraqucolumnasdelatabladebeafectareltrigger.

191

PodemosactivarydesactivarTriggersatravsdelassiguientesinstrucciones.

2.5.2LosdesencadenadoresDDL
Lasintaxisgeneraldeuntriggereslasiguiente.

La siguiente instruccin impide que se ejecuten sentencias DROP TABLE y ALTER TABLE en la base de
datos.

2.5.3EjemploprcticodecmocrearunTriggersenTransactSQL
Despus de haber conceptualizado toda la parte terica de lo que es un trigger y cmo funciona
procederemosconeldesarrollodenuestroejemplo.
IngreseaSQLServer2008o2005,inicio>todoslosprogramas>MicrosoftSQLServer2008o2005>SQL
ManagementStudio.
192

Nosconectamosconnuestrousuarioycontrasea
Despus de habernos conectado procederemos con la creacin de una nueva base de datos llamada
MITRIGGERparaellodaremosclicderechoenBasedeDatosyclicenNuevabasededatos

AsignamoselnombredenuestrabasededatosydamosclicenAceptar.

Luegodehabercreadonuestrabasededatosprocederemosacrear2tablasdelasiguientemanera:
193

LaprimeratablasellamarCliente
DentrodelatablaClienteingresaremoslossiguientescampos.
IdCliente(pk,varchar(20)),
Nombre(varchar(20)),
Apellido(varchar(20)),
Direccion(varchar(20))

Unavezcreadalatablaingresaremos3datosdentrodelatabladelasiguienteforma:

194

UnavezingresadodatosdentrodeestatablaprocederemosconlacreacindelatablaNo.2
LasegundatablasellamaraPedidos
DentrodelatablaPedidosingresaremoslossiguientescampos.
IdCliente(pk,varchar(20)),
Nombre(varchar(20)),
Fecha(date)

UnavezcreadanuestrasegundatablaprocederemosconlaimplementacindenuestroTrigger.
ParaprocederconlaejecucindenuestroTriggervamosaabrirlaconsoladeconsultasoquerydela
siguientemanera:
ClicderechosobrelabasededatosyacreadayclicenNuevaconsulta.

Unavezingresadoalaventanadeconsultaprocederemosarealizarun:
195


Sel ect * f r omCl i ent e
Sel ect * f r omPedi dos

Nota:paraejecutarlasconsultassedaclicenelbotnEjecutarenlapartesuperior.

Paraverificarquelastablascreadasestncorrectas.

El siguiente cdigo lo ingresaran dentro de la consulta con el fin de que el trigger afecte la tabla de
clientescomoladePedidosconelfindequenospermitarealizarlasmodificacionesquesedeseen.

Una vez digitada seleccione toda la instruccin y de clic en el botn Ejecutar all aparecer como
resultadoComandoscompletadoscorrectamente.
196

Realizandonuevamenteun:
Sel ect * f r omCl i ent e
Sel ect * f r omPedi dos

Enlastablaspodemosnotarqueannohaydatosnimodificaciones.

Porloqueprocederemosainsertarelsiguientecdigoynotarloscambiosquesevanaproducir

Una vez digitada seleccione toda la instruccin y de clic en el botn Ejecutar all aparecer como
resultado(1filasafectadas).
197

Finalmenterealizandonuevamenteun:
Sel ect * f r omCl i ent e
Sel ect * f r omPedi dos

Enambastablaspodremosobservarlamaneraenquesivieronafectadasmediantelautilizacindelos
TriggersenTransactSQL

198

2.6TRANSACCIONESENTRANSACTSQL

UnatransaccinesunconjuntodeoperacionesTransactSQLqueseejecutancomounnicobloque,es
decir, si falla una operacin Transact SQL fallan todas. Si una transaccin tiene xito, todas las
modificacionesdelosdatosrealizadasdurantelatransaccinseconfirmanyseconviertenenunaparte
permanentedelabasededatos.Siunatransaccinencuentraerroresydebecancelarseorevertirse,se
borrantodaslasmodificacionesdelosdatos.
Elejemploclsicodetransaccinesunatransferenciabancaria,enlaquequitamossaldoaunacuentay
lo aadimos en otra. Si no somos capaces de abonar el dinero en la cuenta de destino, no debemos
quitarlodelacuentadeorigen.
SQL Server funciona por defecto conTransacciones de confirmacin automtica, es decir, cada
instruccinindividualesunatransaccinyseconfirmaautomticamente.
Sobre el ejemplo anterior de la transferencia bancaria, un script debera realizar algo parecido a lo
siguiente:

199

Esta forma de actuar seria errnea, ya que cada instruccin se ejecutara y confirmara de forma
independiente,porloqueunerrordejaralosdatoserrneosenlabasededatos(yeseeselpeorerror
quenospodemosencontrar!)
2.6.1Transaccionesimplcitasyexplicitas
ParaagruparvariassentenciasTransactSQLenunanicatransaccin,disponemosdelossiguientes
mtodos:
Transacciones explcitas. Cada transaccin se inicia explcitamente con la instruccinBEGIN
TRANSACTIONyseterminaexplcitamenteconunainstruccinCOMMIToROLLBACK.

Transacciones implcitas. Se inicia automticamente una nueva transaccin cuando se ejecuta una
instruccinquerealiza modificaciones en los datos, pero cada transaccin se completa
explcitamenteconunainstruccinCOMMIToROLLBACK.
Paraactivardesactivarelmododetransaccionesimplcitasdebemosejecutarlasiguienteinstruccin.

200

Cuando la opcin ANSI_DEFAULTS est establecida en ON, IMPLICIT_TRANSACTIONS tambin se


estableceenON.
Elsiguienteejemplomuestraelscriptanteriorhaciendousodetransaccionesexplicitas.

201

Elsiguienteejemplomuestraelmismoscriptcontransaccionesimplcitas:

202

La transaccin sigue activa hasta que emita una instruccin COMMIT o ROLLBACK. Una vez que la
primera transaccin se ha confirmado o revertido, se inicia automticamente una nueva transaccin la
siguientevezquelaconexinejecutaunainstruccinparamodificardatos.
La conexin contina generando transacciones implcitas hasta que se desactiva el modo de
transaccionesimplcitas.
Podemosverificarelnmerodetransaccionesactivasatravsde@@TRANCOUNT.

203

Otro punto a tener en cuenta cuando trabajamos con transacciones son los bloqueos y el nivel de
aislamiento.
2.6.2Transaccionesanidadas.
Podemos anidar varias transacciones. Cuando anidamos varias transacciones la instruccin COMMIT
afectaralaltimatransaccinabierta,peroROLLBACKafectaratodaslastransaccionesabiertas.
Un hecho a tener en cuenta, es que, si hacemos ROLLBACK de la transaccin superior se desharn
tambinloscambiosdetodaslastransaccionesinternas,aunquehayamosrealizadoCOMMITdeellas.

Unaconsideracinatenerencuantacuandotrabajamoscontransaccionesanidadaseslaposibilidadde
utilizarpuntosdeguardadooSAVEPOINTs.
2.6.3Puntosderecuperacin(SavePoint).
Lospuntosderecuperacin(SavePoints)permitenmanejarlastransaccionesporpasos,pudiendohacer
rollbackshastaunpuntomarcadoporelsavepointynoportodalatransaccin.
Elsiguienteejemplomuestracmotrabajarconpuntosderecuperacin.
204

Caractersticas
LasinstruccionesbsicasdeSQLsoninsertar,consultar,modificar,yeliminar.
Enlastransaccionesexistencuatrocaractersticasbsicas:
Atomicidad:Eslapropiedadqueaseguraquelasoperacionessehanrealizadoono,serealizaelcommit
paraconfirmaroelrollbackparadeshacer
Consistencia:Eslapropiedadqueaseguraquesoloaquelloqueempiezasepuedeacabar,porlotantose
ejecutansololasoperacionesquenovayanaromperlasreglasydirectricesdeintegridadenlabasede
datos
Aislamiento:Eslapropiedadqueaseguraqueunaoperacinnopuedeafectaraotras.Estoaseguraque
la realizacin de dos transacciones sobre la misma informacin sean independientes y no generen
ningntipodeerror
Durabilidad:Eslapropiedadqueaseguraqueunavezrealizadalaoperacinestapersistirynosepodr
deshaceraunquefalleelsistema
BeginTransaction
Insert
Update
205

Delete
IfError
Rollback
Else
Commit

Datosimportantesparatenerencuenta
Las transacciones permiten agrupar pasos fsicos cuando se realizan modificaciones en las bases de
datos.
Enlastransaccionesseconsolidancondosinstruccionesbsicas

COMMIT:Eslaconfirmacindelatransaccinparalamodificacindelosdatosdelabasededatos
ROLLBACK:Eslaqueanulacualquiermodificacinrealizadaalabasededatos.

2.6.4Ejerciciodetransacciones

IngresealServidormedianteelManagamentStudio.

CreeunabasededatosllamadaVentas,dentrodeellaunatablallamadaVentasigualmente,observela
imagenparavermejoreldiseo.
206

Ubqueseenestatablaydeclicenlaopcinde .
Estonosllevaalasiguientepantalla.

Digitamoslasiguienteinstruccin:

Primeroprocedemosaseleccionarlainformacindelatablaventas
ydamosclickenejecutar locualnospermiteverlasiguiente
informacin
207

Luegoejecutamosloscomandosdelatransaccin.
Empezamosporejecutar ynosmuestralasiguienteinformacin.

Luegoejecutamoselupdate.

Como podemos ver tenemos 1 fila afectada si deseamos confirmar la operacin seleccionamos la
instruccinCOMMIT,yejecutamoslainstruccin.

Sinodeseamosrealizarelcambio
DebemosseleccionarlainstruccinROLLBACKyejecutarla.
208

Loquerevierteloscambiosrealizados.
2.7FUNCIONESENTRANSACTSQL
Una funcin definida por el usuario es una rutina de TransactSQL que acepta parmetros, realiza una
accin,comounclculocomplejo,ydevuelveelresultadodeesaaccincomounvalor.Elvalordevuelto
puedeser unvalorescalar(nico)ounatabla.Utiliceestainstruccinparacrearunarutinareutilizable
quesepuedautilizardeestasformas:
EninstruccionesTransactSQLcomoSELECT
Enlasaplicacionesquellamanalafuncin
Enladefinicindeotrafuncindefinidaporelusuario
Paraparametrizarunavistaomejorarlafuncionalidaddeunavistaindizada
Paradefinirunacolumnaenunatabla
ParadefinirunarestriccinCHECKenunacolumna
Parareemplazarunprocedimientoalmacenado.
EnestaGuaseexplicarancomocrearlassiguientesfuncionesenSQLServer,pararealizarlafuncinen
la consola de SQL Server, se selecciona en la parte superior izquierda la opcin NUEVO QUERY, como
ejemplolabasededatosmasterquevienepordefectoconSQLserver2010paratrabajarlos3tiposde
funciones:
FuncionesEscalares
Funcionesconvaloresdetablasdevariasinstrucciones
Funcionesconvaloresdetablaenlnea
2.7.1FuncinEscalar
Esta funcin permite devolver un solo valor, son parecidas a las funciones que se utilizan dentro de los
lenguajesdeprogramacinseutilizanparaclculosbsicosmatemticosyaquedevuelvenunsolovalor
esdecirunescalar.Lafuncinseconformadelasiguienteforma:
Cr eat e Funct i on Nombr e de l a Funci n ( @par amet r os r eci bi dos t i po de
par met r o)
Ret ur ns Ti po de r et or no
209

as
Begi n
Decl ar e var i abl es que necesi t amos t i po de var i abl e
Sent enci as a ej ecut ar con l as var i abl es y l os par met r os que
r eci bi mos
Ret ur n var i abl e que r et or namos
end

Paraquelafuncionseaalmacenadaenlabasededatosseseleccionaysedaclickenejecutar.

Parallamarlafuncinyserejecutadaseconstruyeunqueryconlasiguientesintaxis:
Selectdbo.NombreFuncion(ValorParametro)asNombreColumnaAMostrarFromTabla

Para ejecutar el Query se selecciona y se da click en ejecutar y en la parte inferior se muestran los
resultados.
210

Acontinuacionsehaceotrapruebaparaverificarelcorrectofuncionamientodelafuncion.

2.7.2Funcionesconvaloresdetabladevariasinstrucciones
Esunhibridoentrevistayprocedimientoalmacenado,yaquesonconsultasconunainstruccinselect
perorecibenparmetroscosaquenopuedehacerlavistanielparmetroalmacenado,elprocedimiento
puede encapsular insert, update o un conjunto de instrucciones SQL por lo que la funcin es ms
eficiente de efectuar consultas con parmetros y es la herramienta que se debe preferir para hacer
sentenciasdeestetipo.Lafuncinseconformadelasiguienteforma:

Cr eat e Funct i on Nombr e de l a Funci n ( @par amet r os r eci bi dos t i po de


par met r o)
Ret ur n @var i abl e t abl e( Campos de l a t abl a que de va a r eci bi r )
As
Begi n
I nser t @var i abl e sel ect campos_t abl a f r omt abl a wher e
campo_val i daci on=@par amet r os r eci bi dos
Ret ur n
End
211

Paraquelafuncionseaalmacenadaenlabasededatosseseleccionaysedaclickenejecutar.
Parallamarlafuncinyserejecutadaseconstruyeunqueryconlasiguientesintaxis:
Select*fromnombre_funcion(parametro)

Para ser ejecutar el Query se selecciona y se da click en ejecutar y en la parte inferior se muestran los
resultados.
2.7.3Funcionesconvaloresdetablaenlinea
Sonigualesqueunafuncinconvaloresdetabladevariasinstruccionessoloquesuconstruccinesalgo
diferentepuesnosedefinenvariablesdetipoTableynoesnecesarioutilizarlaspalabrasBeginyEnd.
Lafuncinseconformaas:
CreatefunctionNombre_funcion(@parametrosrecibidostipodeparmetro)
Returnstable
As
Return(selectcampos_tablafromtablawherecampo_validacion=@parametrosrecibidos)
212

Paraquelafuncionseaalmacenadaenlabasededatosseseleccionaysedaclickenejecutar.
Parallamarlafuncinyserejecutadaseconstruyeunqueryconlasiguientesintaxis:
Select*fromnombre_funcion(parametro)

Para ser ejecutar el Query se selecciona y se da click en ejecutar y en la parte inferior se muestran los
resultados.
Hacertodoelcapitulodefunciones

213

2.8CURSORESENTRANSACTSQL
Puntero que recorre fila a fila un conjunto de resultados obtenidos a partir de una consulta TSQL
(sentencia SELECT), permite modificar y realizar operaciones con este conjunto de resultados. Son
utilizadosprincipalmenteenprocedimientosalmacenados,desencadenadoresyScriptsdeTransactSQL
a fin de poner el contenido de un conjunto de resultados a disposicin de otras instrucciones de
TransactSQL.

Consistededospartes:

Conjunto de resultados del cursor: el conjunto (tabla) de filas resultado de la ejecucin del query
queseasocialcursor.
Posicindelcursor:Unpunteroaunafiladentrodelconjuntoderesultados.
La posicin del cursor indica la fila actual del cursor.Se puede modificar o eliminar esa fila usando las
sentenciasupdateodelete.EstassentenciasnoutilizanunaclusulaWHEREnormal(conpredicadosde
condicin).Encambio,elcursoridentificalafila,paralocualdebeserabiertoyposicionadoenlamisma
utilizandolasentenciaFETCH.
El comando FETCH permite cambiar la posicin actual del cursor, moviendo su posicin una o ms filas
enelconjuntoderesultadosdelcursor.

2.8.1VentajasdelosCursores

Amplanelprocesamientodelosresultadosporque:

Permitensituarseenfilasespecficasdelconjuntoderesultados.
Recuperanunafilaobloquedefilasdelaposicinactualenelconjuntoderesultados.
Aceptan modificaciones de los datos de las filas en la posicin actual del conjunto de
resultados
Aceptan diferentes grados de visibilidad para los cambios que realizan otros usuarios en la
informacindelabasededatosquesepresentaenelconjuntoderesultados.
Proporcionan instrucciones de TransactSQL en secuencias de comandos, procedimientos
almacenadosyaccesodedesencadenadoresalosdatosdeunconjuntoderesultados.

2.8.2EstructuradeunCursor

Enelsiguientediagramadeflujosepresentalasecuencialgicaquesigueladeclaracinyejecucinde
uncursor.

214

Declare Cursor. Los cursores se declaran utilizando la instruccin DECLARE CURSOR definiendo sus
atributos, su comportamiento de desplazamiento y la consulta utilizada para generar el conjunto de
resultadossobreelqueoperaelcursor.

DeclareCursoraceptatantolasintaxisbasadaenelestndarISOcomolasintaxisqueutilizaunconjunto
deextensionesdeTransactSQL.

SintaxisEstndarISO

Argumentos:

INSENSITIVE:Defineuncursorquehaceunacopiatemporaldelosdatosqueutiliza.Todaslassolicitudes
que se realizan al cursor se responden desde esta tabla temporal detempdb; por tanto, las
modificacionesrealizadasenlastablasbasenosereflejanenlosdatosdevueltosporlasoperacionesde
capturarealizadasenelcursoryademsestecursornoadmitemodificaciones.

215

SCROLL: Especifica que estn disponibles todas las opciones de captura (FIRST, LAST, PRIOR, NEXT,
RELATIVE, ABSOLUTE). Si no se especifica SCROLL en una instruccin DECLARE CURSOR de ISO, la nica
opcindecapturaqueseadmiteesNEXT.

Ejemplo:

SintaxisExtendidaTransactSQL.

Conjuntos de Argumentos Asignados a un Cursor. Para declarar un cursor se pueden agregar


argumentos que determinan su funcionamiento, como lo es recurrir a tablas temporales, recorrer de
diferentes formas un conjunto de resultados, la aceptacin o no de realizar sentencias UPDATE o
DELETE.Acontinuacinsemuestranestosargumentos.

DeclaracindelosArgumentosGlobalyLocal

Local.Especficaqueelmbitodelcursoreslocalparaelprocesoporlotes,procedimientoalmacenadoo
desencadenadorenquesecreelcursor.

Ejemplo:

Global. Especifica que el mbito del cursor es global para la conexin. Puede hacerse referencia al
nombre del cursor en cualquier procedimiento almacenado o proceso por lotes que se ejecute en la
conexin.

216

Ejemplo:

SinoseespecificaGLOBALniLOCAL,elvalorpredeterminadosecontrolamediantelaconfiguracinde
laopcindebasededatosdefaulttolocalcursor.

DeclaracindelosArgumentosFORWARD_ONLYySCROLL
FORWARD_ONLY.Especificaque elcursorslosepuededesplazardelaprimeraalaltimafila.FETCH
NEXTeslanicaopcinderecuperacinadmitida.

Ejemplo:

SCROLL.Especficaqueestndisponiblestodaslasopcionesderecuperacin(FIRST,LAST,PRIOR,NEXT,
RELATIVE, ABSOLUTE). Si no se especifica SCROLL en una instruccin DECLARE CURSORla nica opcin
derecuperacinqueseadmiteesNEXT.

Ejemplo:

217

DeclaracindelosArgumentosSTATIC,KEYSET,DYNAMICyFAST_FORWARD

STATIC.Defineuncursorquehaceunacopiatemporaldelosdatosquevaautilizar.Todaslassolicitudes
queserealizanalcursorserespondendesdelatablatemporaldetempdb;portanto,lasmodificaciones
realizadas en las tablas base no se reflejan en los datos devueltos por las operaciones de recuperacin
realizadosenelcursorynoadmitemodificaciones.

Ejemplo:

KEYSET.Especificaquelapertenenciayelordendelasfilasdelcursorsefijancuandoseabreelcursor.
Elconjuntodeclavesqueidentificalasfilasdeformanicaestintegradoenlatabladenominadakeyset
detempdb.

Ejemplo:

DYNAMIC. Define un cursor que, al desplazarse por l, refleja en su conjunto de resultados todos los
cambiosrealizadosenlosdatosdelasfilas.Losvaloresdelosdatos,elordenylapertenenciadelasfilas
puedencambiarencadaoperacinderecuperacin.

Ejemplo:

FAST_FORWARD. Especifica un cursor FORWARD_ONLY, READ_ONLY con las optimizaciones de


rendimiento habilitadas. No se puede especificar FAST_FORWARD si se especifica tambin SCROLL o
FOR_UPDATE.

Ejemplo:

218

DeclaraciondelosArgumentosREAD_ONLY,SCROLL_LOCKS,OIPTIMISTICyTYPE_WARNING

READ_ONLY. Evita que se efecten actualizaciones a travs de este cursor. No es posible hacer
referencia al cursor en una clusula WHERE CURRENT OF de una instruccin UPDATE o DELETE. Esta
opcinreemplazalacapacidaddeactualizarelcursor.

Ejemplo:

SCROLL_LOCKS. Especfica que se garantiza que las actualizaciones o eliminaciones posicionadas


realizadas a travs del cursor sern correctas. No es posible especificar SCROLL_LOCKS si se especifica
tambinFAST_FORWARDoSTATIC.

Ejemplo:

OPTIMISTIC. Especfica que las actualizaciones o eliminaciones posicionadas realizadas a travs del
cursor no serealizarn correctamente si la fila se ha actualizado despus de ser leda en el cursor. Si la
fila se ha modificado, el intento de actualizacin o eliminacin posicionada genera un error. No es
posibleespecificarOPTIMISTICsiseespecificatambinFAST_FORWARD.

Ejemplo:

TYPE_WARNING. Especfica que se enva un mensaje de advertencia al cliente si el cursor se convierte


implcitamentedeltiposolicitadoaotro.

Ejemplo:

219

CompatibilidadentreArgumentos

Se puede especificar mltiples parmetros en la apertura de cursor, peronicamente unparmetro de


cadagrupo.Porejemplo:

Se compara la compatibilidad de todos los cursores, para as crearlos con cada uno de los argumentos
vistosantes:

OPENCURSOR

AbreuncursorylollenaejecutandolainstruccinTransactSQLespecificadaenlainstruccinDECLARE
CURSORoSETcursor_variable.

Sintaxis:

Argumentos:

GLOBAL:Especificaquecursor_namehacereferenciaauncursorglobal.
cursor_name: Es el nombre de un cursor declarado. Si existe un cursor global y uno local con el
nombrecursor_name,cursor_namehacereferenciaalcursorglobalsiseespecificaGLOBAL;encaso
contrario,cursor_namehacereferenciaalcursorlocal.
cursor_variable_name:Eselnombredelavariablecursorquehacereferenciaauncursor.

Ejemplo:Abreuncursorybuscatodassusfilas.
220

RecuperacindeFilasconFETCH

FETCH

Recuperaunafilaespecficadeuncursor.

Sintaxis:

Parmetros:

NEXT:Devuelvelafiladeresultadosinmediatamenteposterioralafilaactualyaumentalafilaactual
a la fila devuelta. Si FETCH NEXT es la primera operacin de captura en un cursor, se devuelve la
primera fila del conjunto de resultados. NEXT es la opcin predeterminada para la captura de
cursores.
PRIOR:Devuelvelafiladeresultadosinmediatamenteanterioralafilaactual,yreducelafilaactuala
la fila devuelta. Si FETCH PRIOR es la primera operacin de captura en un cursor, no se devuelve
ningunafilayelcursorquedaposicionadodelantedelaprimerafila.
FIRST:Devuelvelaprimerafiladelcursorylaconvierteenlafilaactual.
LAST:Devuelvelaltimafiladelcursorylaconvierteenlafilaactual.
221

ABSOLUTE{n|@nvar}:Sino@nvarespositivo,sedevuelvelafilandesdeelprincipiodelcursory
la fila devuelta se convierte en la nueva fila actual. Sino @nvares negativo, se devuelve la
filananterioralfinaldelcursorylafiladevueltaseconvierteenlanuevafilaactual.Sino@nvares
0,nosedevuelvenfilas.ndebeserunaconstanteenteray@nvardebesersmallint,tinyintoint.
RELATIVE{n|@nvar}:Sino@nvarespositivo,sedevuelvelafilanposterioralafilaactualylafila
devueltaseconvierteenlanuevafilaactual.Sino@nvaresnegativo,sedevuelvelafilananteriora
lafilaactualylafiladevueltaseconvierteenlanuevafilaactual.Sino@nvares0,sedevuelvelafila
actual.SiseespecificaFETCHRELATIVEconno@nvarseestableceenunnmeronegativooen0en
la primera operacin de captura que se realiza en un cursor, no se devuelven filas.ndebe ser una
constanteenteray@nvardebesersmallint,tinyintoint.

CLOSE. Cierra un cursor abierto mediante la liberacin del conjunto de resultados actual y todos los
bloqueosdecursormantenidosenlasfilasenlasqueestcolocado.CLOSEdejalasestructurasdedatos
accesibles para que se puedan volver a abrir, pero las capturas y las actualizaciones posicionadas no se
permitenhastaquesevuelvaaabrirelcursor.CLOSEdebeejecutarseenuncursorabierto,porloqueno
sepermiteencursoresquesloestndeclaradosoqueyaestncerrados.

Sintaxis:

Argumentos:

GLOBAL:Especificaquecursor_namehacereferenciaauncursorglobal.
cursor_name:Eselnombredeuncursorabierto.Sihayuncursorglobalyotrolocalconel
nombrecursor_name,cursor_namehacereferenciaalcursorglobalsiseespecificaGLOBAL;delo
contrario,cursor_namehacereferenciaalcursorlocal.
cursor_variable_name:Eselnombredeunavariabledecursorasociadaauncursorabierto.

DEALLOCATE.Quitaunareferenciaauncursor.Cuandosehadesasignadolaltimareferenciaalcursor,
MicrosoftSQLServerliberalasestructurasdedatosquecomponenelcursor.

Sintaxis

Argumentos:

cursor_name: Es el nombre de un cursor ya declarado. Si hay un cursor global y otro local con el
nombrecursor_name,cursor_namehace referencia al cursor global si se especifica GLOBAL y, si no
seespecificaGLOBAL,hacereferenciaalcursorlocal.
@cursor_variable_name:Nombredeunavariablecursor.Debeserdetipocursor.

222

VariablesGlobales@@CURSOR_ROWS,@@FETCH_STATUSylafuncinCURSOR_STATUS

@@CURSOR_ROWS.Devuelveelnmerodefilascorrespondientesactualmentealltimocursorabierto
enlaconexin.Puedellamara@@CURSOR_ROWSparadeterminarqueelnmerodefilasquecumplan
lascondicionesdelcursorserecuperenenelmomentoenquesellamaa@@CURSOR_ROWS.

Ejemplo

EnesteejemplosedeclarauncursoryseutilizaSELECTparamostrarelvalorde@@CURSOR_ROWS.La
opcintieneelvalor0antesdeabrirelcursor;elvalor1indicaqueelconjuntodeclavesdelcursorse
estllenandodeformaasincrnica.

Valordevuelto Descripcin
m Elcursorserellenadeformaasincrnica.Elvalordevuelto(m)eselnmerode
filasquecontieneactualmenteelconjuntodeclaves.
1 Elcursoresdinmico.Comoloscursoresdinmicosreflejantodosloscambios,el
nmerodefilascorrespondientesalcursorcambiaconstantemente.Nuncase
puedeafirmarquesehanrecuperadotodaslasfilasquecorrespondan.
0 Nosehanabiertocursores,nohayfilascalificadasparaelltimocursorabierto,
ostesehacerradoosuasignacinsehacancelado.
n Elcursorestcompletamenterelleno.Elvalordevuelto(n)eselnmerototalde
filasdelcursor.
223

@@FETCH_STATUS. Devuelve el estado de la ltima instruccin FETCH de cursor ejecutada sobre


cualquiercursorquelaconexinhayaabierto.

Valordevuelto Descripcin
0 LainstruccinFETCHseejecutcorrectamente.
1 LainstruccinFETCHnoseejecutcorrectamenteolafilaestaba
msalldelconjuntoderesultados.
2 Faltalafilacapturada.

Por ejemplo, supongamos que un usuario ejecuta una instruccin FETCH sobre un cursor y a
continuacin llama a un procedimiento almacenado que abre y procesa los resultados de otro cursor.
Cuando vuelve el control desde el procedimiento almacenado llamado, @@FETCH_STATUS reflejar la
ltimainstruccinFETCHejecutadaenelprocedimientoalmacenado,nolaejecutadaantesdellamaral
procedimiento.

Ejemplos

Esteejemploutiliza@@FETCH_STATUSparacontrolarlasactividadesdelcursorenunbucleWHILE.

CURSOR_STATUS. Una funcin escalar que permite al que llama a un procedimiento almacenado
determinar si el procedimiento ha devuelto un cursor y el conjunto de resultados de un determinado
parmetro.

Sintaxis:

CURSOR_STATUS(
{'local','cursor_name'}
{'global','cursor_name'}
{'variable','cursor_variable'})

224

Argumentos

'local':Especificaunaconstantequeindicaqueelorigendelcursoresunnombrelocaldecursor.
'cursor_name': Es el nombre del cursor. Un nombre de cursor debe ajustarse a las reglas para los
identificadores.
'global':Especificaunaconstantequeindicaqueelorigendelcursoresunnombreglobaldecursor.
'variable':Especificaunaconstantequeindicaqueelorigendelcursoresunavariablelocal.
'cursor_variable':Es el nombre de la variable de cursor. Una variable de cursor debe definirse
medianteeltipodedatoscursor.

Valor
devuelto
Nombredecursor Variabledecursor
1 Elconjuntoderesultadosdelcursortieneal
menosunafila.
Para los cursores INSENSITIVE y de
conjunto de claves, el conjunto de
resultadostienealmenosunafila.
Paraloscursoresdinmicos,elconjuntode
resultados puede tener cero, una o ms
filas.
Elcursorasignadoaestavariableestabierto.

ParaloscursoresINSENSITIVEydeconjuntode
claves, el conjunto de resultados tiene al
menosunafila.
Para los cursores dinmicos, el conjunto de
resultadospuedetenercero,unaomsfilas.
0 El conjunto de resultados del cursor est
vaco.*
El cursor asignado a esta variable est abierto,
pero el conjunto de resultados est
definitivamentevaco.*
1 Elcursorestcerrado. Elcursorasignadoaestavariableestcerrado.
2 Noaplicable. Puedeser:
Elprocedimientollamadoanteriormentenoha
asignado ningn cursor a esta variable
OUTPUT.
El procedimiento llamado anteriormente
asign un cursor a esta variable OUTPUT, pero
seencontrabaenunestadocerradoalterminar
el procedimiento. Por tanto, se cancela la
asignacin del cursor y no se devuelve al
procedimientoquehacelallamada.
No hay ningn cursor asignado a una variable
declaradadecursor.
3 No existe ningn cursor con el nombre
indicado.
Noexisteunavariabledecursorconelnombre
indicado o, si existe, no tiene todava ningn
cursorasignado.
*Loscursoresdinmicosnodevuelvennuncaesteresultado.
225

DeclaracinCursorForUpdate

ParaactualizarlosdatosdeuncursordebemosespecificarFORUPDATEdespusdelasentenciaSELECT
enladeclaracindelcursor,yWHERECURRENTOF<nombre_cursor>enlasentenciaUPDATE.

Ejemplo:

Declaracindevariablesparaelcursor

Declaracindelcursor

Aperturadelcursor

Lecturadelaprimerafiladelcursor

Lecturadelasiguientefiladelcursor

226

Cierredelcursor

Liberarlosrecursos

2.8.3AsignacinyAsociacindeCursores

LainstruccinDECLARECURSORasignayasociauncursoraunnombredecursor.


Unavariabledecursorsepuedeasociarauncursormedianteunodeestosdosmtodos:
A) PornombreconunainstruccinSETqueasociauncursoraunavariabledecursor.

B) Tambin se puede crear y asociar un cursor a una variable sin necesidad de definir un nombre de
cursor.

1.15.6ProcedimientosAlmacenadosyCursores

Losprocedimientosalmacenadosresultantilesparalamanipulacinde cursores,dadoquesepueden
crear y eliminar cada vez que sea llamado un procedimiento almacenado, adems facilitan la tarea de
realizaroperacionesqueconllevaranmayortiempoparasersolucionadas.

Se puede crear un procedimiento almacenado para que cree un cursor o se podra utilizar para que
realicecualquieroperacin,enestecasosemuestralautilizacindeunprocedimientoalmacenadopara
querealicelasumadetodoslosIDsdeunatabla,quesontradosapartirdeuncursor.

227

Ejemplo:

CREATEPROCEDURESUMA
@SUMAINTOUTPUT
AS
BEGIN
SET@SUMA=0
DECLARE@IDINT

DECLARECURSOR_SUMACURSORLOCALFOR
SELECTIDFROMPECES

OPENCURSOR_SUMA
FETCHNEXTFROMCURSOR_SUMA
INTO@ID

WHILE(@@FETCH_STATUS=0)
BEGIN
SET@SUMA=@SUMA+@ID
FETCHNEXTFROMCURSOR_SUMA
INTO@ID
END

CLOSECURSOR_SUMA
DEALLOCATECURSOR_SUMA

END
aquieslatransaccionquellamaalprocedimientoyretornaunvalor.
DECLARE@SUMAINT
EXECUTESUMA@SUMAOUTPUT
SELECT@SUMA

2.9SQLDINMICOENTRANSACTSQL

Eneldesarrollodesoftwarecuandosedeseacrearunaaplicacincompletaparaelmanejodeunabase
de datos relacional, se hace necesaria la implementacin de una herramienta que soporte la capacidad
de consulta en SQL y la adaptabilidad a situaciones diversas con facilidad de los lenguajes de
programacin tradicionales. Transact SQLes el lenguaje de programacin que proporciona SQL Server
paraextenderelSQLestndarconotrotipodeinstrucciones.
Transact SQL permite dos formas de ejecutar SQL dinmico (construir sentencias SQL dinmicamente
paraejecutarlasenlabasededatos):
228

LainstruccinEXECUTEosimplementeEXEC
Elprocedimientoalmacenadosp_executesql
INSTRUCCIN EXECUTE: permite ejecutar una cadena de caracteres de tipo nvarchar que representa
unasentenciaSQL.
ElsiguienteejemplomuestracomoejecutarunacadenadecaracteresconlainstruccinEXEC.

Alejecutarlasentenciaelresultadoeselsiguientesegnlosdatosdelejemplo:

Tambin conSQL dinmico podemos ejecutar sentencias de tipo DDL (Data Definition Languaje), como
CREATETABLE,DROP,ALTER.Acontinuacinsepresentaunejemplo.
229

Alejecutarlasinstruccioneselresultadoobtenidoeselsiguiente:

2.9.1ProcedimientoAlmacenadoSP_EXECUTESQL

Paraejecutarsqldinmico,serecomiendautilizarelprocedimientoalmacenadosp_executesql,enlugar
deunainstruccinEXECUTE.
sp_executesqladmitelasustitucindeparmetros
sp_executesqlesmsseguroyverstilqueEXECUTE
sp_executesqlgeneraplanesdeejecucinconmsprobabilidadesdequeSQLServerlosvuelva
autilizar,esmseficazqueEXECUTE.
230

Enelsiguienteejemplosemuestraeluso(muysimple)desp_executesql.

Alejecutarlasentenciaelresultadoeselsiguientesegnlosdatosdelejemplo:

sp_executesqladmitelasustitucindevaloresdeparmetrosparacualquierparmetroespecificadoen
la cadena TransactSQL a ejecutar. El siguiente ejemplo muestra el uso de sp_executesql con
parmetros:

Alejecutarlasentenciaelresultadoeselsiguientesegnlosdatosdelejemplo:

231

2.10CERTIFICADOSDIGITALES

Muybreveresumendelahistoriadelacriptografa

Enlahistoriadesdehacemilesdeaosqueelhombretratadeocultarsusmensajesyescritosdeojosa
los cuales no desea mostrar su contenido, y para esto encripta estos textos utilizando, en un principio,
mtodos sencillos que incluan el uso de lpiz, papel o alguna mquina sencilla. Luego, a principios del
siglo XX, comenz a utilizar mquinas mecnicas y electromecnicas, como la conocida mquina de
rotores llamada Enigma, la cual fue utilizada por las fuerzas Alemanas desde 1930, proporcionando
mtodosdecifradomscomplejosyeficientes.

LacriptografamodernacomenzcuandoClaudeShannonpublicelartculoCommunicationTheoryof
Secrecy Systems en la Bell System Technical Journal en 1949, y poco tiempo despus, junto a Warren
Weaver,publicaronellibroMathematicalTheoryofCommunication.Estosdocumentos,juntosconotros
publicados posteriormente, formaron las bases de la teora de la criptografa, aunque fueron
organizacionesgubernamentalessecretas(comolaNSA)lasquesiguieronconlainvestigacin.Recina
mediados de los 70 hubieron grandes avances a nivel pblico: la creacin del estndar de cifrado DES
(DataEncryptionStandard)ylacreacindelacriptografaasimtrica.

Mtodos De Cifrado. Los mtodos de cifrado de la criptografa moderna se dividen, a gran escala, en
dos:cifradodeflujoycifradodebloques,ysteltimoasuvezsedivideencifradosimtrico(conclave
secreta)ycifradoasimtrico(conclavepblica).

232

Cifrado de flujo. Los algoritmos de cifrado de flujo pueden realizar el cifrado incrementalmente,
transformando el mensaje original en un mensaje cifrado bit a bit. Esto lo logra construyendo un
generadordeflujodeclave,elcualesunasecuenciadebitsdetamaoarbitrarioquepuedeemplearse
para oscurecer el contenido del flujo de datos combinando el flujo de clave con el flujo de datos
mediantelafuncinXOR.Sielflujodeclaveesseguro,elflujodedatoscifradostambinloser.

Estemtodoesutilizadoenalgunasaplicacionescomoelcifradodeconversacionestelefnicas,dondeel
cifrado en bloques es inapropiado porque los flujos de datos se producen en tiempo real en pequeos
fragmentos y las muestras de datos pueden ser muy pequeas (hasta de 1 bit), y sera un desperdicio
rellenarelrestodelosbitsantesdecifrarelmensajeytransmitirlo.

Cifradoporbloques.Enestetipodecifradoelmensajeseagrupaenbloques,porlogeneralde128bits
oms,antesdeaplicarelalgoritmodecifradoacadapartedeformaindependienteutilizandolamisma
clave.

Cifrado simtrico. La criptografa simtrica es el mtodo criptogrfico que usa una misma clave para
cifrarydescifrarlosmensajes.Lasdospartesquesecomunicandebenponersedeacuerdodeantemano
sobre la clave a utilizar y, una vez que ambas tienen acceso a esta clave, el remitente cifra el mensaje
utilizndola,loenvaaldestinatario,ystelodescifraconlamismaclave.

Existenalgunosalgoritmosmuyconocidos,comoelDES(DataEncryptionStandard),elcualfueundiseo
deunidaddecifradoporbloquesdegraninfluenciadesarrolladoporIBMypublicadocomoestndaren
1977.

CifradoasimtricoElcifradoasimtricoeselmtodocriptogrficoqueusaunpardeclavesparaelenvo
de mensajes. Una de estas claves es pblica y se puede entregar a cualquier persona, la otra clave es
privada y el propietario debe guardarla de modo que nadie tenga acceso a ella. Los mtodos
criptogrficos garantizan que ese par de claves slo se puede generar una vez, de modo que se puede
asumirquenoesposiblequedospersonashayanobtenidocasualmenteelmismopardeclaves.

Sielremitenteusalaclavepblicadeldestinatarioparacifrarelmensaje,unavezcifrado,slolaclave
privada del destinatario podr descifrar este mensaje, ya que es el nico que la posee. Por lo tanto se
logralaconfidencialidaddelenvodelmensaje,nadiesalvoeldestinatariopuededescifrarlo,nisiquiera
lamismapersonaquegenerelmensaje.

Sielpropietariodelpardeclavesutilizasuclaveprivadaparacifrarelmensaje,cualquieraqueposeasu
clavepblicapodrdescifrarlo.Enestecasoseconsiguetantolaidentificacincomolaautenticacindel
remitente,yaquesesabequeslopudohabersidolquienutilizsuclaveprivada(salvoalguiensela
hubiese podido robar). Esta idea es el fundamento de la firma electrnica, de la cual hablamos ms
abajo.

Lossistemasdecifradodeclavepblicaosistemasdecifradoasimtricossecrearonconelfindeevitar
elproblemadelintercambiodeclavesqueposeeelsistemadecifradosimtrico.Conlasclavespblicas
noesnecesarioqueelremitenteyeldestinatariosepongandeacuerdoenlaclaveaemplear.Todolo
que se requiere es que, antes de iniciar la comunicacin secreta, el remitente consiga una copia de la
233

clavepblicadeldestinatario.Esms,esamismaclavepblicapuedeserusadaporcualquieraquedesee
comunicarseconsupropietario.

Cabemencionarqueaunqueunapersonalograraobtenerlaclavepblica,nopodradescifrarelmensaje
encriptado con esta misma clave, slo podra encriptar mensajes que podran ser ledos por el
propietariodelaclaveprivada.

CertificadoDigital

UnCertificadoDigitalesundocumentodigitalmedianteelcualunterceroconfiable(llamadoautoridad
decertificacinoCA)garantizalavinculacinentrelaidentidaddeunsujetooentidadysuclavepblica.
Estedocumentocontiene,entreotrosdatos,elnombredelusuarioysuclavepblica.

Los certificados digitales tienen distintos usos dependiendo de la finalidad para la cual se lo est
utilizando,porejemplo:

Uncertificadodigitalestablecelaidentidaddeunusuarioenunared
Los servidores pueden configurarse para permitir el acceso a usuarios con ciertos certificados o
asignarlelaidentidaddeunusuariodeldominiosegnsucertificado
Losclientespuedenserconfiguradosparaconfiarenservidoresquepresentanciertoscertificados,
porejemplo,losquevienenpreconfiguradosenlosnavegadoresparautilizarseensesionesSSL.
Loscertificadospuedenutilizarseparafirmadocumentoselectrnicos.

234

Unadelascertificacionesmsusadasyunestndarenlaactualidadeninfraestructurasdeclavepblica
PKIs(PublicKeyInfrastructure)esX.509ensuversin3.

Certificado digital X.509. X.509 es un estndar publicado oficialmente en 1988 que especifica, entre
otrascosas,formatosestndarespara certificadosdeclavespblicasyunalgoritmodevalidacindela
rutadecertificacin.

EnX.509sedefineunacapadeabstraccinparasuministrarserviciosdeautenticacinalosusuariosde
undirectorioX.500.

En la actualidad es ampliamente utilizado el formato de certificado digital X.509 v3, por ejemplo, para
realizarconexionessegurasaservidoreswebatravsdeSSL(SecureSocketsLayer).

Este tipo de certificados posee un formato donde guarda distintos datos, por ejemplo, un nmero de
serie,laclavepblicadelusuario,lasfechasdevalidezdelcertificado,elnombredelusuario(enformato
X.500),etc.

Acontinuacinmuestrounejemplodeuncertificadodigital:

NmerodeSerie: 21479
VersinX.509: v3
Titular: CN=GustavoCantero,E=g.cantero@scientia.com.ar,OU=Personanoverificada
NoamparadobajoelDecreto427/98delaIFDAPN,O=PolticadeCertificacinde
CorreoElectrnico
Emisor: CN=ACdelaSubsecretaradelaGestinPblicaparaCertificadosdeCorreo
Electrnico,OU=PolticadeCertificacinenhttp://ca.sgp.gov.ar,OU=No
amparadoporelDecreto427/98IFDAPN,OU=SubsecretaradelaGestin
235

Pblica,O=JefaturadeGabinetedeMinistros,L=CiudaddeBuenosAires,C=AR
Validez(noantesde): mi03jun2009 19:14:35,ART
(nodespusde): jue03jun2010 19:14:35,ART
Algoritmodefirma: sha1WithRSAEncryption
ClavePblica: E0EE9902030130818902818100E5AEA6F0745EDA39A2CF7270C2CC9C
E7D6014F51BF7A8388514B07B4BC2D93C422AEC0202697743C14D54B
51E45F5C434A03F66F5C4045CC95E27E6C9CF5F62D996B6D7CECC786
ED61D89B47EDB46D3B19190D86E8C2FD893E01F2850AB7AE58069A60
92116AA2374CB04EEE290340C0CC84F4CE6432F3F035D7E77B790001
Huelladigital(MD5): C68C853864543D7C222F9176B8D7479C
Huelladigital(SHA1): 4AFC0115CC500CFDB0D8B56468F5F24EE47BBCFA
2.10.1FirmaDigital
La firma digital hace referencia a un mtodo criptogrfico que asocia la identidad de una entidad (una
personaounequipoinformtico)aunmensajeodocumento,pudiendoadems,asegurarlaintegridad
deldocumentoomensaje.

Para realizar esto se calcula el hash del documento, se encripta el resultado con la clave privada del
certificadodelusuario,yseadjuntaaldocumentojuntoconelcertificado(perosinlaclaveprivada,slo
conlapblica).

236

Luego, para verificar la firma del documento, se lo abre, se valida el certificado adjunto (se verifica la
fechadevalidez,silaentidademisoraesdeconfianza,etc.),seobtienelafirma(elhashencriptado),se
lodesencriptaconlaclavepblica,secalculaelhashdeldocumento(sinlafirma)yseverificaqueambos
hash,eldesencriptadoyelcalculado,seaniguales.

2.10.2UtilizarCertificadosDigitalesDesde.NET

Consultar los repositorios de certificados. Como primer paso vamos a recorrer los certificados que
tenemosinstaladosennuestramquina.ParaestodebemosutilizarlaclaseX509Store,lacualnosdala
posibilidad de consultar un repositorio de certificados, por ejemplo, el repositorio raz (Root), el
repositorio donde estn los certificados de las autoridades certificantes (CertificateAuthority), o el
repostorio personal (My). Tambin tenemos que elegir la ubicacin del certificado, es decir, si vamos a
quererconsultarloscertificadosqueestnaniveldemquinaodeusuario.Tenganencuentaquesivan
autilizarlaclaseX509StoredesdeASP.NETdebenleerloscertificadosqueestnaniveldemquina,ya
queelusuarioASP.NETraravezvaateneralgncertificadoinstalado.

LuegodeelegidoelrepositorioquequeremosabrirdebemosutilizarelmtodoOpenparaqueconsulte
almismo.

237

Una vez abierto el repositorio, la propiedad Certificates contendr una coleccin (basada en la clase
X509Certificate2Collection)deloscertificadosalmacenados.

DespusdeutilizarelrepositorionohayqueolvidardecerrarelmismoconmtodoClose.

Acontinuacinmuestrocmoabrirelrepositoriopersonalyescribirenlaconsoladedebuglosnombres
yfirmasdigitales(hash)decadacertificado:

Creunnuevoproyectowebtalycomosemuestraenlaimagen(Unaaplicacindeconsola).

Ingreseelsiguientecdigo:

238

Aquestparamayorfacilidad,noolvidenporfavorquenobastaconsolocopiarsinotambinanalizar
queescadalneadecdigo.

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;

usingSystem.Security.Cryptography;
usingSystem.Security.Cryptography.X509Certificates;
usingSystem.Diagnostics;

namespaceCertDigitales
{
classProgram
{
staticvoidMain(string[]args)
{
X509StoreobjStore=newX509Store(StoreName.Root,StoreLocation.CurrentUser);
objStore.Open(OpenFlags.ReadOnly);
foreach(X509Certificate2objCertinobjStore.Certificates)
Console.WriteLine(objCert.SubjectName.Name+":"+objCert.Thumbprint);
objStore.Close();
Console.ReadKey();
}
}
}

Ejecute la aplicacin con F5 y observe los resultados. Se lista por consola el repositorio de certificados
digitalesquehayenelcomputador.

239

2.10.3Consultarlainformacindelcertificadoysusextensiones

Cada certificado posee una serie de datos. Adems de estos datos los certificados poseen extensiones,
que definen distintos posibles usos dependiendo de las mismas, y segn la extensin poseen distintos
datos almacenados. Por ejemplo, en la extensin del tipo 2.5.29.37 (tambin llamada Enhanced Key
Usage)seguardacualvaasereldestinodelcertificado,porejemploparaautenticacindelcliente.

Estas extensiones estn en la coleccin Extensions del certificado, y para obtener la informacin
almacenadadebecastearsesegneltipodelmismo.Parasaberqutipodeextensineslaalmacenada
se puede leer la propiedad Oid, la cual devuelve la clase homnima que representa un identificador de
un objeto criptogrfico (cryptographic object identifier) y luego, de este objeto, podemos leer la
propiedadFriendlyNameparaobtenerelnombredelaextensin.

Acontinuacinhayuncdigodeejemplodondesemuestralainformacindeuncertificado:

240

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;

usingSystem.Security.Cryptography;
usingSystem.Security.Cryptography.X509Certificates;
usingSystem.Diagnostics;

namespaceCertDigitales
{
classProgram
{
staticvoidMain(string[]args)
{
X509Certificate2objCert1;
//X509Certificate2objCertB;
X509StoreobjStore;

objStore=newX509Store(StoreName.Root,StoreLocation.LocalMachine);
objStore.Open(OpenFlags.ReadOnly);
foreach(X509Certificate2objCertBinobjStore.Certificates)
{
Console.WriteLine(objCertB.SubjectName.Name);
if(objCertB.SubjectName.Name=="CN=MicrosoftRootCertificateAuthority,DC=microsoft,DC=com")
{
StringBuilderobjSB=newStringBuilder("Detalledelcertificado:\n\n");
//Detalle
objSB.AppendLine("Persona="+objCertB.Subject);
objSB.AppendLine("Emisor="+objCertB.Issuer);
objSB.AppendLine("Vlidodesde="+objCertB.NotBefore.ToString());
objSB.AppendLine("Vlidohasta="+objCertB.NotAfter.ToString());
objSB.AppendLine("Tamaodelaclave="+objCertB.PublicKey.Key.KeySize.ToString());
objSB.AppendLine("Nmerodeserie="+objCertB.SerialNumber);
objSB.AppendLine("Hash="+objCertB.Thumbprint);
//Extensiones
objSB.AppendLine("\nExtensiones:\n");
foreach(X509ExtensionobjExtinobjCertB.Extensions)
{
objSB.AppendLine(objExt.Oid.FriendlyName+"("+objExt.Oid.Value+')');
if(objExt.Oid.FriendlyName=="KeyUsage")
{
X509KeyUsageExtensionext=(X509KeyUsageExtension)objExt;
objSB.AppendLine(""+ext.KeyUsages);
}
if(objExt.Oid.FriendlyName=="BasicConstraints")
{
X509BasicConstraintsExtensionext=(X509BasicConstraintsExtension)objExt;
objSB.AppendLine(""+ext.CertificateAuthority);
objSB.AppendLine(""+ext.HasPathLengthConstraint);
objSB.AppendLine(""+ext.PathLengthConstraint);
}
if(objExt.Oid.FriendlyName=="SubjectKeyIdentifier")
{
X509SubjectKeyIdentifierExtensionext=(X509SubjectKeyIdentifierExtension)objExt;
objSB.AppendLine(""+ext.SubjectKeyIdentifier);
}
if(objExt.Oid.FriendlyName=="EnhancedKeyUsage")//2.5.29.37
{
X509EnhancedKeyUsageExtensionext=(X509EnhancedKeyUsageExtension)objExt;
OidCollectionobjOids=ext.EnhancedKeyUsages;
foreach(OidoidinobjOids)
objSB.AppendLine(""+oid.FriendlyName+"("+oid.Value+')');
241

}
}
Console.WriteLine(objSB.ToString());

}
}
Console.ReadKey();
}
}
}

Cmo no contamos con un certificado digital de alguna empresa he usado este de Microsoft
(CN=MicrosoftRootCertificateAuthority,DC=microsoft,DC=com).

2.10.4 Encriptacin y Desencriptacin Utilizando un Certificado (Este no es posible a menos que


ustedestenganunoensuempresaotenganuntokeninstaladoensucomputador).

Para encriptar y desencriptar datos se necesita la siguiente librera (using


System.Security.Cryptography.Pkcs;), por alguna razn en C Sharp no quiso funcionar, por consiguiente
creeunproyectousandocdigoVisualBasicyacontinuaciningreseelsiguientecdigo.

ImportsMicrosoft.VisualBasic
ImportsSystem.Data
ImportsSystem.Collections.Generic
ImportsSystem
ImportsSystem.Linq
ImportsSystem.Text
ImportsSystem.Security.Cryptography.X509Certificates
ImportsSystem.Diagnostics
ImportsSystem.Security.Cryptography
ImportsSystem.Security.Cryptography.Pkcs
ImportsManifiesto.WS.ManifiestoService
ImportsManifiesto.WS.WSManifiesto
PartialClass_Default
InheritsSystem.Web.UI.Page
ProtectedSubPage_Load(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMe.Load
DimobjCertBAsX509Certificate2
DimobjStoreAsNewX509Store
objStore=NewX509Store(StoreName.Root,StoreLocation.LocalMachine)
objStore.Open(OpenFlags.ReadOnly)
ForEachobjCertBInobjStore.Certificates
IfobjCertB.SubjectName.Name="CN=CertificadoEmpresarialClaseA,O=CerticamaraS.A.EntidaddeCertificacion,L=Carrera91621
Bogota,C=CO"Then
DimobjContentAsContentInfo=NewContentInfo(Encoding.ASCII.GetBytes("FredysSimanca"))
DimobjEncryptedDataAsEnvelopedCms=NewEnvelopedCms(objContent)
DimobjRecipientAsCmsRecipient=NewCmsRecipient(objCertB)
objEncryptedData.Encrypt(objRecipient)
DimbytResultAsByte()=objEncryptedData.Encode()
Response.Write(bytResult.ToString)
EndIf
Next
EndSub
EndClass

242

HeusadouncertificadodigitaldeCerticamaraparailustracindelejemplo.

Elsiguienteeselcdigoparaelprocesodedesencriptado.

'desencriptando
objEncryptedData=NewEnvelopedCms()
objEncryptedData.Decode(bytResult)
objEncryptedData.Decrypt()
DimbytDocAsByte()=objEncryptedData.ContentInfo.Content
Response.Write("Datosdesencriptados:"+Encoding.ASCII.GetString(bytDoc))

Entotalquedaraas:

ImportsMicrosoft.VisualBasic
ImportsSystem.Data
ImportsSystem.Collections.Generic
ImportsSystem
ImportsSystem.Linq
ImportsSystem.Text
ImportsSystem.Security.Cryptography.X509Certificates
ImportsSystem.Diagnostics
ImportsSystem.Security.Cryptography
ImportsSystem.Security.Cryptography.Pkcs
ImportsManifiesto.WS.ManifiestoService
ImportsManifiesto.WS.WSManifiesto
PartialClass_Default
InheritsSystem.Web.UI.Page
ProtectedSubPage_Load(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMe.Load
DimobjCertBAsX509Certificate2
DimobjStoreAsNewX509Store
objStore=NewX509Store(StoreName.Root,StoreLocation.LocalMachine)
objStore.Open(OpenFlags.ReadOnly)
ForEachobjCertBInobjStore.Certificates
IfobjCertB.SubjectName.Name="CN=CertificadoEmpresarialClaseA,O=CerticamaraS.A.EntidaddeCertificacion,L=Carrera91621
Bogota,C=CO"Then
DimobjContentAsContentInfo=NewContentInfo(Encoding.ASCII.GetBytes("FredysSimanca"))
DimobjEncryptedDataAsEnvelopedCms=NewEnvelopedCms(objContent)
DimobjRecipientAsCmsRecipient=NewCmsRecipient(objCertB)
objEncryptedData.Encrypt(objRecipient)
DimbytResultAsByte()=objEncryptedData.Encode()
Response.Write(bytResult.ToString)
'desencriptando
objEncryptedData=NewEnvelopedCms()
objEncryptedData.Decode(bytResult)
objEncryptedData.Decrypt()
DimbytDocAsByte()=objEncryptedData.ContentInfo.Content
Response.Write("Datosdesencriptados:"+Encoding.ASCII.GetString(bytDoc))
EndIf
Next
EndSub
EndClass

You might also like