Está en la página 1de 241

MICROSOFT VISUAL

2010 (ASP.NET) Y
SQL SERVER

MICROSOFT VISUAL 2010


(ASP.NET) Y
SQL SERVER

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

FABIAN BLANCO GARRIDO.


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

Microsoft Visual Studio 2010 (ASP.NET) y SQL Server


Fredys A. Simanca Herrera Fabin Blanco Garrido

Los autores han intentado a lo largo de este libro distinguir las marcas registradas, sin
intencin de infringir la marca y solo en beneficio del propietario de la misma.
Reservados todos los derechos de publicacin de este libro.
Ninguna parte de este libro puede ser reproducida, grabada en sistemas de
almacenamiento o transmitida en ninguna forma ni por cualquier procedimiento, ya
sea electrnico, mecnico, por fotocopia, magntico o por otro mtodo, sin el permiso
previo o por escrito de los autores del Copyright.

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


Fabin Blanco Garrido
Bogot D.C. Abril de 2013.

Agradecimientos

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.

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


RegularExpresionValidator,CompareValidatoryporltimoValidationSumary.
ControlToValidator

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.

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


(mtodos),quepuedenserutilizadosdesdeotrosprogramas.

1.5.1CaractersticasdelosServiciosWeb

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

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

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


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

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

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


navigateUrlseleccionamosCreateacount.aspx

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.

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


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

Cambielaspropiedadesdeloscontroles.

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.

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


confirmacindeeliminacindelosregistros.

Lavistageneraldelformulariodebequedarcomoseobservaenlaimagen.

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

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.

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


informacinrespectoalcomitdetrabajosdegrado.

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.

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


continuacin.

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

Unavalidacinque debeiraqu,peroqueporcuestionesdidcticasnoseincluye,sedeja comotarea


extraclasealestudianteesquenosedebepermitiringresarmsdetresestudiantesaunapropuesta.

Paraterminar,declicenelbotnTerminar.

ElprocesoparaelUpLoaddelosproyectosesigualaeste,serecomiendacrearunacarpetaparaproyectos,
haymuchasvalidacionesycontrolesquesedebendetenerpresenteenesteformulario,perosesiguen
dejandoparatrabajoextraclase.

Comoyahemosingresadolaspropuestas,volvemosalperfildeadministrador,paracompletar lasdos
opcionesqueestnpendiente,RevisarPropuestasyRevisarProyectos.

OpcinPropuestas

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


masteradmin.master.

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

Enelpage_loadiraelsiguientecdigo.

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.

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


diseo.

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

1.9 GENERACIN DE REPORTES


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

En la siguiente interfaz se muestra un conjunto de plantillas entre las cuales se encuentra la


opcin Reporting, una vez se selecciona esta, se presentar un recuadro y all se elegir
trabajar: Aplicacin de informe (es lo mismo para lenguaje C# o VB).

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.

Reportes) y luego damos clic en el botn

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

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

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 ventana de configuracin de la conexin se presenta la opcin

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

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).

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


usuario y el password.

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

140

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

Si la conexin es satisfactoria, damos clic en el botn


en el botn

de la prueba de conexin y clic

de la ventana de configuracin de la nueva conexin.

(Se puede desplegar la opcin cadena de conexin para ver la cadena del datasource para la
conexin a la base de datos, como se muestra en la siguiente imagen):

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

, con el anterior paso se presentara un asistente para elaborar el


Al dar clic en
informe, en este se observan los campos de la tabla que deben ser parametrizados y sern
incluidos en el informe.

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

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

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

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

145

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

El reporte se presenta de la siguiente forma:

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

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

146

Informe en formato Word:

Informe en formato PDF:

Informe en formato EXCEL

147

1.10 GENERACIN DE GRFICOS


