Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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.
Agradecimientos
Estetrabajosehallevadoacabograciasalaportedenuestrosexalumnosyalumnosyen
especialalaUniversidadLibre,locualnoshallevadoacumplirunsueodetantoaosquepor
fin hemos culminado y esperamos que sea un aporte a la comunidad como herramienta de
apoyodeconsulta.
FredysAlbertoSimancaHerrera
FabinBlancoGarrido
CONTENIDO
INTRODUCCIN
1.CONCEPTOSPREVIOS
1.1CONTROLESDESERVIDOR
1.2CONTROLESDEVALIDACIN
1.3CONTROLESAJAX
1.4MASTERPAGES
1.4.1QusonlosMasterPages?
1.4.2DefinicindeunMasterPage
1.5WEBSERVICES
1.5.1CaractersticasdelosWebServices
1.5.2EstructuraInternadelosServiciosWeb
1.5.3TiposdeServiciosWeb
1.5.4CreacindeServiciosWebcon.NET
1.6CONTROLESDEINICIODESESIN
1.7CONEXINAUNABASEDEDATOSDESQLSERVERDESDEASP.NET
1.7.1ProyectoSaberPro
1.7.2Insertarunnuevoregistro
1.7.3UsodelGridViewparatrabajartablas
1.7.4PedirconfirmacindelbotnEliminarenelGridView
1.7.5InsertarbotnNuevoenelGridView
1.7.6InsertarunDropDownListaleditarunregistro
1.7.7ValidacindeUsuariosyperfil
1.7.8EnvodeCorreodesdeASP.NET
1.7.9MduloEntrenadorPruebasSaberPro
1.7.10Seleccionaraleatoriamenteregistrosdeunatabla
1.7.11Mostrarunaimagendeunatablaenunagrilla
1.7.12ValidarDropDownListinsertadodentrodeunGridView
1.8ProyectoBancodeProyectosdeGrado
1.8.1CambiarelMasterPagedinmicamente
1.8.2LafuncinInsertarRegistro
1.8.3PedirconfirmacindelbotneliminarenelGridView
1.8.4MduloAdministracindereasdeInvestigacin
1.8.5Mduloadministracindelneasdeinvestigacin
1.8.6Agregarenlagrillauncampodedescripcindeotratabla
1.8.7SeleccionarvalordeunaceldadeunGridView
1.9GENERACINDEREPORTES
1.10GENERACINDEGRFICOS
2.SQLSERVER
2.1INTRODUCCINASQL
2.1.1QuesSQL?
2.2LASCONSULTASSIMPLES
2.2.1SintaxisdelaSELECT(paraconsultassimples)
2.2.2Ordenarlasfilas(ORDERBY)
10
10
14
18
22
23
24
27
27
27
28
29
35
53
53
60
61
64
67
70
71
74
75
77
78
81
86
91
94
89
102
103
104
127
136
138
160
160
160
161
161
163
2.2.3LasclusulasDISTINCT/ALL
2.2.4LaclusulaTOP
2.2.5LaclusulaWHERE
2.2.5Condicionesdeseleccin
2.2.6CaracteresComodines
2.3Lasconsultasmultitablas
2.3.1Launindetablas
2.3.2Lacomposicindetablas
2.3.3LasfuncionesdeColumna
2.3.4LaclusulaGROUPBY
2.3.5LaclusulaHAVING
2.4PROCEDIMIENTOSALMACENADOS
2.4.1CreacinProcedimientoAlmacenado(SinParmetrosDeEntrada)
2.4.2EjecutarUnProcedimientoAlmacenado
2.4.3FormaGeneraldeunProcedimientoAlmacenado
2.4.4ModificacindeunProcedimientoAlmacenado
2.5TRIGGERSENTRANSACTSQL
2.5.1LosDesencadenadoresDML
2.5.2LosdesencadenadoresDDL
2.5.3EjemploprcticodecmocrearunTriggersenTransactSQL
2.6TRANSACCIONESENTRANSACTSQL
2.6.1Transaccionesimplcitasyexplicitas
2.6.2Transaccionesanidadas
2.6.3Puntosderecuperacin(SavePoint)
2.6.4Ejerciciodetransacciones
2.7FUNCIONESENTRANSACTSQL
2.7.1FuncinEscalar
2.7.2Funcionesconvaloresdetabladevariasinstrucciones
2.7.3Funcionesconvaloresdetablaenlnea
2.8CURSORESENTRANSACTSQL
2.8.1VentajasdelosCursores
2.8.2EstructuradeunCursor
2.8.3AsignacinyAsociacindeCursores
2.8.4ProcedimientosAlmacenadosyCursores
2.9SQLDINMICOENTRANSACTSQL
2.10CERTIFICADOSDIGITALES
2.10.1FirmaDigital
2.10.2UtilizarCertificadosDigitalesDesde.NET
2.10.3Consultarlainformacindelcertificadoysusextensiones
2.10.4EncriptacinyDesencriptacinUtilizandounCertificado
163
164
164
166
168
168
169
170
176
177
178
179
180
180
180
181
189
189
191
191
198
199
203
203
205
208
208
210
211
213
213
213
226
226
227
231
235
236
239
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
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. Utilicelas propiedades DataTextFieldyDataValueField paraespecificar qucampodel
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.
10
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.
11
InsertemosunLabel1,alfrentedelcontrolparamostrareltemseleccionado.
Elcdigoeselsiguiente:
EnestecasoelmismovalordelSelectedItemesigualalSelectedValue,editeloselementosdelControl
nuevamenteycambielapropiedadValue,cuandosetraendatosdesdeunabasededatosmuchasveces
estasdospropiedadesdebendetenervaloresdistintos,supngasequealusuarioseledeseamostrarlos
nombresdeunosclientes,perointernamenteelvalorquenosinteresaeselnmerodedocumentodel
cliente,perocomonuestrousuarionosesabelosnmerosdedocumentosloqueseledebedemostrar
al,sonlosnombres.Elsiguientecdigonosagregaopcionesdiferentesatextcomoavalue,tienela
mismafuncionalidadcuandosedeseahacerconbasededatos.
ListBox.ElcomponenteListBoxtieneelmismocomportamientoqueelcontrolDropDownList.
FileUpload.Creauncontrol<inputtype=file>(queporlogeneralsemuestracomouncontroldecuadro
detextoyunbotndeexaminar)quepermitealosusuariosseleccionarunarchivoparacargarloenel
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
12
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.
13
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.
14
RequiredFieldValidator.ElcontrolRequiredFieldValidatorseutilizaparaconvertiruncontroldeentrada
enuncampoobligatorio.Elcontroldeentradanosuperalavalidacinsielvalorquecontienenocambia
conrespectoalvalorinicialcuandoserealizlavalidacin.Estoimpidequeelusuariodejeelcontrolde
entradaasociadosinmodificar.Demanerapredeterminada,elvalorinicialesunacadenavaca(""),loque
indicaquesedebeespecificarunvalorenelcontroldeentradaparaquesuperelavalidacin.
CompareValidator.ElcontrolCompareValidatorpermitecompararelvalorespecificadoporelusuario
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
deseacompararuncontroldeentradaespecficoconotrocontroldeentrada,establezcalapropiedad
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:
15
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
accesoalvalorquesevaavalidar.Paradevolverelresultadodelavalidacin,establezcalapropiedad
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.
LapropiedadTypeseutilizaparaespecificareltipodedatosdelosvaloresquesevanacomparar.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.ElcontrolValidationSummarypermiteresumirlosmensajesdeerrordetodoslos
controlesdevalidacindeunapginaWebenunasolaubicacin.Elresumenpuedeaparecerenforma
delista,listaconvietasounnicoprrafo,enfuncindelvalordelapropiedadDisplayMode.Elmensaje
deerrorquesemuestraenelcontrolValidationSummaryparacadacontroldevalidacindelapgina
vieneespecificadoporlapropiedadErrorMessagedecadacontroldevalidacin.Sinoestestablecidala
propiedadErrorMessagedelcontroldevalidacin,nosemostrarningnmensajedeerrorenelcontrol
ValidationSummarycorrespondienteadichocontroldevalidacin.Tambinsepuedeespecificarunttulo
personalizadoenlaseccindeencabezadodelcontrolValidationSummaryestableciendolapropiedad
HeaderText.
Vamosaverentoncesunejemplodecmofuncionanloscontrolesdevalidacin.
Descarguedeinternetoutiliceotromedioparacrearunahojadeestilo(css).
16
Copieelarchivocssalarazdesusitioweb,paraadjuntarlahojadeestilosasupgina,vayaalmen
contextualaFormatoAdjuntarhojadeestilos.
Seleccionelahojadeestilo,luegodeclicenAceptar.Despusdehaberadjuntadolahojadeestilohagamos
elsiguientediseo:
Ahora en vista diseo, vamos a arrastrar los siguientes controles de Validacin, tal y como se puede
observarenlafigura.
ElControlquequieresvalidar,enelprimercaso
sereldeemailyeldefechadenacimiento.
Elmensajedeerrorquesequieremostrar
cuandosepresentaunerror.
Seleccioneelformatoquedesea,paraelcasode
fechadebebuscareninternetlaexpresin
regularparavalidarlafecha.
Seleccioneelcontrolelcualquierevalidar
Elmensajequesequieremostrarcuandoseha
presentadounerror.
Valormximoquequiereparaelrango
Valormnimoquequiereparaelrango,
supongamosquesolamenteaceptamospersonas
ErrorMessage
RegularExpresionValidator
ValidationExpression
ControlToValidator
ErrorMessage
RangeValidator
MaximunValue
MinimunValue
17
entre18y25aos.
CompareValidator
ControlToValidate
ControlToCompare
ErrorMessage
RequiredFieldValidator
ControlToValidator
ErrorMessage
Elcontrolquequeremosvalidar,enestecasoes
elpassword.
Elcontrolquequeremoscomparar,enestecaso
sereldeReingresePassword.
Elmensajedeerrorquesequieremostrar
cuandosepresentaunerror.
Seleccioneelcontrolelcualquierevalidar
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:
18
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:
19
Esteejemplo,mostrarunadeterminadainformacinlaprimeravezqueseejecutanuestraaplicaciny
mostrarlasiguienteinformacin:
Sipulsamoselbotn,laaplicacinrealizarunrefrescodetodalaaplicacinWebyejecutaruncamino
deidayvueltarefrescandotodoslosobjetosdelaaplicacin.Elresultadounavezejecutadoelcontrol
Buttoneselsiguiente:
Enesteprocesonoobstante,nohemosutilizadoAJAXan.
Comovemos,esteeselmecanismotradicionaldeejecutaraplicacionesWeb,concaminosdeidayvuelta
yrefrescodetodalapginawebcompleta.
ImaginemosentoncesquetenemosvariasfuentesdedatosasociadasanuestrapginaWebyquecada
vezquerefrescamos,sevuelvenalanzartodaslasaccionesdeconsultasobrelasbasesdedatos.
Enlaredseproduciraungranconsumodeanchodebanda,yadems,penalizaramosseguramenteal
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:
20
Comoelcdigodenuestraaplicacineselmismo,acontinuacinejecutaremosnuestraaplicacinWeb:
PulsaremoselcontrolButtondenuestraaplicacinyobservaremoselresultadoobtenido,quesersimilar
alqueseindicaenlasiguienteimagen:
21
Atendiendoalosresultados,podemosdeducirquemientrasenelprimercasoenelquenousbamos
AJAX,elresultadodelapginaweberauncaminodeidayvueltarefrescandotodalapginaweb,enel
usodeAJAXesecaminodeidayvueltasehareducidonicamenteaaquelloscontrolesuobjetosque
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:
22
Ejemplode
dospginassimilaresenMSDN
Ambaspginasdifierennicamenteenelcontenidoylosmensquemuestranenellateral(losbanners
dellateralsonrotativos),yconservanunaestticayunaseriedeelementosquepermanecenconstantes
entodaslaspginasdelsitio.
Tradicionalmenteparaconseguirestasimilitudentrepginashabaquecrearlasindividualmenteorecurrir
aartificiospropioscomoporejemploeldeutilizararchivosdeinclusinpararenderizarciertaspartesde
laspginasdesdeunmismoorigenendisco.Anenesteltimocasolacapacidaddemodificacinera
limitadaynormalmentesereducaalascabecerasypiesdelaspginasypocoms.Enelprimerodelos
casos(retocarunaauna)cualquiercambioestticodeunsitiomedianamentegrandeerapocomenosque
unalocuraderealizar.
ApartirdeASP.NET2.0seofreceunanuevacaractersticadestinadaapaliarestatradicionalcarenciay
permitedefinirpginascuyoaspectoyfuncionalidadderivadeunaspginasespecialescomunesllamadas
PginasprincipalesoMasterPages.
1.4.1QusonlasMasterPages?
UnaMasterPageproporcionaunaformadedefinirunaestructuraeinterfazcomnparaungrupode
pginaspertenecientesaunmismositioWeb.Estaestructuracomnsealmacenaenunnicoarchivo
independiente.Ellofacilitamuchosumantenimientopuestoque,paraactualizartodaslaspginasquelo
utilizan,bastaconeditardichoarchivo.
23
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
cdigoasociadoenelquesepuederesponderasusdiversoseventos.Lanicadiferenciaapreciablea
simple vista respecto a una pgina normal es que contiene por defecto un control de tipo
ContentPlaceHolder.Lasintaxisdeestecontrolesanlogaalasiguiente:
<asp:ContentPlaceHolder id="head" runat="server">
</asp:ContentPlaceHolder>
24
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:
25
EnlapginamastercambieelnombredelContentPlaceHolder:
<asp:ContentPlaceHolder id="Detalles" runat="server">
</asp:ContentPlaceHolder>
IgualmenteenlaPaginaHija.aspxmodifiquetambienlasiguientelnea:
<asp:Content ID="Content1" ContentPlaceHolderID="Detalles" Runat="Server">
</asp:Content>
AhoravayamosalaPaginaHija.aspx,debeyaapareceralgocomoesto:
EscribeodiseaalgodentrodelaetiquetaDetalles,luegopresionaF5paraverelresultadodelapgina.
Deestamaneratodasnuestraspginaspuedentenerelmismodiseosinnecesidadquetengamosque
repetireldiseoencadaunadeellas.
Observelasiguienteimagenparaverlosresultados.
26
1.5WEBSERVICES
Losservicioswebpretendendar unpasomseneldesarrollo deaplicacionesparalaweb,yaquesu
objetivoesquestaspuedanserutilizadasporotrosprogramascapacesdeprocesarlasrespuestascon
otrofinquenoseaeldelapresentacindeinformacinenpantalla,permitiendoademsautomatizar
ciertosprocesosenlawebalposibilitartransaccionesdedatossinintervencindeunusuario.
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.
Request(XML)
Response
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.
Nuevosestndaresabiertos.HTTPyXMLconstituyenlabaseprincipaldelosserviciosweb.Sehan
desarrolladounaseriedetecnologasquepermitenestandarizaroperacionescomoladescripcinola
publicacindeunservicioweb.
1.5.2EstructuraInternadelosServiciosWeb
Laestructuraylacomplejidaddeunserviciowebdependendelasfuncionesarealizarydeltipodeservicio
quesetrate.Encualquiercasosepuedendistinguirdoscomponentesbsicos:
27
Servicioweb
PeticinSOAP
ASP.NET
RespuestaSOAP
ensamblad
Servidor
Figura2.Serviciowebcon.NET
1.5.3TiposdeServiciosWeb
Enfuncindecmovaaserprocesadalainformacinporunservicioweb,sepuedendividirestosendos
categoras:
Serviciosweborientadosamtodo
SebasanenunainteraccindetipoInvocacinRemotaaMtodo(RPC),dondeeldocumentoXMLde
peticin del servicio web representa la llamada a un mtodo o procedimiento con sus respectivos
parmetrosdeentrada,mientras queeldocumento XMLgeneradocomorepuestarepresenta elvalor
devueltopordichomtodo.Eselcasomssencillodeserviciowebyelmsutilizado,dondeclientey
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.
28
1.5.4CreacindeServiciosWebcon.NET
ParacrearunserviciowebvamosaArchivo>NuevoSitioWeb
Luegoenlaventanasiguienteseleccionamoslasopcionesquesevenenlaimagen.
Seleccionael
FrameWord3.5
SeleccionaServicioWeb
ASP.NET
ClicenAceptar.PordefectocreaunmtodollamadoHelloWorld
Vamosacrearnuestropropiomtodo,elmtodoquesevahacerdeejemplosereldevolverunvector
connnmeroderegistrosdependiendodeunfiltro.
Paraellonecesitamoslaclasequenosconectaalabasededatosenelservicioweb.
29
Volvemosalserviciowebycreamoslafuncinquenosinteresa.
Estaeslatabladelacualsacaremoslosregistrosaleatorios.
30
LuegoejecutamoslaaplicacinparaellopresionamosCtrl+F5
Luegoenelnavegadorpodemosobservarqueelserviciowebseestejecutando
SiqueremosprobarelServicioWeb,declicsobreelprocedimientoeingreselosdatos.
31
ClicenInvocaryelresultadosera:
Enestecaso,sedebedetenerenlatablaunbuennmeroderegistros,sisequiereingresarparmetros
mayores.Vamosahoraaelaborarunproyectowebdelcualconsumiremoselservicioweb.
Despusdecrearelsitioweb,vamosaSitioWebAgregarReferenciaWeb
32
Nosmostraraunaventanacomolasiguiente,enURLcopielarutadelserviciowebqueestenejecucin.
ClicenelbotnContinuar,ingreseunnombredeReferenciayclicenAgregarReferencia.
Elresultadoser:
33
Ahoravamosaconsumirelservicioweb,paraelloenelarchivoDefault.aspx,diseemosunavistacomo
lasiguiente.
SeleccionamoselbotnTraerPreguntaseingresamoselsiguientecdigo.
34
Ejecutelaaplicacin,ingreselosdatosyobserveelresultado.
1.6CONTROLESDEINICIODESESIN
1. ChangePassword:Permitealosusuarioscambiarlacontrasea.Elusuariodebeproporcionarprimero
lacontraseaoriginaly,acontinuacin,crearyconfirmarlanuevacontrasea.Silacontraseaoriginal
escorrecta,lacontraseadeusuariosecambiaalanuevacontrasea.Elcontroltambinpermite
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:Muestraunainterfazdeusuarioparalaautenticacindeusuarios.ElcontrolLogincontiene
cuadrosdetextoparaelnombredeusuarioylacontraseayunacasilladeverificacinquepermitea
los usuarios indicar si desean que el servidor almacene su identidad mediante la suscripcin de
ASP.NETyquelosautentiqueautomticamentelaprximavezquevisitenelsitio.
4. LoginName:Permitemostrarelnombredeiniciodesesindeunusuariosiestehainiciadolasesin
mediantelasuscripcindeASP.NET.Porelcontrario,sielsitioutilizalaAutenticacindeWindows
integrada,elcontrolmuestraelnombredecuentadeWindowsdelusuario.
5. LoginStatus: Este control muestra un vnculo de inicio de sesin para los usuarios que no estn
autenticadosyunvnculodecierredesesinparalosqueestnautenticados.Elvnculodeiniciode
sesinllevaalusuarioaunapginadeiniciodesesin.Elvnculodecierredesesinrestablecela
identidaddelusuarioactualyloconvierteenunusuarioannimo.
6. LoginView:Permitemostrarinformacindiferentealosusuariosannimosyalosquehaniniciado
unasesin.Elcontrolmuestraunadelasdosplantillas:AnonymousTemplateoLoggedInTemplate.
En las plantillas, puede agregar marcado y controles que muestren informacin apropiada para
usuariosannimosyusuariosautenticados,respectivamente.
35
7. PasswordRecovery:Permiterecuperarlascontraseasdeusuariobasndoseenladireccindecorreo
electrnicoqueseusalcrearlacuenta.ElcontrolPasswordRecoveryenvaalusuariounmensajede
correoelectrnicoconlacontrasea.
Creamosunsitionuevo
YagregamosdosWebFormunoconelnombredeLoginyotrocreateaccount
36
AgregamosunMasterPage
AgregamosunWebFormconelnombredehomeyseleccionamoselMasterPageyotroDefault2.
37
38
VamosalformulariologinyagregamosuncontrolLoginView.
39
AgregamosjuntoalLoginViewelcontrolLogin
40
Enautoformseleccionamosunestilo
VamosapropiedadesalaopcinDestinationPageUrlseleccionamoshome
41
42
Vamosaladministradordelsitio,seguridad,asistentedeconfiguracin,vamosalpasodosseleccionar
mtododeacceso(desdeinternet)yfinalizar
AbrimoscreateaccountseleccionamoselcontrolcreateUserWizard,autoformat,despusvamosa
propiedadesopcinDestinationPageUrlseleccionamosHome
43
44
45
AhoraenelMasterPageseleccionamosloscontrolesLoginNameyLoginStatus
EnLoginStatusvamosapropiedadesaLogoutActionyseleccionamosRedirectToLoginPasteyen
LogoutPageUrlseleccionamosLogin
46
Abrimoshome.aspxeinsertamosunLoginName.
AbrimosahoraelDefault2.aspx,einsertamosigualmenteunLoginName
47
Enelhome.aspxagregamosunHyperLinkenlaspropiedadesmodificamosText:(Opciones)ynavigateUrl
seleccionamosdefault2.aspx
48
Enlapropiedad
navigateURL,seleccione
Default2.aspx
Corremosnuestraaplicacinparaverificarsipodemosregistrar.
Intenteloguearsecon
cualquierusuario
Debesalirunmensajedeerror,
comoelqueseobservaenla
imagen,declicenRegister
Ingreselosdatosdelusuarioaregistraryde
clicenCrearUsuario
49
Listo,ahorapodrloguearseconelusuario
queacabadecrear.
Ahora vamos a agregar un nuevo formulario para cambiar la contrasea con el nombre
Changepassword.aspx,tengapresenteseleccionarlapginamaestra.
EnChangePassword.aspxseleccionamoselcontrolChangePassword.
EnlaspropiedadesdelChangePassword,puedemodificarelformatodevista,siaslodesea.
50
NosdirigimosaDefault2.aspxyagregamosunHyperLinkenlaspropiedadesmodificamosText:(Cambiar
Contrasea)yenlapropiedadnavigateUrl,seleccionamoslapginaChangePasword.aspx
CreamosunnuevoWebFormlollamamosPasswordRecovery.aspx
EnlagregamoselcontrolPasswordRecovery,cambieelformatosilodesea.
51
Ahoraenlogin.aspxagregamosunHyperLinkenlaspropiedadesmodificamosText:(Olvidemi
contrasea)yenlapropiedadnavigateUrl,seleccionelapginaPasswordrecovery.aspx
Ejecutamoslaaplicacinyobservamoslosresultados.
52
1.7CONEXINAUNABASEDEDATOSDESQLSERVERDESDEASP.NET
1.7.1ProyectoSaberPro
Creeunproyectoweb(usaremoscdigoC#),luegodecrearelproyectoagregueunaclase,observela
imagen.
Despusdecrearlaclase,ingreseelsiguientecdigo.
EstafuncinesparartrabajarconlatablaUsuarios,sepuedeusarlamismaparatrabajarcondiferentes
tablas,tododependedelasnecesidadesquesetengaenelformularioqueseesttrabajando.
53
Agregarahoraunformulario,paratrabajarlatablallamadaTbUsuarios,enlaimagensepuedeobservar
eldiseodelatabla.
Agregamos el formulario (frmregistro.aspx), tenga presente seleccionar la opcin que dice Seleccione
pginamaestra.
Tengapresentequealmomentodecrearelproyecto,sedebitenerencuenta,primerocrearelproyecto
vaco,segundocrearunapginamaestraparaelsitioweb.
54
DisearenelWebForms,elformularioderegistrodeusuarios,verlaimagensiguiente.
Nombreloselementosdelasiguientemanera:
TxtDocumento
TxtNombres
TxtApellidos
CmbUniversidad
TxtTelefonoFijo
TxtTelefonoCelular
TxtCorreo
TxtLogin
TxtPassword
CmbPerfil
VamosahoralistarenelCmbUniversidades,lasuniversidadesqueseencuentranregistradasenlabase
dedatos.
55
Seleccioneelcombo,clicenlapestaadeladerechayElegirorigendedatos.
Enlapestaaseleccione<NuevoOrigendeDatos>
56
ClicenelBotnNuevaConexin
SeleccionarMicrosoftSQL
ServeryclicenContinuar
Ingresarelnombredelservidory
seleccionarlabasededatosyclicen
Aceptar
57
ClicenelbotnSiguiente
ClicenelbotnSiguiente
Seleccionamoslatablade
nuestrointers,enestecaso
TbUniversidadesyclicenel
botnSiguiente.
58
ClicenelbotnSiguiente
ClicenelbotnAceptar,yesta
seralavistadelformulario.
59
AhoraprocederemosaconfigurarlasopcionesdelCmbPerfilseleccioneelcombo,clicenlapestaadela
derechayclicenEditarElementos,agreguetresopcionescomosemuestraenlaimagen.ClicenAceptar.
Ejecutelaaplicacin(F5)yenlavistageneraltendralgocomoloqueseobservaenlaimagen.
1.7.2InsertarunNuevoRegistro
Vamosahoraaingresarelcdigoparaingresarunnuevoregistro,elcdigoseriaelsiguiente.
60
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
ElGridViewesunelementodeASP.NETqueesmuytilalmomentodetrabajarconlastablas,enlas
pginassiguientesvamosavercmopodemostrabajarlo.
AgreguemosunWebFormsllamadofrmadminusuarios.aspx.
Inserteenesteformulariounatabla,conunacolumnaytresfilas,enlasegundafilainserteunGridView,
observalaimagen.
61
Seleccionelagrilla,declicenla
pestaasuperiorderecha,
seleccioneFormatoAutomtico,
seleccioneeldesuagradoyde
clicenAceptar.
Vuelvaaseleccionarlagrilla,clicenlapestaayenElegirOrigendeDatos,declicenNuevoOrigende
Datos.
62
SeleccionalaconexinqueyaestallcreadayclicenelBotnSiguiente.
Seleccionelatabla
TbUsuariosyluegode
clicenelbotn
Avanzadas,yseleccione
laopcinGenerar
instruccionesInsert,
UpdateyDeleteyde
clicenAceptar.
63
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.
64
DeclicenEditarColumnas
Seleccione
ButtonFieldyclic
enelbotn
Agregar
Propiedad
ButtonTypeen
Link,Text:
Eliminarydeclic
enlaopcinque
diceConvertir
esteinformeen
TemplateField
65
Conlosbotones
deArriba,Abajo,
silodeseaubique
elbotneliminar
desegundo(ver
imagen),Clicenel
botnAceptar.
Comoresultadotendremos:
Seleccionelagrilla,vayaalcdigoasp,ubiquelassiguienteslneasyhagaloscambioscorrespondientes
paraquequedecomoseubicaenelresaltadodelaimagen.
Ejecutelaaplicacinynotarqueantesdeeliminarelregistro,pideconfirmacin.
66
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.
67
Hagaclicderechoenel
GridViewyseleccioneEditar
plantillas,luegoEmptyData
Template.Arrastreysuelteun
controlDetailsView(opcin
Datos)dentrodelaplanilla,
establezcalapropiedad
DataSourceIDpara
SqlDataSource1,seleccione
HabilitarInsercin
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.
68
Seleccione ahora el
DetailsView, y en la
pestaa
tareas
de
DetailsView,seleccionela
opcinEditarPlantillas.
SeleccioneFooterTemplatee
inserteunbotn,talycomo
seveenlaimagen,la
programacindelbotnser
lasiguiente:
Ejecutelaaplicacinyhastaaquelresultadodebesercomosemuestraenlassiguientesimgenes.
69
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
Seleccioneel
GridView,seleccione
laopcinEditar
Columnas,seleccione
lascolumnasenlas
cualesdeseaingresar
elDropDownList
(Universidad,Perfil),y
declicenlaopcin
ConvertirEste
Informeen
TemplateField.Clicen
Aceptarparafinalizar.
AhoraeditelaplantilladelGridView.
EnlasTareasdelGridView,seleccionelacolumnadeUniversidadEditItemTemplate,yallinserteun
DropDownList.
Repita el procedimiento hecho para listar las universidades en el combo, como resultado se tiene un
SqlDataSource2.SeleccioneelDropDownListyvayanapropiedades.
70
SeleccioneelDropDownList,yseleccioneEditarEnlacedeDatos,dejelosvalorescomoseobservanenla
imagen.
Verifiquequelas
propiedadesdel
DropDownListestn
comoseobservanenla
figura.
71
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.
72
Ymodificarlaclasefunciones.
73
1.7.8EnvodeCorreodesdeASP.NET
Frmcontacto.aspx
CdigodeBotnEnviar.
Importarlalibrera
Cambiarlosdatosdeacuerdoaunacuentadeustedes,estemtododeenvodecorrespondenciausauna
autenticacinSMTP,para quefuncioneconuna cuentade ustedes,deben teneruna cuentaconstas
caractersticas.
74
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.
75
Session["NombreUsuario"]="estudiante";
Enestalnealoquesehaceesdefinirunusuariodelosquesetienenregistradoenlabasededatos,para
noestarhaciendoelprocesodeloqueo,mientrassehacenlasrespectivaspruebassepuededejaresto
as.
LuegosellamaunafuncinqueloquehaceesretornarlaUniversidadalacualperteneceeseusuario.
Univ=fun.traerUniversidad(Session["NombreUsuario"].ToString());
Estalneadebedeestararrojandounerror,yaqueannohemoscreadolafuncin,comopodrnobservar
estafuncindebeestardentrodelalibrera.
Yaenmdulospasadoslahabamoshecho,mssinembargoparaaquellosquenolatengan,lapueden
copiar.
Hastaaqupuedenejecutarlaaplicacinyloquedebeestarhaciendohastaestemomentoeslistarlos
componentesdeestauniversidad.
76
Ahoraalseleccionarunodeloscomponentesdelcombo,debelistarnoslaspreguntasdeesecomponente,
delauniversidaddelusuarioloqueado.
1.7.10Seleccionaraleatoriamenteregistrosdeunatabla
SeleccioneelcomboyhabilitelaopcindeAutoPostBack,ydobleclicparacrearelprocedimiento.
NumPre=fun.traerPreguntas(Convert.ToInt16(DropDownList1.SelectedValue));
Estalneadecdigonostraeelnmerodepreguntasqueestnconfiguradasenbasededatosparaeste
componente.
Comopodrnobservarfaltalafuncinquenosretornaestevalor.
77
Ejecutelaaplicacin,elresultadodebesercomoloquesemuestraenlaimagen.
Pero,primeronoqueremosquenosmuestrelarespuestacorrectaysegundo,queremosquenosmuestre
laimagen.
1.7.11Mostrarunaimagendeunatablaenunagrilla
Paraelloseleccionelagrilla,clicenEditarColumnas.
Deseleccionalaopcin
Generarcampos
automaticamente
78
Agreguecinco
BoundField
SeleccioneunoaunoycoloquedeacuerdoasucampoenlabasededatoslaPropiedadDataFielddeigual
maneramodifiquelapropiedadHeaderTextestaesparaelencabezadoquedeseacolocarlealagrilla.
Ejecutelaaplicacinhastaaquyelresultadodeberser:
79
Ahoradebemosdemostrarlaimagen.
Paraello,seleccionelagrilla,yseleccioneAgregarnuevacolumna,configurelasiguienteventanacomose
veenlaimagen.
Ejecutelaaplicacinyelresultadoser:
80
1.7.12ValidarDropDownListinsertadodentrodeunGridView
AhoradebemosagregarunacolumnanuevaparaagregarunCombo,enelcualvamosaseleccionarla
respuestadeseadaporelusuario.
Paraelloseleccionelagrilla,seleccioneEditarColumnas,agregueunanuevaopcinydeclicenConvertir
esteinformeenTemplateField.EnHeaderText,escribaSeleccione.Clicenaceptar.
CliceneditarplantillasyenItemTemplate,elemineelLabelyagregueunDropDownList.
Seleccioneelcomboyagreguelassiguientesopciones.
81
Ejecutelaaplicacinyobservelosresultados.
Bien,ahorasedeseaquealmomentodedarleclicenenviar,nosdebeguardarunregistroenunatablade
cuantaspreguntascorrectashubieronycuantaserradas.
Peroantesdeesto,vamosamostrartemporalmenteenunalistalarespuestacorrectaylarespuestaque
estamosseleccionando,comoparairviendoelprocedimientopasoapaso.
82
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.
83
Modifiquemosahoraelbotnenviar.
Ejecutelaaplicacin,debemostrarenellistbox,lasrespuestasdelusuarioconlasrespuestascorrectas.
84
Perononosinteresamostrarestoesunagrillasinoguardarloenlabasededatos.
Latablaparaelloeslasiguiente.
Haganlasmodificacionesalcdigoparaqueestoseaposible.
Lesdejounamuestradealmenoscomosacarlascorrectasylasincorrectas.
Ahora,quesedebedehacer,grabarenlatablaestosdatosyseledebemostraralusuariounresumen,
porejemplo:
Fechadelentrenamiento:
30/10/2012
Usuario
78742034FredysSimancaHerrera
Componente
Escritura
PreguntasCorrectas
5
PreguntasIncorrectas
4
Imprimir
85
1.8ProyectoBancodeProyectosdeGrado
Diseodelastablas.Hastaelmomentosedebendetenerlassiguientestablas.
Basededatos:banproyectos
Tabla:TbUsuarios
Tabla:TbProgramas
86
Tabla:TbPropuestas
Tabla:TbPropuestasEstudiantes
Tabla:TbAreasInvestigacion
Tabla:TbLineasInvestigacion
Tabla:TbFechasPropuestas
87
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).
88
AgregarunWebFormsllamadoDefault.aspx,elcualvaasernuestrapginaprincipal,porahorapueden
escribiralgocomoloqueseobservaenlaimagen.
Culessonlospasoslgicosaseguir?
Hacerlaautenticacindeusuarios
Disearinicialmentelainterfazdeadministrador
Haceringresosalabasededatosde:
o Programas
o reasdeInvestigacin
o LneasdeInvestigacin
o FechasdePropuestas
Estseralaideaporahora,paraeldesarrollodelproyecto.
Cambielaspropiedadesdeloscontroles.
89
Control
TextBox1
TextBox2
Propiedad
Name:TxtLogin
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:
90
Lo primero que hay que hacer es insertar la referencia a la clase que acabamos de crear (Funciones),
dentrodelButton1,loquesehaceeshacerlaconsultaquedeseamos,ejecutamoslaconsulta,conlas
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.
Ntesequeseesthaciendoreferenciaaunarchivollamadofrmmenu.aspx,estearchivoannoest
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.
91
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:
92
Eldiseodelformulariofrmprogramas.aspx.
TxtPrograma
GridViewIDGrilla
Elcdigodelformulario.
NotequehayunafuncinllamadaInsertarRegistro,estafuncinestdentrodelaclaseFuncionessehace
deestamaneraparapoderinvocarladetodoslosformulariosdondesenecesite.
93
1.8.2LafuncinInsertarRegistro:
Ahora,laideaesmostrarenlaparteinferiorenlagrillalosregistrosquesevaningresando.
Seleccionelagrilla,clicenlapestaadeladerechayElegirorigendedatosyNuevoOrigendeDatos.
SeleccioneSQL(BasedeDatos)yclickenAceptar.
94
SeleccionarMicrosoft
SQLServeryclicen
Continuar
ClicenelBotnNuevaConexin
Ingresarelnombredelservidory
seleccionarlabasededatosyclicen
Aceptar
95
ClicenelbotnSiguiente
ClicenelbotnSiguiente
Seleccionamoslatablade
nuestrointers,eneste
casoTbProgramas,ydamos
clicenelbotnAvanzadas
96
Seleccionelaopcindela
imagenydeclicenAceptar
ClicenelbotnSiguiente
ClicenelbotnFinalizar
97
Ejecutelaaplicacinyobservelosresultados,debensercomolosquesemuestranenlaimagen.
Volvamos al diseo del formulario, seleccionamos la grilla y en las tareas de GridView, habilitar las
siguientesopciones.
Ejecutelaaplicacinyobservelosresultados.
98
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
99
Propiedad
ButtonTypeen
Link,Text
Eliminarydeclic
enlaopcinque
diceConvertir
esteinformeen
TemplateField
Conlosbotones
deArriba,Abajo,
silodeseaubique
elbotneliminar
desegundo(ver
imagen),Clicenel
botnAceptar.
Comoresultadotendremos.
Seleccionelagrilla,vayaalcdigoasp,ubiquelassiguienteslneasyhagaloscambioscorrespondientes
paraquequedecomoseubicaenelresaltadodelaimagen.
100
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
101
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.
102
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:
103
NotequeenlafuncinllenarCombo,hayunafuncinllamadaf.consultarRegistros(),estafuncindebeir
enlaclaseFuncionesyelcdigoeselsiguiente.
CdigodelbotnCancelar
Response.Redirect("frmmenu.aspx");
CdigodelbotnEnviar
1.8.6Agregarenlagrillauncampodedescripcindeotratabla
Comoleshabacomentadoen,cuandoinsertamoslagrillaparaadministrarlatablaTbLineasInvestigacin,
enelcampodeIdArea,noerabuenomostrarlealusuariosolamenteelcdigodelrea,yaqueparael
usuarioestecdigonoledicemayorcosa,loquepodemoshacerentoncesesmostrarleelcdigoyel
104
nombredelrea.Paraellorepitaelmismoprocedimientoaplicadoenlasanterioresgrillas,peroenla
ventanadeConfigurarlainstruccindelSelect,seleccionamoslaprimeracondicin,observelaimagen.
Ingreselossiguientescomandosparacadaunadelasopcionesqueobservaenlasimgenes.
105
Yterminenelprocedimientonormal,comoenlosanteriorescasos.
Activelassiguientesopcionesdelastareasdeldatagrid
106
Ejecutelaaplicacinyobservelosresultados.
Lavistageneraldelformulariodebequedarcomoseobservaenlaimagen.
Declicenelbotneditar,notequeenelcampodeIdArea,lagrillamuestrauncdigo(1,2,2)paraelcaso
delosregistrosquesevenenlaimagen,estonoesconvenienteparaelusuario,yaquelnotieneforma
desaberculessonloscdigosparaunadelasreas,loidealesmostrarleuncomboconlasreas.Observe
laimagenquesemuestraacontinuacin.
107
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.
108
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.
109
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
Enestepuntoledebende
hacerfaltaestos
formularios:
Frmconfirmar.aspx
Frmfunciones.aspx
Frmintegrantes.aspx
Frmqueeselcomite.aspx
Frmregistro.aspx
Yaveremosparaquees
cadaunodeellos.
110
Elformulariofrmregistroyfrmconfirmar,ladinmicadelregistroesquealmomentoenqueunusuario
ingresesusdatosalsistema,inicialmentesegrabacomounusuarioinactivoyseleenvaunlinkalcorreo
quehayaregistradoparaqueingresealaplataformayactivesucuenta.
Empecemosentoncespordisearelformulariofrmregistro.aspx
Lleneelcomboconla
tablaTbProgramas
usandoelasistente.
NoolvidelaconfiguracindelcomboCmbPrograma
Estassonlasopciones
delCmbPerfil
Coloquelosnombresdeloscontrolesigualesalosqueseencuentranenlatabla,anteponindoletres
letrasdeltipodecontrol,puedeobservarlosnombresenelcdigoigualmente.(Txtparatextbox,Cmb
paraDropDownList,FulparaFileUpload).
ElcdigoparaelbotnIngresareselqueseobservaenlaimagen.
111
Observebienelcdigo,interpreteloqueseesthaciendoenl.Observeporejemploquesehacreado
unafuncinllamadaenviarCorreo,estodebidoaqueestolovamosanecesitarmuchoeneltranscursode
la ejecucin del proyecto, entonces para no estar duplicando cdigo se crea la funcin, la funcin la
podemosencontrarenlaclaseFunciones.Esteeselcdigo.
112
Sitodoestfuncionandoalcorreodebellegarlaconfirmacin.Observelaimagen.
Elresultado
113
Ahoratocahacerelcdigodelformulariofrmconfirmar.aspx
Envistadiseo:
Elcdigo:
LoniconuevoqueseencuentraaqueslainstruccinRequest.QueryString,estafuncinloquehacees
tomarelvalordelavariablequehasidoenviadaporlabarradedirecciones.
114
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.
115
Enprograma,debelistarselosprogramasqueseencuentranenlatablaTbProgramas.
Enperfil,debeaparecerlastresopcionesdeperfiles:Administrador,DocenteyEstudiante.
Enelformulariofrmadminusuarios.aspx,puedenverenvistadiseocomopodraquedar,esunaopcin,
haymltiplessoluciones.
AldarclicenelBotnBuscar,debe
mostrarmeelusuarioconeldocumento
ingresado.
116
Seeditaelregistro,siempreycuandoencuentreunacoincidenciaenlabasededatos
TbUsuarios,elcampodocumentonodebesermodificable,yaqueeslallaveprimaria,aldar
clicenActualizarseguardarloscambiosenelregistrosiloshubierayvuelvealapantalla
anterior,aldarclicenelbotnEliminar,seeliminarelregistroactual,previaconfirmacinpor
partedelusuariodelaoperacin.
Mdulo Administrar Fechas. La idea de esta opcin es programar las fechas de presentacin de las
propuestasyproyectosdegrado,latablaesTbFechasPropuestas,cuyodiseoes:
Eldiseodelformulario,seracomoseobservaenlasiguienteimagen.
Esrecomendablebuscaruncontrolpara
poderseleccionarlafecha,observela
siguienteimagen,yentipode
documento,PropuestasoProyectos
117
Enestecasoheusado
uncontrolAJAX
Lasopcionesdelcombo
Elcdigodelformulario,botnEnviar
CdigodelPageLoad
118
LafuncinllenarCombo
YelbotnCancelar
Usandoelasistentecomoencasosanteriores,sedebellenarlagrillaconlatablaTbFechasPropuesta,
comolasopcionesquesepuedenobservarenlasiguienteimagen.
Noolvidarvalidarel
botndelEliminar
QuedapendienteenelmduloAdministradorlasopcionesdeRevisarPropuestasyRevisarProyectos.
Adicionalaellosedebetenerpresentequesedebevalidarquenoesposibletenerdosfechasactivas,ya
seaparalaspropuestasoparalosproyectos.
MduloEstudiante(frmuploaddocumentos.aspx)
OpcinUploadDocumentos.Enestaopcinlaideaesquelosestudiantessubanlosdocumentos,yasea
delaspropuestasodelosdocumentos.
Latablaparaestaopcineslasiguiente:
119
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.
120
PrimeroVaun
UpdatePanel
DentrodelUpdatePanel,
debeirunPanel
PropiedadReadOnlyentrueo
cambiarloporunlabel.
Diseeelformulariocomose
observaenlaimagen.
Empecemosporelcdigodelform_loaddelformulario.
Estagrillavaenlazadaalatabla
TbPropuestasEstudiantes,perodebetraer
losdatoscomoelttulodelapropuesta,y
losnombresyapellidosdelosestudiantes.
121
Elcdigoprimerovalidaqueexistenfechasparasubirpropuestasactivas,sihayfechasactivascontinua,
casocontrario,muestraelmensaje.
LafuncinllenarDirector
CdigodelBotnEnviar
122
BotnCancelar
123
CdigodelBotnAceptar
CdigodelBotnTerminar
Hastaestemomentosedebeejecutarlaaplicacinyelresultadodebesercomoelquesemuestraenlas
imgenes.
Sellenan
losdatosy
clicenel
botn
Enviar
124
Seingresaeldocumento
delestudianteyAgregar
Esteserelresultado,
puedeagregarvarios
estudiantes.
125
Paraterminar,declicenelbotnTerminar.
ElprocesoparaelUpLoaddelosproyectosesigualaeste,serecomiendacrearunacarpetaparaproyectos,
haymuchasvalidacionesycontrolesquesedebendetenerpresenteenesteformulario,perosesiguen
dejandoparatrabajoextraclase.
Comoyahemosingresadolaspropuestas,volvemosalperfildeadministrador,paracompletar lasdos
opcionesqueestnpendiente,RevisarPropuestasyRevisarProyectos.
OpcinPropuestas
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.
126
Loquenosarrojacomoresultado:
Laideaahoraesaadirunbotnquenoslleveaotroformularioparaverlosdetallesdelapropuesta.
1.8.7SeleccionarvalordeunaceldadeunGridView
Seleccionamoslagrilla,editamosTareas
deGridView,enelegirorigendedatos,
seleccionamosSqlDataSource1yluego
clicenEditarColumna
DelosCampos
Disponiblesseleccione
CommandFieldy
agreguelaopcin
Seleccionar,en
Aparienciaenmicasohe
seleccionadoImage,
paracolocarunaimagen.
127
Enlapropiedad
InsertImageURL,
seleccionelaimagen
quedese.Clicen
Aceptar
Resultado:
Silaimagenhaquedadomuy
grande,puedeconvertirlacolumna
enTemplateFieldyluegoeditarla
parapodercambiareltamaodela
imagen.
VayaalaspropiedadesdelGridView
ycreeeleventoen
SelectedIndexChanged
128
Enlapropiedad
DataKeyNamesdelagrilla
escribaoseleccione
NumeroPregunta
Sitodovabien,elcdigohtmlseracomoseveenlaimagen.
Seleccionamos la grilla, damos doble clic sobre ella e insertamos el siguiente cdigo para probar si
efectivamentenoesttomandoelvalorquedeseamos,enestecasoelnmerodelapropuesta.
Vamosaprobarprimero,siefectivamentenosesttomandoelvalordelacolumna.
129
Ahora,aldarclicsobreelregistrovamosadireccionarloaotroformulario,endondevamosamostraro
editarelregistro,paraqueelrevisoringreselosdatos.
Modifiquemoselcdigo,quedaracomoseobservaenlasiguienteimagen.
CmbDirector
CmbEstadoAgregartems:
Revision,Aprobada,Aprobada
conCondicionesyRechazada
TxtObservacion
LaideaesqueelComitdeGradoserene,porconsiguiente,setomaelnmerodepropuestaysegraba
enunatablalaevaluacindelcomitconlasobservacioneshechasalapropuesta.
130
Eldiseodelatabla:TbEvaluacionPropuestas
Empecemosconelcdigodelformulario.
Cdigodelpage_load
LafuncinllenarDirector
131
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
132
*RevisionesdeProyectos,elcomportamientodeestaopcineselmismoqueparapropuestas,sedebe
listar los proyectos que estn en estado de revisin, se selecciona el que se desea, se pasa a otro
documentoyenesedocumentoseleasignanlosdosrevisoresalproyecto,elcomitdetrabajodegrado
norevisaproyectos,solamentemiralainformacindelproyecto,quieneseldirector,etc,yasignalos
jurados.
Deberaseralgocomo:
Frmrevisarproyectos.aspx
LatablaTbProyectos
CampoAutonumrico
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
133
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)
134
Eldiseodelformulario.Eldocentesolopodrverlosproyectosasignadosal.
Yporltimoelformulariodondeeldebersubirelproyectoconlascorreccionesylasobservaciones.
LatablaTbEvaluacionProyectos
Frmcalificarproyectos.aspx
135
136
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:
137
Una vez seleccionado el directorio, se procede a digitar el nombre con el que se creara (Ej:
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
.
138
Es indispensable la conexin con la base de datos que requerimos, para ello se debe dar clic en
el botn
Nueva conexin.
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
139
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).
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.
140
Una vez ingresados todos los requisitos de configuracin del servidor a continuacin podemos
.
probar la conexin dando clic en el botn
(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):
141
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
142
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
143
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
144
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
145
Una vez verificado cada uno de los componentes se procede a Compilar la solucin.
Reporting Service: trae la opcin de exportar el informe a formato EXCEL, PDF o WORD.
146
147
148
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.
Para que el objeto quede del tamao del formulario, seleccione la propiedad acoplar al
contenedor, quedar como se muestra a continuacin:
150
151
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
.
152
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.
153
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.
154
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.)
155
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
156
157
En la ventana de las tareas del componente se muestra la opcin Elegir orgenes de datos.
Seleccionar.
Verificar en el cdigo del formulario que el enlace de los datos este correcto.
158
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.
159
2. SQL SERVER
2.1.1 Qu es SQL?
Language
(entendida
en
espaol
como
Lenguaje
de
Consulta
160
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.
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
161
Tbcarros
con
los
siguientes
campos:
matricula,
marca,
modelo,
color,
Una vez hallamos hecho la consulta la ejecutamos lo podemos hacer dando F5 y nos
debe aparecer la siguiente informacin:
162
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:
163
El resultado sera:
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.
Especifica una condicin que debe cumplirse para que los datos sean devueltos por la
consulta. Admiten los operadores lgicos AND, OR y NOT.
164
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:
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.
165
Las condiciones de seleccin son las condiciones que pueden aparecer en la clusula
WHERE.
En SQL tenemos cinco condiciones bsicas:
Ejemplo:
Mostrar los carros que sean modelo mayor al 1996.
166
Ejemplo:
Consultar carros modelos entre 2000 y 2008.
Test de valor nulo: Una condicin de seleccin puede dar como resultado el valor
verdadero TRUE, falso FALSE o nulo NULL
Ejemplo
Resultado:
167
En este caso no sali ningn resultado por que el color lo dejamos como No Null.
Ejemplo:
Los comodines SQL pueden ser usados en la bsqueda de datos en una base de datos
pueden
sustituir
uno
ms
caracteres
cuando
se
busquen
los
datos
Los comodines deben usarse con el operador LIKE Se pueden usar con SQL los
siguientes comodines:
168
COMODN
%
_
[]
[^]
SIGNIFICADO
Cualquiercadenadeceroomscaracteres.
Cualquiercarcter.
Cualquiercarcterindividualdelintervalo(porejemplo[abcdef])especificado.
Cualquiercarcterindividualfueradelintervalo(porejemplo[^af)especificado.
Ejemplo
Ahora seleccionaremos los carros que empiecen con "ZM" la matricula.
169
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 JOIN
El LEFT / RIGHT JOIN
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:
170
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:
El resultado es:
171
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:
172
El INNER JOIN
El INNER JOIN 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 JOIN 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.
173
El resultado es:
174
El resultado es:
El resultado es:
175
AVG (expresin)
MAX (expresin)
STDEV (expresin)
COUNT (expresin)
STDEVP (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.
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
176
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.
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.
177
El resultado es:
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:
178
2.4 PROCEDIMIENTOSALMACENADOS
Un procedimiento almacenado (stored procedure en ingls) es un programa el cual es almacenado
fsicamenteenunabasededatos.Suimplementacinvaradeunmanejadordebasesdedatosaotro.
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
incluyenlavalidacinde datossiendointegradosalaestructuradebasededatos(losprocedimientos
almacenadosutilizadosparaestepropsitoamenudosonllamadosdisparadores;triggerseningls),o
encapsularunprocesograndeycomplejo.Elltimoejemplogeneralmenteejecutarmsrpidocomo
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
SQLyrecibiendosusresultados.Losprocedimientospuedenserventajosos:Cuandounabasededatos
esmanipuladadesdemuchosprogramasexternos.Alincluirlalgicadelaaplicacinenlabasededatos
utilizando procedimientos almacenados, la necesidad de embeber la misma lgica en todos los
programasqueaccedenalosdatosesreducida.Estopuedesimplificarlacreaciny,particularmente,el
mantenimientodelosprogramasinvolucrados.Podemosverunclaroejemplodeestosprocedimientos
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.
179
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
deentrada,sinembargosiel parmetroesdeentradasalida seincluyeal finallapalabrareservada
OUTPUT.
CREATE PROCEDURE NombreProcedimiento
@Param1 int,
@Param2 int,
@Param3 int OUTPUT
AS
BEGIN
-- aqui vienen las instrucciones del procedimiento almacenado
END
Ya veremos que los parmetros de cursor se utiliza una clusula diferente; por ltimo un parmetro
puedetenerunvalorporomisinademstambinhayquedecirquenohayunmarcadorqueindique
donde termina un procedimiento almacenado, muchas veces se coloca la palabra GO al final de cada
procedimientolocualconsideraqueelprocedimientotermina,antesdelapalabraGOohastaelfinal
delficheroloqueocurraprimero.EncerrarBEGINlaslneasdelprocedimientoentrelaspalabrasBEGIN
yEND(FinaldelProcedimiento).
2.4.2EjecutarUnProcedimientoAlmacenado
Se utiliza la instruccin EXECUTE y a continuacin espacio en blanco el nombre del procedimiento
almacenado sitienenparmetrossedebenaadir todoslosparmetrosseparadosporcomassedebe
repetirlaclusulaOUTPUTparapoderrecibirvaloresenunparmetrodesalidasinoseincluyeOUTPUT
habrtratadoelparmetroenunadireccindeentrada.
EXECUTE NombreProcedimiento
2.4.3FormaGeneraldeunProcedimientoAlmacenado
EnconclusinunProcedimientoalmacenadosecreaconlaspalabrasreservadasCREATEPROCEDUREa
continuacin el nombre, luego se colocan los parmetros con su tipo de dato. Se deben encerrar las
instruccionesentrelaspalabrasreservadasBEGINYENDluegosedebeejecutarelprogramaelcualse
almacenaenelServidor.
180
Enlasiguienteimagensepuedeverelejemplodeunprocedimientoalmacenado.
2.4.4ModificacindeunProcedimientoAlmacenado
ParamodificarelprocedimientoalmacenadosedeberealizarconlapalabraALTERdespusdelnombre
colocarlosparmetros.
181
Unrepasogeneral
182
183
Usos. Los usos 'tpicos' de los procedimientos almacenados se aplican en la validacin de datos,
integradosdentrodelaestructuradelbancodedatos.Losprocedimientosalmacenadosusadoscontal
propsitosellamancomnmentedisparadoresotriggers.Otro usocomnesla'encapsulacin'deun
APIparaunprocesocomplejoograndequepodrarequerirla'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
184
almacenados.Algunosafirmanquelasbasesdedatosdebenserutilizadasparaelalmacenamientode
datossolamente,yquelalgicadenegocioslodeberaseraplicadaenlacapadenegociodecdigo,a
travs de aplicaciones cliente que deban acceder a los datos. Sin embargo, el uso de procedimientos
almacenadosnoseoponealautilizacindeunacapadenegocio.
Acontinuacinnosdetenemosaexplicarlaformageneraldeunprocedimientoalmacenadoycomose
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.
185
Vamosacambiarunpoconuestroprocedimientoparaqueseamsflexiblenuestraconsulta,vamosa
decirlequenosfiltreporlosclientesingleses.Simplementeaadimoslaclusulaquesemuestra.
Comosehabamencionadoanteriormenteparaalterarunprocedimientoqueyaestcreadodebemos
emplearlasentenciaALTER
Procedemosaejecutarloynosdebemostrarquelohaejecutadocorrectamente.
Por cierto una manera de ver los procedimientos es dirigirse a la ventana de la derecha minimizamos
tabladandoclicenelsmbolo
186
Loquenosvaaaparecerestodoloquerepresentalabasededatos.
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.
Acontinuacinejecutamosclientessimplementeseleccionamosydamosejecutar.
EXECUTE Clientes
Nosdebemostraracontinuacin7filasycomolehabamosdichonosdebedevolverlosclientesingleses
nicamente los cuatro campos y esta filtrado como lo habamos indicado que lo realizara en la tabla
anterior.
187
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.
Noolvidemosagregarlosparmetrosparalosdebidosclientessegnlotengamosenlatabladeberan
sercomosemuestraenlaimagenyotroparmetrodeentradacolocandolapalabraALTER,elnombre
delavariable@Pas
Lo dems es lo mismo que lo que habamos hecho anteriormente lo nico que cambia es la clusula
Whereyesevalorseasociaalavariable@Pais
Ahora generamos un valor por defecto, se aade despus de la variable el valor por defecto, que el
stringseacualquiernumerooletras,fraseopalabra,laconsultaeslamisma.Ejecutamosclientesynos
debetraertodos.
188
Ejecuteelprocedimientoalmacenadoparacadacaso,yobservelosresultados.
Observeconlossiguientesejemplos:
Observequeocurreparacadacaso.
2.5TRIGGERSENTRANSACTSQL
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
establecelasesindeunusuario.Losdesencadenadoressepuedencreardirectamenteapartirde
instruccionesTransactSQLodemtodosdeensambladosquesecreanenMicrosoft.NETysecargan
en una instancia de SQL Server. SQL Server permite crear varios desencadenadores para una
instruccinespecfica.
2.5.1LosDesencadenadoresDML
Lasintaxisgeneraldeuntriggereslasiguiente.
189
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.
190
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.
191
Nosconectamosconnuestrousuarioycontrasea
Despus de habernos conectado procederemos con la creacin de una nueva base de datos llamada
MITRIGGERparaellodaremosclicderechoenBasedeDatosyclicenNuevabasededatos
AsignamoselnombredenuestrabasededatosydamosclicenAceptar.
Luegodehabercreadonuestrabasededatosprocederemosacrear2tablasdelasiguientemanera:
192
LaprimeratablasellamarCliente
DentrodelatablaClienteingresaremoslossiguientescampos.
IdCliente(pk,varchar(20)),
Nombre(varchar(20)),
Apellido(varchar(20)),
Direccion(varchar(20))
Unavezcreadalatablaingresaremos3datosdentrodelatabladelasiguienteforma:
193
UnavezingresadodatosdentrodeestatablaprocederemosconlacreacindelatablaNo.2
LasegundatablasellamaraPedidos
DentrodelatablaPedidosingresaremoslossiguientescampos.
IdCliente(pk,varchar(20)),
Nombre(varchar(20)),
Fecha(date)
UnavezcreadanuestrasegundatablaprocederemosconlaimplementacindenuestroTrigger.
ParaprocederconlaejecucindenuestroTriggervamosaabrirlaconsoladeconsultasoquerydela
siguientemanera:
ClicderechosobrelabasededatosyacreadayclicenNuevaconsulta.
Unavezingresadoalaventanadeconsultaprocederemosarealizarun:
194
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.
195
Realizandonuevamenteun:
Select * from Cliente
Select * from Pedidos
Enlastablaspodemosnotarqueannohaydatosnimodificaciones.
Porloqueprocederemosainsertarelsiguientecdigoynotarloscambiosquesevanaproducir
Una vez digitada seleccione toda la instruccin y de clic en el botn Ejecutar all aparecer como
resultado(1filasafectadas).
196
Finalmenterealizandonuevamenteun:
Select * from Cliente
Select * from Pedidos
Enambastablaspodremosobservarlamaneraenquesivieronafectadasmediantelautilizacindelos
TriggersenTransactSQL
197
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:
198
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 implcitas. Se inicia automticamente una nueva transaccin cuando se ejecuta una
instruccinquerealiza modificaciones en los datos, pero cada transaccin se completa
explcitamenteconunainstruccinCOMMIToROLLBACK.
Paraactivardesactivarelmododetransaccionesimplcitasdebemosejecutarlasiguienteinstruccin.
199
200
Elsiguienteejemplomuestraelmismoscriptcontransaccionesimplcitas:
201
La transaccin sigue activa hasta que emita una instruccin COMMIT o ROLLBACK. Una vez que la
primeratransaccinsehaconfirmadoorevertido,seiniciaautomticamenteunanuevatransaccinla
siguientevezquelaconexinejecutaunainstruccinparamodificardatos.
La conexin contina generando transacciones implcitas hasta que se desactiva el modo de
transaccionesimplcitas.
Podemosverificarelnmerodetransaccionesactivasatravsde@@TRANCOUNT.
202
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.
203
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
204
Delete
IfError
Rollback
Else
Commit
Datosimportantesparatenerencuenta
Lastransaccionespermitenagruparpasosfsicoscuandoserealizanmodificacionesenlasbasesde
datos.
Enlastransaccionesseconsolidancondosinstruccionesbsicas
COMMIT:Eslaconfirmacindelatransaccinparalamodificacindelosdatosdelabasededatos
ROLLBACK:Eslaqueanulacualquiermodificacinrealizadaalabasededatos.
2.6.4Ejerciciodetransacciones
IngresealServidormedianteelManagamentStudio.
CreeunabasededatosllamadaVentas,dentrodeellaunatablallamadaVentasigualmente,observela
imagenparavermejoreldiseo.
205
Ubqueseenestatablaydeclicenlaopcinde
Estonosllevaalasiguientepantalla.
Digitamoslasiguienteinstruccin:
Primeroprocedemosaseleccionarlainformacindelatablaventas
ydamosclickenejecutar
informacin
206
locualnospermiteverlasiguiente
Luegoejecutamosloscomandosdelatransaccin.
Empezamosporejecutar
ynosmuestralasiguienteinformacin.
Luegoejecutamoselupdate.
Como podemos ver tenemos 1 fila afectada si deseamos confirmar la operacin seleccionamos la
instruccinCOMMIT,yejecutamoslainstruccin.
Sinodeseamosrealizarelcambio
DebemosseleccionarlainstruccinROLLBACKyejecutarla.
207
Loquerevierteloscambiosrealizados.
2.7FUNCIONESENTRANSACTSQL
Unafuncin definidapor elusuarioesunarutinadeTransactSQLqueaceptaparmetros,realizauna
accin,comounclculocomplejo,ydevuelveelresultadodeesaaccincomounvalor.Elvalordevuelto
puedeserunvalorescalar(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
Estafuncinpermitedevolverunsolovalor,sonparecidasalasfuncionesqueseutilizandentrodelos
lenguajesdeprogramacinseutilizanparaclculosbsicosmatemticosyaquedevuelvenunsolovalor
esdecirunescalar.Lafuncinseconformadelasiguienteforma:
Create Function Nombre de la Funcin (@parametros
parmetro)
Returns Tipo de retorno
208
recibidos
tipo de
as
Begin
Declare variables que necesitamos tipo de variable
Sentencias a ejecutar con las variables y los parmetros que
recibimos
Return variable que retornamos
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.
209
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:
210
Paraquelafuncionseaalmacenadaenlabasededatosseseleccionaysedaclickenejecutar.
Parallamarlafuncinyserejecutadaseconstruyeunqueryconlasiguientesintaxis:
Select*fromnombre_funcion(parametro)
ParaserejecutarelQueryseseleccionaysedaclickenejecutaryenlaparteinferiorsemuestranlos
resultados.
2.7.3Funcionesconvaloresdetablaenlinea
Sonigualesqueunafuncinconvaloresdetabladevariasinstruccionessoloquesuconstruccinesalgo
diferentepuesnosedefinenvariablesdetipoTableynoesnecesarioutilizarlaspalabrasBeginyEnd.
Lafuncinseconformaas:
CreatefunctionNombre_funcion(@parametrosrecibidostipodeparmetro)
Returnstable
As
Return(selectcampos_tablafromtablawherecampo_validacion=@parametrosrecibidos)
211
Paraquelafuncionseaalmacenadaenlabasededatosseseleccionaysedaclickenejecutar.
Parallamarlafuncinyserejecutadaseconstruyeunqueryconlasiguientesintaxis:
Select*fromnombre_funcion(parametro)
ParaserejecutarelQueryseseleccionaysedaclickenejecutaryenlaparteinferiorsemuestranlos
resultados.
Hacertodoelcapitulodefunciones
212
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.
ElcomandoFETCHpermitecambiarlaposicinactualdelcursor,moviendosuposicinunaomsfilas
enelconjuntoderesultadosdelcursor.
2.8.1VentajasdelosCursores
Amplanelprocesamientodelosresultadosporque:
Permitensituarseenfilasespecficasdelconjuntoderesultados.
Recuperanunafilaobloquedefilasdelaposicinactualenelconjuntoderesultados.
Aceptan modificaciones de los datos de las filas en la posicin actual del conjunto de
resultados
Aceptandiferentesgradosdevisibilidadparaloscambiosquerealizanotros usuariosenla
informacindelabasededatosquesepresentaenelconjuntoderesultados.
Proporcionan instrucciones de TransactSQL en secuencias de comandos, procedimientos
almacenadosyaccesodedesencadenadoresalosdatosdeunconjuntoderesultados.
2.8.2EstructuradeunCursor
Enelsiguientediagramadeflujosepresentalasecuencialgicaquesigueladeclaracinyejecucinde
uncursor.
213
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.
214
SCROLL: Especifica que estn disponibles todas las opciones de captura (FIRST, LAST, PRIOR, NEXT,
RELATIVE,ABSOLUTE).SinoseespecificaSCROLLenunainstruccinDECLARECURSORdeISO,lanica
opcindecapturaqueseadmiteesNEXT.
Ejemplo:
SintaxisExtendidaTransactSQL.
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.
215
Ejemplo:
SinoseespecificaGLOBALniLOCAL,elvalorpredeterminadosecontrolamediantelaconfiguracinde
laopcindebasededatosdefaulttolocalcursor.
DeclaracindelosArgumentosFORWARD_ONLYySCROLL
FORWARD_ONLY.Especificaqueelcursorslosepuededesplazardelaprimeraalaltimafila.FETCH
NEXTeslanicaopcinderecuperacinadmitida.
Ejemplo:
SCROLL.Especficaqueestndisponiblestodaslasopcionesderecuperacin(FIRST,LAST,PRIOR,NEXT,
RELATIVE,ABSOLUTE).SinoseespecificaSCROLLenunainstruccinDECLARECURSORlanicaopcin
derecuperacinqueseadmiteesNEXT.
Ejemplo:
216
DeclaracindelosArgumentosSTATIC,KEYSET,DYNAMICyFAST_FORWARD
STATIC.Defineuncursorquehaceunacopiatemporaldelosdatosquevaautilizar.Todaslassolicitudes
queserealizanalcursorserespondendesdelatablatemporaldetempdb;portanto,lasmodificaciones
realizadasenlastablasbasenosereflejanenlosdatosdevueltosporlasoperacionesderecuperacin
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:
Ejemplo:
217
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:
Ejemplo:
OPTIMISTIC. Especfica que las actualizaciones o eliminaciones posicionadas realizadas a travs del
cursornoserealizarncorrectamentesilafilasehaactualizadodespusdeserledaenelcursor.Sila
fila se ha modificado, el intento de actualizacin o eliminacin posicionada genera un error. No es
posibleespecificarOPTIMISTICsiseespecificatambinFAST_FORWARD.
Ejemplo:
TYPE_WARNING.Especficaqueseenvaunmensajedeadvertenciaalclientesielcursorseconvierte
implcitamentedeltiposolicitadoaotro.
Ejemplo:
218
CompatibilidadentreArgumentos
Sepuedeespecificarmltiplesparmetrosenlaaperturadecursor,peronicamenteunparmetrode
cadagrupo.Porejemplo:
Secomparalacompatibilidaddetodosloscursores,paraascrearlosconcadaunodelosargumentos
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.
219
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.
220
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
laprimeraoperacinde captura que serealizaen uncursor,nosedevuelvenfilas.ndebeseruna
constanteenteray@nvardebesersmallint,tinyintoint.
CLOSE. Cierra un cursor abierto mediante la liberacin del conjunto de resultados actual y todos los
bloqueosdecursormantenidosenlasfilasenlasqueestcolocado.CLOSEdejalasestructurasdedatos
accesiblesparaquesepuedanvolveraabrir,perolascapturasylasactualizacionesposicionadasnose
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_namehacereferenciaalcursorglobalsiseespecificaGLOBALy,sino
seespecificaGLOBAL,hacereferenciaalcursorlocal.
@cursor_variable_name:Nombredeunavariablecursor.Debeserdetipocursor.
221
VariablesGlobales@@CURSOR_ROWS,@@FETCH_STATUSylafuncinCURSOR_STATUS
@@CURSOR_ROWS.Devuelveelnmerodefilascorrespondientesactualmentealltimocursorabierto
enlaconexin.Puedellamara@@CURSOR_ROWSparadeterminarqueelnmerodefilasquecumplan
lascondicionesdelcursorserecuperenenelmomentoenquesellamaa@@CURSOR_ROWS.
Valordevuelto
Descripcin
Elcursorserellenadeformaasincrnica.Elvalordevuelto(m)eselnmerode
filasquecontieneactualmenteelconjuntodeclaves.
Elcursoresdinmico.Comoloscursoresdinmicosreflejantodosloscambios,el
nmerodefilascorrespondientesalcursorcambiaconstantemente.Nuncase
puedeafirmarquesehanrecuperadotodaslasfilasquecorrespondan.
Nosehanabiertocursores,nohayfilascalificadasparaelltimocursorabierto,
ostesehacerradoosuasignacinsehacancelado.
Elcursorestcompletamenterelleno.Elvalordevuelto(n)eselnmerototalde
filasdelcursor.
Ejemplo
EnesteejemplosedeclarauncursoryseutilizaSELECTparamostrarelvalorde@@CURSOR_ROWS.La
opcintieneelvalor0antesdeabrirelcursor;elvalor1indicaqueelconjuntodeclavesdelcursorse
estllenandodeformaasincrnica.
222
Valordevuelto
Descripcin
LainstruccinFETCHseejecutcorrectamente.
LainstruccinFETCHnoseejecutcorrectamenteolafilaestaba
msalldelconjuntoderesultados.
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.
Cuandovuelveelcontroldesdeelprocedimientoalmacenadollamado,@@FETCH_STATUSreflejarla
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'})
223
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
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.
Elcursorestcerrado.
Elcursorasignadoaestavariableestcerrado.
Noaplicable.
Puedeser:
Elprocedimientollamadoanteriormentenoha
asignado ningn cursor a esta variable
OUTPUT.
El procedimiento llamado anteriormente
asignuncursoraestavariableOUTPUT,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.
*Loscursoresdinmicosnodevuelvennuncaesteresultado.
224
DeclaracinCursorForUpdate
ParaactualizarlosdatosdeuncursordebemosespecificarFORUPDATEdespusdelasentenciaSELECT
enladeclaracindelcursor,yWHERECURRENTOF<nombre_cursor>enlasentenciaUPDATE.
Ejemplo:
Declaracindevariablesparaelcursor
Declaracindelcursor
Aperturadelcursor
Lecturadelaprimerafiladelcursor
Lecturadelasiguientefiladelcursor
225
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
Losprocedimientosalmacenadosresultantilesparalamanipulacindecursores,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.
226
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
dedatosrelacional,sehacenecesarialaimplementacindeunaherramientaquesoportelacapacidad
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):
227
LainstruccinEXECUTEosimplementeEXEC
Elprocedimientoalmacenadosp_executesql
INSTRUCCIN EXECUTE: permite ejecutar una cadena de caracteres de tipo nvarchar que representa
unasentenciaSQL.
ElsiguienteejemplomuestracomoejecutarunacadenadecaracteresconlainstruccinEXEC.
Alejecutarlasentenciaelresultadoeselsiguientesegnlosdatosdelejemplo:
TambinconSQLdinmicopodemosejecutarsentenciasdetipoDDL(DataDefinitionLanguaje),como
CREATETABLE,DROP,ALTER.Acontinuacinsepresentaunejemplo.
228
Alejecutarlasinstruccioneselresultadoobtenidoeselsiguiente:
2.9.1ProcedimientoAlmacenadoSP_EXECUTESQL
Paraejecutarsqldinmico,serecomiendautilizarelprocedimientoalmacenadosp_executesql,enlugar
deunainstruccinEXECUTE.
sp_executesqladmitelasustitucindeparmetros
sp_executesqlesmsseguroyverstilqueEXECUTE
sp_executesqlgeneraplanesdeejecucinconmsprobabilidadesdequeSQLServerlosvuelva
autilizar,esmseficazqueEXECUTE.
229
Enelsiguienteejemplosemuestraeluso(muysimple)desp_executesql.
Alejecutarlasentenciaelresultadoeselsiguientesegnlosdatosdelejemplo:
sp_executesqladmitelasustitucindevaloresdeparmetrosparacualquierparmetroespecificadoen
la cadena TransactSQL a ejecutar. El siguiente ejemplo muestra el uso de sp_executesql con
parmetros:
Alejecutarlasentenciaelresultadoeselsiguientesegnlosdatosdelejemplo:
230
2.10CERTIFICADOSDIGITALES
Muybreveresumendelahistoriadelacriptografa
Enlahistoriadesdehacemilesdeaosqueelhombretratadeocultarsusmensajesyescritosdeojosa
loscualesnodeseamostrarsucontenido,yparaestoencriptaestostextosutilizando,enunprincipio,
mtodossencillosqueincluanelusodelpiz,papeloalgunamquinasencilla.Luego,aprincipiosdel
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).
231
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
cifradoenbloquesesinapropiadoporquelosflujosdedatosseproducenentiemporealenpequeos
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
sobrelaclaveautilizary,unavezqueambastienenaccesoaestaclave,elremitentecifraelmensaje
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
criptogrficosgarantizanqueesepardeclavesslosepuedegenerarunavez,demodoquesepuede
asumirquenoesposiblequedospersonashayanobtenidocasualmenteelmismopardeclaves.
Sielremitenteusalaclavepblicadeldestinatarioparacifrarelmensaje,unavezcifrado,slolaclave
privadadeldestinatariopodrdescifrarestemensaje,yaqueeselnicoquelaposee.Porlotantose
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
232
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.
233
Unadelascertificacionesmsusadasyunestndarenlaactualidadeninfraestructurasdeclavepblica
PKIs(PublicKeyInfrastructure)esX.509ensuversin3.
Certificado digital X.509. X.509 es un estndar publicado oficialmente en 1988 que especifica, entre
otrascosas,formatosestndaresparacertificadosdeclavespblicasyunalgoritmodevalidacindela
rutadecertificacin.
EnX.509sedefineunacapadeabstraccinparasuministrarserviciosdeautenticacinalosusuariosde
undirectorioX.500.
Enlaactualidadesampliamenteutilizadoelformatode certificadodigitalX.509v3,porejemplo,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
234
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
Lafirmadigitalhacereferenciaaunmtodocriptogrficoqueasocialaidentidaddeunaentidad(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).
235
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
repostoriopersonal(My).Tambintenemosqueelegirlaubicacindelcertificado,esdecir,sivamosa
quererconsultarloscertificadosqueestnaniveldemquinaodeusuario.Tenganencuentaquesivan
autilizarlaclaseX509StoredesdeASP.NETdebenleerloscertificadosqueestnaniveldemquina,ya
queelusuarioASP.NETraravezvaateneralgncertificadoinstalado.
LuegodeelegidoelrepositorioquequeremosabrirdebemosutilizarelmtodoOpenparaqueconsulte
almismo.
236
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:
237
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();
}
}
}
Ejecutelaaplicacincon F5yobservelosresultados.Selistaporconsolaelrepositoriodecertificados
digitalesquehayenelcomputador.
238
2.10.3Consultarlainformacindelcertificadoysusextensiones
Cadacertificadoposeeunaseriededatos.Ademsdeestosdatosloscertificadosposeenextensiones,
que definen distintos posibles usos dependiendo de las mismas, y segn la extensin poseen distintos
datosalmacenados.Porejemplo,enlaextensindeltipo2.5.29.37(tambinllamadaEnhancedKey
Usage)seguardacualvaasereldestinodelcertificado,porejemploparaautenticacindelcliente.
Estas extensiones estn en la coleccin Extensions del certificado, y para obtener la informacin
almacenadadebecastearsesegneltipodelmismo.Parasaberqutipodeextensineslaalmacenada
sepuedeleerlapropiedadOid,lacualdevuelvelaclasehomnimaquerepresentaunidentificadorde
un objeto criptogrfico (cryptographic object identifier) y luego, de este objeto, podemos leer la
propiedadFriendlyNameparaobtenerelnombredelaextensin.
Acontinuacinhayuncdigodeejemplodondesemuestralainformacindeuncertificado:
239
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+')');
240
}
}
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).
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
241
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
242