Para este proceso, el manejo de graficas con Reporting service, generalizando bsicamente se
aconseja seguir los siguientes pasos:
1. Creacin de consulta en Microsoft SQL Server 2010 con el fin de que retorne los datos que
se requieren mostrar en la grfica del reporte.
2. Creacin de proyecto en Visual Studio 2010.
3. Agregar objeto reportViewer al formulario del proyecto.
4. Agregar el origen de datos.
5. Agregar un nuevo elemento reporte .rdlc al proyecto.
6. Agregar el objeto grafica en el diseo del reporte.
7. Asociar campos a la grfica.
8. Asociar reporte y origen de datos al objeto reportViewer
9. Finalmente compilar el proyecto.
A continuacin se presenta una gua y la descripcin de los pasos anteriormente mencionados:
Creacin de consulta en Microsoft SQL Server 2008 con el fin de que retorne los datos
que se requieren mostrar en la grfica del reporte.
Agregar un nuevo procedimiento almacenado en la base de datos sobre la cual se trabajara
para extraer los datos que se vern en el reporte. Para adicionar un nuevo procedimiento
almacenado en el ambiente SQL Server Management Studio, expandir los objetos de la base de
datos, expandir opcin Programacin, dar clic derecho sobre:
y
seleccionar
Procedimientos Almacenados.

. Para mayor informacin vaya al apartado de

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.

Creacin de proyecto en Visual Studio 2010


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

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


149

Agregar objeto reportViewer al formulario del proyecto.


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

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

Agregar el origen de datos


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

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
.

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


DataSet.

En el diseador del DataSet se encuentra la opcin o link de ir al Explorador de servidores, este


presentara la lista de conexiones a base de datos configurada con anterioridad.

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

Agregar nuevo elemento reporte .rdlc al proyecto.


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

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

154

Agregar un objeto grafica en el diseo del reporte.


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

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

155

Asociar los campos a la grafica


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

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

156

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


LogBase=nmero de escala.

Asociar reporte y origen de datos al objeto reportViewer


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

157

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

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

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

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.

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

159

2. SQL SERVER

2.1 INTRODUCCIN A SQL

2.1.1 Qu es SQL?

La sigla que se conoce como SQL corresponde a la expresin inglesa Structured


Query

Language

(entendida

en

espaol

como

Lenguaje

de

Consulta

Estructurado), la cual identifica a un tipo de lenguaje vinculado con la gestin de bases


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

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.

2.2 LAS CONSULTAS SIMPLES.

2.2.1 Sintaxis de la SELECT (para consultas simples)

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

Seleccin de columnas

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

161

Tbcarros

con

los

siguientes

campos:

matricula,

marca,

modelo,

color,

numero_kilometros de la siguiente manera:

Con los siguientes datos en la tabla:

La consulta que se va a realizar es que a partir de la tabla Tbcarros vamos a recuperar


nicamente los campos de matrcula, marca, color, para ellos debemos ejecutar la
siguiente consulta. Para crearla le podemos dar clic derecho a la base y nos aparecer
una opcin que dice New Query.

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

162

2.2.2 Ordenar las filas (ORDER BY)

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

El resultado debe ser el siguiente:

Si nos damos cuenta lo ha organizado en orden alfabtico segn la marca.


2.2.3 Las clusulas DISTINCT / ALL
La sentencia DISTINCT Indica que queremos seleccionar slo los valores distintos a
una referencia y la referencia ALL indica que queremos seleccionar todos los valores.
Es el valor por defecto y no suele especificarse casi nunca.

163

El resultado sera:

2.2.4 La clusula TOP

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

2.2.5 La clusula WHERE

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

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:

Y el resultado sera el siguiente:

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

Operadores permitidos en la sentencia WHERE

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

165

2.2.5 Condiciones de seleccin

Las condiciones de seleccin son las condiciones que pueden aparecer en la clusula
WHERE.
En SQL tenemos cinco condiciones bsicas:

Test de comparacin: Compara el valor de una expresin con el valor de otra.


= igual que
<> distinto de
< menor que
<= menor o igual
> mayor que
>= mayor o igual

Ejemplo:
Mostrar los carros que sean modelo mayor al 1996.

Test de rango: Examina si elvalorde la expresin estcomprendidoentrelosdos


valoresdefinidos por exp1 y exp2. (Between).

166

Ejemplo:
Consultar carros modelos entre 2000 y 2008.

Test de pertenencia a un conjunto: Examina si elvalorde la expresin es uno de


los valoresincluidosenlalistade valores.

Test de valor nulo: Una condicin de seleccin puede dar como resultado el valor
verdadero TRUE, falso FALSE o nulo NULL

Ejemplo

Consultar los carros que no tiene registrado color.

Resultado:

167

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

Test de correspondencia con patrn: Se utiliza cuando queremosutilizar


caracteres comodinespara formar el valor con el compara

Ejemplo:

Consultar todos los carros que sean Nissan:

2.2.6 Caracteres Comodines

Los comodines SQL pueden ser usados en la bsqueda de datos en una base de datos
pueden

sustituir

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.

2.3 LAS CONSULTAS MULTITABLA

2.3.1 La unin de tablas


Esta operacin se utiliza cuando se tienen dos tablas con las mismas columnas y se quiere
obtener una nueva tabla con las filas de la primera y las filas de la segunda.
Cuando se habla de tablas pueden ser tablas reales almacenadas en la base de datos o tablas
lgicas (resultado de una consulta), esto permite utilizar la operacin con ms frecuencia ya
que pocas veces se tiene en una base de datos tablas idnticas en cuanto a columnas. El
resultado siempre es una tabla lgica.
El operador que permite realizar esta operacin es el operador UNION.

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:

Se utiliza el operador UNION

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 resultado implementando el producto cartesiano es el siguiente:

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:

El LEFT JOIN y el RIGHT JOIN


El LEFT JOIN y RIGHT JOIN son otro tipo de composicin de tablas, tambin denominada
composicin externa. Son una extensin del INNER JOIN.
La sintaxis del LEFT JOIN es la siguiente:
FROM tabla1 LEFT JOIN tabla2 ON tabla1.col1 comparar tabla2.col2
La descripcin de la sintaxis es la misma que la del INNER JOIN, lo nico que cambia es la
palabra INNER por LEFT (izquierda en ingls).
Esta operacin consiste en aadir al resultado del INNER JOIN las filas de la tabla de
la izquierda que no tienen correspondencia en la otra tabla, y rellenar en esas filas los campos
de la tabla de la derecha con valores nulos.
En el siguiente ejemplo se busca traer tambin las materias que no est viendo ningn
estudiante.

174

El resultado es:

La sintaxis del RIGHT JOIN es la siguiente:


FROM tabla1 RIGHT JOIN tabla2 ON tabla1.col1 comparar tabla2.col2
La sintaxis es la misma que la del INNER JOIN, lo nico que cambia es la palabra INNER
por RIGHT (derecha en ingls).
Esta operacin consiste en aadir al resultado del INNER JOIN las filas de la tabla de la
derecha que no tienen correspondencia en la otra tabla, y rellenar en esas filas los campos de
la tabla de la izquierda con valores nulos.
En el siguiente ejemplo se busca traer solamente las materias que estn viendo ningn
estudiante.

El resultado es:

175

2.3.3 Las funciones de Columna

En la lista de seleccin de una consulta de resumen aparecen funciones de columna tambin


denominadas funciones de dominio agregadas. Una funcin de columna se aplica a una
columna y obtiene un valor que resume el contenido de la columna.
Las siguientes son funciones de columna:
SUM (expresin)
MIN (expresin)

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.

StDev() y StDevP() calculan la desviacin estndar de una poblacin o de una muestra de la


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

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

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.

Seleccin en el origen de datos


El origen de datos se encuentra en la clusula FROM la cual es una lista separada por comas
de nombres de tablas, nombres de vistas y clausulas JOIN.
Si queremos eliminar del origen de datos algunas filas, basta incluir la clusula WHERE que
ya conocemos despus de la clusula FROM.

Origen mltiple
Si los datos que necesitamos utilizar para obtener el resumen se encuentran en varias tablas,
se debe formar el origen de datos adecuado en la clusula FROM como si fuera una consulta
multitabla normal.
2.3.4 La clusula GROUP BY
Agrupa un conjunto de filas seleccionado en un conjunto de filas de resumen de acuerdo con
los valores de una o ms columnas o expresiones. Se devuelve una fila para cada grupo. Las
funciones de agregado de la lista de seleccin de la clusula SELECT proporcionan informacin
sobre cada grupo en lugar de filas individuales.
La clusula GROUP BY tiene una sintaxis que cumple la norma ISO y otra sintaxis que
no cumple dicha norma. Solo se puede usar un estilo de sintaxis en cada instruccin SELECT.

177

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


semestre:

El resultado es:

2.3.5 La clusula HAVING

Especifica una condicin de bsqueda para un grupo. HAVING solo se puede utilizar con la
instruccin SELECT. Normalmente, HAVING se utiliza en una clausula GROUP BY. Cuando no
se utiliza GROUP BY, HAVING se comporta como una clausula WHERE.
En el ejemplo siguiente, donde se utiliza una clausula HAVING simple, se recupera el total de
cada promedio de estudiante por semestre que obtuvo ms del 3,0.

El resultado es:

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.

Despus de observar esto


desplegamos el men de
programacin dando clic
enelsmbolo+

Despus de esto debemos desplegar el men denominado Procedimientos Almacenados luego


buscamoselprocedimientoClientes.

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

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


brasileos,segnseaelcaso.

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

188

Ejecuteelprocedimientoalmacenadoparacadacaso,yobservelosresultados.

Observeconlossiguientesejemplos:

EXECUTE Clientes 's%'


EXECUTE Clientes '[a-d]%'
EXECUTE Clientes '%p%'

Observequeocurreparacadacaso.

2.5TRIGGERSENTRANSACTSQL

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


automticamentecuandoseproduceuneventoenelservidordebasesdedatos.

Los desencadenadores DML se ejecutan cuando un usuario intenta modificar datos mediante un
evento de lenguaje. Los eventos DML son instrucciones INSERT, UPDATE o DELETE de una tabla.
Estos desencadenadores se activan cuando se desencadena cualquier evento vlido, con
independenciadequelasfilasdelatablaseveanonoafectadas.
Los desencadenadores DDL se ejecutan en respuesta a una variedad de eventos de lenguaje de
definicin de datos (DDL). Estos eventos corresponden principalmente a instrucciones CREATE,
ALTERyDROP.
Los desencadenadores logon se activan en respuesta al evento LOGON que se genera cuando se
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

Select * from Cliente


Select * from Pedidos

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 explcitas. Cada transaccin se inicia explcitamente con la instruccinBEGIN


TRANSACTIONyseterminaexplcitamenteconunainstruccinCOMMIToROLLBACK.

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

Paraactivardesactivarelmododetransaccionesimplcitasdebemosejecutarlasiguienteinstruccin.

199

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


estableceenON.
Elsiguienteejemplomuestraelscriptanteriorhaciendousodetransaccionesexplicitas.

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:

Create Function Nombre de la Funcin (@parametros recibidos tipo de


parmetro)
Return @variable table(Campos de la tabla que de va a recibir)
As
Begin
Insert @ variable select campos_tabla from tabla where
campo_validacion=@parametros recibidos
Return
End

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.

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


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

DeclaracindelosArgumentosGlobalyLocal

Local.Especficaqueelmbitodelcursoreslocalparaelprocesoporlotes,procedimientoalmacenadoo
desencadenadorenquesecreelcursor.

Ejemplo:

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

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:

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


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

Ejemplo:

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:

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


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

Ejemplo:

OPTIMISTIC. Especfica que las actualizaciones o eliminaciones posicionadas realizadas a travs del
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

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


cualquiercursorquelaconexinhayaabierto.

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.

El conjunto de resultados del cursor est Elcursorasignadoaestavariableestabierto,


vaco.*
pero el conjunto de resultados est
definitivamentevaco.*

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.

No existe ningn cursor con el nombre Noexisteunavariabledecursorconelnombre


indicado.
indicado o, si existe, no tiene todava ningn
cursorasignado.

*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).

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


ustedestenganunoensuempresaotenganuntokeninstaladoensucomputador).

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


System.Security.Cryptography.Pkcs;),poralgunaraznenCSharpnoquisofuncionar,porconsiguiente
creeunproyectousandocdigoVisualBasicyacontinuaciningreseelsiguientecdigo.

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

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

También podría gustarte