Вы находитесь на странице: 1из 30

EltutorialdeVBMySQLParte1

PorMikeHillyer ltimaactualizacin:4deFebrero,2005 IralforodeesteArtculo 1.Introduccin 2.EleccindeunaAplicacin 3.ListadodeRequerimientosyCaractersticas ElTringulodeDesarrollo 4.DiseodeEntidades Usuarios Grupos Eventos 5.EntidadesyRelaciones 6.DiseodelaBasedeDatos EleccindeunaClavePrimaria EleccindelosNombresdeCampoyCamposRequeridos RelacionesUnoaMuchos RelacionesMuchosaMuchos 7.NormalizandolaBasedeDatos PrimeraFormaNormal SegundaFormaNormal TerceraFormaNormal 8.EleccindelosTiposdeColumnasyArmadodeSentenciasCREATETABLE NOTNULL,DEFAULT,AUTO_INCREMENTyPRIMARYKEY CHARvs.VARCHAR AlmacenamientodeNmerosTelefnicos ColumnasENUM ColumnasdeFecha CamposTIMESTAMP ClavesPrimariasCompuestas DefinicindelasTablasRestantes 9.Conclusin Introduccin

Sibienlosartculosdevbmysql.comhantenidounabuenarecepcin,siemprehayalgonuevoparaexponer. Cadasemanamelleganpedidosdenuevosartculosycdigosdeejemploqueexpliquenalgnaspectonuevo delautilizacindeVisualBasicyMySQL.Unodelospedidosrecurrenteshasidoeldeuntutorialqueexplique lacreacindeunaaplicacin,desdeeldiseohastalaimplementacin,utilizandoVisualBasicyMySQL.En respuestaaestospedidos,heescritoesteartculocomoelprimerodeunaseriedeartculosqueproporcionarn unaguacompletaparalacreacindeunaaplicacinconVisualBasic.NETyMySQL.Explicareldiseode aplicaciones,diseodebasesdedatos,programacinconbasesdedatosenVB.NETylaimplementacindela aplicacinterminada. Estetutorialsermuyprctico,documentandolacreacindeunaaplicacinrealqueluegoestardisponible paraserdescargadayaseaenformabinariaoencdigofuenteparareferenciafutura.Losarchivosintermedios estarndisponiblesalfinaldecadaseccindeltutorialparaquesefamiliaricenconelproyectoamedidaque vayamosprogresando. Enestaprimeraentregadelaseriecomentareldiseodelabasededatosdenuestraaplicacin.Unabasede datosbiencreadapuedesercrticaparaelxitodetuproyectodebasededatos,permitiendolacapacidadde expansinyescalabilidad,ademsdefacilitareldesarrollo.Enestetutorialdescribirlospasosaseguirpara comenzarconeldiseodelaaplicacin,luegoseguirconeldiseodelabasededatosyterminarconla escrituradelassentenciasdecreacindetablas. EleccindeunaAplicacin Loprimeroquenecesitamosalcrearunaaplicacinesunrequerimiento.Losprogramasdecomputadorasse creanparasatisfacerrequerimientosdelosusuariosdeaplicaciones.Enmioficinatenemosmuchosempleados, loscualespuedenestaronoenlaoficinaenunmomentodado.Enlaactualidad,utilizamosunasimpleaplicacin queregistraquempleadosestnenlaoficinaymuestraunpequeomensajeconaquellosquenoestn, indicandocundoregresarn. Estetipodesoftwarederegistrodeentradasysalidasesmuycomn,peroestetipodeaplicacionestienen generalmentedoslimitacionesmuchasdeestasaplicacionesestnlimitadassloaunciertonmerodeusuarios, normalmentealrededorde50100.Adems,estasaplicacionesutilizanamenudoarchivosplanos(flatfiles)para almacenarinformacin,requiriendoquecadausuariotengaaccesoaundirectorioderedcompartidoparapoder usarelsistema.EstasdoslimitacionespuedenvencerseutilizandounabasededatosSQL(eningls, pronunciadoessqueell,nosequel).Silaaplicacinqueusamosenlaoficinatuviesesucdigofuente disponible,unaopcinseramodificarla(lalibertadparamodificarunaaplicacinqueseajusteatusnecesidades esunodelosbeneficiosdelsoftwareyherramientasOpenSource).Dadoquelaaplicacinencuestines relativamentesimple,hepreferidorehacerlautilizandoVisualBasicyMySQL. Laideaparatuaplicacinpuedevenirdeldeseodecrearunamejorratoneradesarrollarunaversinmejor deunaaplicacinexistente.Porotraparte,quizsnecesitesunaaplicacinperonopuedasencontrarun proyectoexistenteapropiado.Finalmente,laideapuedeserdeotrapersona,yaseaunclienteotuempleador. Encualquiercaso,elprimerpasoaldesarrollarunaaplicacinesdecidirquaplicacincrear. ListadodeRequerimientosyCaractersticas Unavezquehayaselegidoquaplicacinvasadesarrollar,esimportantedecidirespecficamentequesloque harlaaplicacin.Debersdefinirlasfuncionesbsicasademsdeciertascaractersticasqueimplementarel software.Siestsdesarrollandoestesoftwareparatimismo,estepasodelprocesodedesarrollopuedeser

bastanteinformal,peronodejadeserimportante.Siestsdesarrollandosoftwareparaunclienteoun empleador,entoncesesvitalquehagasunalistadecaractersticasyrequerimientos.Lalistadeterminarcules sontusresponsabilidadescomodesarrolladordesoftwareytedarunaclaradefinicindeloquenecesitaspara quetuproyectoseconsiderecompleto.Tambindeberecordarsequelosclientesyempleadorestiendena solicitarfuncionesadicionalesamedidaqueavanzaelproyectonegndoseaaportardineroadicionalpara implementarlas.Sitienesunalistadefuncionesamano,puedesinformarleatuclientequetutrabajoes implementarlasfuncionesdelalistayquecualquiercaractersticaadicionalrequerircostosadicionales. Ademsdelistarlascaractersticasyrequerimientos,tambinquerrsdesarrollarunalneadetiempoyun presupuesto.Seradeseableplanificarhitoscomolafinalizacindelproyectoyetapasimportantesdetrabajo realizado.Porejemplo,podrasplanificarunhitoparadenotarlaentregadelosdiseosdeaplicacinybasede datosalcliente.Tambinpodrasagregarunhitoparalaentregadeunademostracinfuncionaldelproyecto.A menudo,estoshitoscoincidenconlospagosdelclientecuandotrabajascomoconsultor,estandolospagos definidosentupresupuesto. ElTringulodeDesarrollo Encuantoaldinero,lasfuncionesylostiempos,esimportantecomprenderelequilibrioquedebeexistirentrelos tres.Sindudas,tuclientepretenderqueleentreguestantasfuncionescomoseaposibledentrodeunpequeo presupuestoybreveperododetiempo.Serimportantetenerencuentaqueavecestienesquerechazaralgn pedidodefuncionesoreduccindetiemposconelpropsitodemantenertodoequilibrado.Supontequeel tiempo,lasfuncionesyeldinerosonlastresesquinasdeuntringulo: Aunqueesposibleestirarlasesquinasdeestetringulo,nopuedescambiarelreaqueocupa,yaqueelreadel tringulorepresentatusrecursostotales.Elefectodeestoesquecadaseccinpuedeaumentaraexpensasde lasotrasdos:Siquieresqueunproyectotengamsfuncionestendrsqueutilizarmstiempooinvertirms dineroenherramientasodesarrolladoresadicionales.Sideseasqueunproyectocuestemenosdinero,tendrs quereducirelnmerodefuncionesopermitirqueelproyectodemoremstiempo(yaseaporquereducesel nmerodedesarrolladoresoslolespermitestrabajarenelproyectoensutiempolibre).Finalmente,siquieres queelproyectofinalicerpidamente,tendrsquereducirelnmerodefuncionesoinvertirmsdineroenms herramientasy/odesarrolladores(oalmenospagarleshorasextrasalosdesarrolladoresexistentes). Alnegociarunalistadefuncionesytiemposcontuclienteoempleador,asegratederecordareltringuloe inclusomostrrseloatuclienteparaquepuedancomprenderlarelacinentrelasfunciones,dineroytiempo.Si estsdesarrollandoelproyectoparatupropiousotieneslaventajadecontarconelclienteperfecto,pero recuerdadetodosmodosquepuedeshacermuypocoentutiempolimitado. Echemosunvistazoalalistadefuncionesyrequerimientosdenuestrosoftwarederegistrodeentradas/salidas: *Elingresoalsistemadeberasolicitarunnombredeusuarioycontrasea *Deberamostrarseunmensajedeestadoalusuariocuandoingresealsistema. *Losusuariospodranelegirentreningnmensajedeestado,unmensajedeestadopredefinidoo especificarsupropiomensajealingresarosalirdelsistema. *Losltimosdosmensajesdeestadodefinidosporlosusuariosdeberanestardisponiblesenunalista juntoconlospredefinidos. *LosusuariosdeberanpoderingresaralsistemadesdecualquierPCconconexinaInternet,conuna conexinencriptadadisponible. *Losusuariosdeberanpodermarcaruncompaeroysernotificadoscuandoingrese.

*Losusuariosdeberandividirseendistintosgrupos(Ventas,Contadura,Sistemas,etc.). *Lapantallaprincipaldeberamostrarunalistadetodoelpersonal(ogruposseleccionados)con nombres,estadosdeentrada/salida,mensajesdeestado,ycampospersonalizados. *Laaplicacindebepoderminimizarsealabarradetareas. *Losusuariosdebenpoderpersonalizarlaapariencia,eltamaodeventana,tamaodefuente,formato defecha,formatodenombreycolores. *Losusuariosestndarpodrncambiarsusestados,formatodevisualizacinyenviarlesmensajesa otrosusuarios. *Losusuariosrecepcionistaspodrncambiarlosestadosdegruposdeusuarios(variosgrupospueden serrecepcionistas). *Loscoordinadorespodrnagregar/eliminarusuariosdentrodeungrupo,cambiarsusestados(desus grupos)yasignarrecepcionistas. *Losadministradorespodrncrearusuarios,asignarcoordinadoresyadministradoresycambiarla pertenenciaalosgrupos.Notienenrestricciones. *Losusuariosdeberanpoderelegirentretenerlaaplicacinminimizadaomaximizada. *Losusuariosdeberanpoderelegirunafrecuenciadeactualizacindelaventanaabierta. Tulistadefuncionesyrequerimientosdeberasertandetalladacomoseanecesarioparatiytucliente,ylas aplicacionesmscomplejasdeberancontarcondocumentacinmsdetallada.Unavezquetulistade funciones,tupresupuestoytustiemposhayansidoaprobadospuedesseguirconeldiseodelaaplicacin. DiseodeEntidades Unbuenacercamientoaldiseodeaplicacionesconsisteenidentificarlasdistintasentidadesqueestarn involucradasenlaaplicacin.Unaentidadessimplementeunobjetosobreelcualdeseamosalmacenar informacin.Eldiseodeaplicacionesbasadoenlasentidadesquelaconformanesunprincipiobsicodela programacinorientadaaobjetos.Ennuestraaplicacinlasentidadesprincipalessonnuestrosusuarios.Existen cuatroclasesdeusuarios:UsuarioRegular,Recepcionista,CoordinadoryAdministrador.Haydos aproximacionesquepodemoshacerpararepresentarlosdistintostiposdeusuarios.Podramosdescribircuatro entidadesdistintas,unaparacadatipodeusuarioopodramostenerunanicaentidaddeusuarioconunatributo quedefinasutipo. Cuandodistintasentidadestienenunabaseencomnperoanconservandiferenciassignificativas,puede resultarbeneficiosopensarenunaentidadbasequeesheredadaporlasotrasentidades.Tomemoscomo ejemplolosvehculos.Aunquetodoslosvehculoscompartenunabasecomnaltenerruedasydesplazarse haciadelanteyhaciaatrs,siguenteniendocaractersticasnicas: Comopodrsver,cadavehculotienepropiedadescomunesatodoslosvehculos,talescomolasruedas, volantesyradios.Sinembargocadavehculoesnicoenciertomodo.Losautossonmspequeosy generalmentellevanmspasajerosqueloscamiones.Loscamionesllevanmenospasajerosperotienenms lugarparatransportarcargas.Lostaxissonsimilaresalosautosperollevanpasajerosquepaganunatarifay tienenradiotransmisoresyequiposparacalcularlastarifas.Podramosinclusohaberconcebidoaltaxicomouna subentidaddeunauto,heredandotodoslosrasgosdeunautoyluegoagregandootrospropios. Lanicapropiedadparticularacadaunadenuestrasentidadesdeusuarioessicorrespondenauncoordinador, administradororecepcionista.Comoexisteunadiferenciamuypequeaentrelosdistintosusuariosesmejor crearunanicaentidadconunapropiedadquedesignelasresponsabilidadesadministrativasdelusuario.Otras entidadesdenuestraaplicacinincluyengruposyeventos.Echemosunvistazodetalladoacadaunadelas

entidades. Usuarios Unusuarioescualquierusuariodelsistema.Losusuariospuedeningresaralaaplicacin,establecersuestadoy verlosestadosdelosdems.Unusuariotienelassiguientespropiedades: *Nombre *NmerodeTelfono *NombredeUsuario *Contrasea *Administrador(S/No) *FechadeAlta *Eliminado(S/No) *MensajesdeEstadoPersonalizados *Gruposcoordinadosporelusuario *Gruposparaloscualeselusuarioesrecepcionista ElindicadorEliminadoseutilizaparadeterminarsiunusuariodebeaparecerenloslistados.Sibienpodemos eliminarfcilmenteunusuariodenuestrabasededatoscuandoabandonalacompaa,simplementeesmejor marcarloscomoeliminados.Aunqueestoocupamsespacioenlabasededatos,esunabuenaprcticapara conservarlosregistros.PuedesverquenohayunestadodeEntrada/Salidaasociadoalusuario,estosedebea quesuestadoserregistradoenlaentidadEventos. Grupos Ungrupoesunconjuntodeusuariosquecompartenalgoencomn.Enlamayoradelasempresaselpersonal seagrupapordepartamentos,talescomoContadura,VentasyAtencinalcliente.Puedesertilpermitirque losusuariosseanmiembrosdemsdeungrupodeformatalquepuedaestarenelgrupodesudepartamentoy quizsperteneceraalgngrupoespecialformadoparaunproyectointerdepartamental.Lassiguientes propiedadesseaplicanalosgrupos: *Nombre *FechadeAlta *Descripcin *Privado/Pblico *Eliminado(S/No) *Coordinadores *Recepcionistas Ungrupoprivadoesaquelquenoesvisibleparalosusuariosquenopertenecenal.Unejemploseraungrupo deejecutivosquenodeseanquesusestadosseanconocidosporlosnoejecutivos. Eventos Uneventoessimplementeuncambioenelestadodeunusuario.Cuandounusuariosaledelsistema,se generaruneventoqueregistraraquusuarioserefiereelevento,sielusuarioentrosali,sumensajede estadoyquingenerelevento.Aunquenormalmenteunusuariogenerarsupropioevento,losrecepcionistas puedeningresaryretirarusuariosdelsistema.Esimportanteregistrarquiningresoretiraunusuariodado.

Laspropiedadesdeloseventossonlassiguientes: *MarcadeTiempo *Usuario *Entrada/Salida *MensajedeEstado *Generador Unavezquehayamosdefinidonuestrasentidades,podemosarmarundiagrama: Enlarealidadexistenalgunasentidadesmsperoestastresentidadesprincipalessonsuficientesparaeste tutorial. EntidadesyRelaciones Ahoraquehemosdefinidonuestrasentidades,esnecesarioestudiarlasrelacionesentreellas.MySQLesuna basededatosrelacionaly,comotal,losdatosquelacomponensedefinenmedianterelaciones.Unaformade definirlasrelacionesentreentidadesesentrminosdelascantidadesacadaladodelarelacinentredos entidadesdadas.Porejemplo,unusuariopuedeperteneceraungrupo(Contadura)omuchosgrupos (Contadura,EquipodeFindeAo,ComitOrganizadordeNavidad).Estosedenominarelacindeunoa muchos.Cadagrupocontendrmuchosusuarios.Larelacinentrelasentidadesdegruposyusuariosesuna relacinmuchosamuchos(muchosusuariospertenecenamuchosgrupos). Larelacinentrelosusuariosyeventosesdiferente.Uneventoserefiereaunusuario,niunomsniunomenos. Unusuario,porelcontrario,tendrmuchasmuchoseventosqueserefierenal.Estosignificaqueexistiruna relacinunoamuchosentreloseventosylosusuarios. Estosdostiposderelaciones(unoamuchosymuchosamuchos)serntenidosencuentacuandodiseemos lastablasdenuestrabasededatos.Porahora,dibujemosunasflechitasparaidentificarunarelacin,conlas puntasidentificandoelladodemuchosdelarelacin. Lasrelacionessonopcionalescuandounarelacinpuededefinirsecomoceroamuchas,comoeselcasoentre lasentidadesusuarioyevento.Unnuevousuariopodranohaberentradoosalidonuncadelsistema.Eneste casonoexistiraneventosrelacionadoscontalusuario. Nuestrasentidadesafectarnnuestrosoftwarededosformas.Lasentidadesquehemosdiseadosern utilizadasposteriormenteparaarmarlabasedelastablasdelabasededatos.Adems,estasentidadesnos ayudarnaformarlasclases,unaunidaddeconstruccindenuestraaplicacinfinal(elusodeclasesenla programacindeaplicacionessedenominaprogramacinorientadaaobjetosyserexplicadaenunaseccin futuradeltutorial). Existenunascuantasmanerasdedefinirentidadesdedatosysusrelaciones.Ladescripcinanteriores simplementeunvistazogeneralparaqueempiecesapensarentrminosdeentidadesynorepresentaningn mtodoparticularconcretoparadescribirnidiagramarentidades.Quieresaprenderunmtodoenparticular? Depende. Cuandotrabajesportucuentadesarrollandounaaplicacingeneralmentealcanzaconarmarundiagramarpido delasentidades,suspropiedadesyrelacionesutilizandoalgnsistemaqueentiendasyconelcualtesientas cmodo.Sitienesquecoordinarungranproyectoytrabajarconotrosdesarrolladoresserimportanteque

adoptesunenfoquemsformalizado. UnbuensistemaqueseesthaciendobastantepopularesUML,oUnifiedModelingLanguage(Lenguajede ModeladoUnificado).HaycientosdelibrossobreUML,algunosdeloscualesestnespecficamenteorientados alusodeUMLparadisearaplicacionesenVisualBasic6.UnejemplodeestoesDevelopingApplications withVisualBasicandUMLporPaulReed.UnbuenportalsobrerecursosUMLestdisponibleporIBMen http://www306.ibm.com/software/rational/uml/.PrestamuchaatencinaldocumentoIntroductiontothe UnifiedModelingLanguage DiseodelaBasedeDatos Unavezquehayamosdefinidonuestrasentidadesysusrelaciones,podemoscontinuarconeldiseodel esquemadelabasededatos.Aldisearunabasededatos,querremosdibujarnuestrastablas,conuniconopor tabla,eincluirelnombredelatablaylascolumnasquelaconforman.YoutilizarlaherramientadediseoVisio deMicrosoftparrealizarlosdiagramasdelabasededatosperoustedespuedenutilizarcualquierherramienta dedibujoquetengan(inclusoelprecariolpiz).Comencemosporlosiguiente: EleccindeunaClavePrimaria Yatenemostodasnuestrasentidadeslistadasconloscamposqueconformaransustablas.Loprimeroque necesitamosagregaranuestrastablasesunaCLAVEPRIMARIA.Unaclaveprimariaesunacolumnadela tablaqueidentificaunvocamenteacadafiladelatabla.EnlatablaUsuariopodrastentarteyusarNombreo quizsNmerodeTelfonocomoclaveprimariaperotuempresapodratenermsdeunJohnSmitholos empleadospodrancompartiruntelfono. Aunqueesposiblejuntarmsdeunacolumnacomoclaveprimariacompuesta(porejemplo,hacerclave primarialacomposicindeNombreyNmerodeTelfono),tienesqueasegurartedequecadaentradasea nica(qusucedecuandodosJohnSmithscompartenlostelfonos?).Entoncesquusamoscomoclave primaria?Enestecasoseguramenteseamejoragregarunanuevacolumna,llamadaID_Usuario.Estacolumna serunenteroyserincrementadoautomticamenteporMySQLmedianteelusodelapalabraclave AUTO_INCREMENT(veremosmssobreAUTO_INCREMENTluego). ParalatablaGrupopodemosutilizarlacolumnaNombrecomoclaveprimaria,yaesnecesarioquecadagrupo tengaunnombrediferenteparaevitarlaconfusincuandodebaelegirseaqugrupospertenecernlosusuarios. ParalatablaEventopodramosusarlacolumnaMarcadeTiempocomoclaveprimariaperohayuna advertenciaparaesteuso:eltipodedatosTIMESTAMPtieneunaprecisindelordendesegundos,loque significaquesidosusuariosregistranuneventoenelmismosegundo(nadaimprobableenunsistemaconcientos deusuarios),seviolaraelrequisitodeunicidaddelaclaveprimaria.Enestecasotenemosdosalternativas: podemosusarlacombinacindelascolumnasUsuarioyMarcadeTiempocomoclaveprimaria,asumiendocon seguridadqueesimprobablequeunusuariodisparedoseventosenelmismosegundo.Alusarlaclaveprimaria deotratabla(elID_UsuariodelatablaUsuario)comopartedelaclaveprimariadeunatabla,estamoscreando loqueseconocecomoRelacinIdentificatoria. Unarelacinidentificatoriaesaquelladondelatablaoentidadhijanopuedeexistirsinsupadre.Usuarioy GrupotienenunaRelacinNoIdentificatoriaporqueunUsuariopuedeexistirindependientementede perteneceraunGrupo,yunGrupopuedeexistirsinqueexistanmiembros.UnEvento,porelcontrario,carece desentidosinoserefirieraaunusuario.

Otraopcinescrearunanuevacolumna(ID_Evento)queseraunavezmsunvalorentero AUTO_INCREMENT.Generalmentecualquierenfoqueresultavlidoperohayalgoimportantequedebes tenerencuenta:MySQLyVisualBasicusandiferentesformatosdefecha.ElformatoYYYYMMDD HH:MM:SSdeMySQLesgeneralmentemalinterpretadoporVisualBasic,queutilizaunafechaconformato M/D/YYYYHH:MM:SS.Veamoslasdiferencias,primeroconunaconsultaMySQLyluegoconunpequeo ejemploenVB:


m y s q l >s e l e c tn o w ( ) ; + + |n o w ( )| + + |2 0 0 4 0 1 0 51 3 : 2 9 : 0 3| + + 1r o wi ns e t( 0 . 0 2s e c )

YahoraenlaventanainmediatodeVB:
? n o w 1 / 5 / 2 0 0 41 : 2 5 : 3 8P M

Comopodrsver,haygrandesdiferenciasenelmanejodefechas.Apartedelordendelosvalores,MySQL utilizacerosalaizquierdapararepresentarnmerosmenoresquediezyutilizaunrelojde24horas.Estas diferenciasenelmanejodelasfechaspuedenproducirseriosproblemasparaVisualBasicdadoqueVB esperarunformatomientrasMySQLesperarotro.Porestarazn,serecomiendaqueNUNCAusenninguna columnacontipodedatofechacomopartedelaclaveprimariadeunatabla.Poreso,utilizaremosunacolumna ID_Eventocomoclaveprimariadenuestratablaevento.Sibienestonoproduceunarelacinidentificatoria, iguallatratamoscomopertenecientealaaplicacin. Echemosunvistazoanuestrodiagramaahoraquetieneclavesprimarias: DebeshabertedadocuentaquecambilacolumnaNombredelatablaGrupoporNombre_Grupo.Elmotivo porelcualhiceestoesquelasclavesprimariasgeneralmenteseutilizanenlasconsultasalabasededatosque involucranmltiplestablasyesmsfcilescribirSELECTNombre_GrupoFROMGrupo,Usuarioenvezde SELECTGrupo.NombreFROMGrupo,Usuario,enserio,esmuchomsfcilas.Comovers,nuestras columnasdeclaveprimariasecolocanenelcuadrocentraldenuestrosiconosdetablayhansidoresaltadosen negrita.ConundiagramadebasededatosdeVisio,todaslascolumnasqueformanpartedelaclaveprimaria semuestrasenelcuadrocentralytienenelidentificadorPKasuizquierda.Elresaltadoennegritaindicaque esteesuncamporequeridoynopuededejarseenblanco(uncampoquenotieneunvalorasignadoenrealidad tieneasignadoelvalorNULL,loquesignificaquenoestdefinidoonotieneunvalor). EleccindelosNombresdeCampoyCamposRequeridos Acontinuacin,querremosabreviarlosnombresdenuestroscamposydesignarlosdemscamposrequeridos. Unaaclaracinsobrelosnombresdecampo:aunqueenMySQLsepuedenutilizarnombrescampocon espacios,teharlascosasmsdifcilesporquetendrsqueencerrarelnombreentrecomillas()cadavezque quierasusarlo.Porejemplo,paraaccederalacolumnaFechadeAltatendrasquehacerlaconsultadeesta manera:SELECT`FechadeAlta`FROMGrupopersonalmente,nomegustautilizarcomillasysiempreuso guionesenlascolumnaspararepresentarespacioscuandoasignolasclavesprimarias(ID_Usuario)yuso

maysculasparadistinguirlosnombresdecolumnascomunes(FechaAlta).Cuandopongasnombresalos campos,debesmantenerlalegibilidad,querrsquelosnombresdecolumnasseanlosuficientementecortos comoparatipearlosrpidocuandolosusesrepetidasveces,perotambinquerrsasegurartedequelos desarrolladores(inclusotumismo)puedanentendersusignificado: RelacionesUnoaMuchos Ahoraquehemosnombradolascolumnas,definamoslasrelacionesentrelastablas.Primeromiremoslarelacin unoamuchosentreunEventoyunUsuario.Cuandomanejamosunarelacinunoamuchos,ubicamoslaclave primariadelatablademuchoscomouncampoenlatabladeuno(deberacomentarquecolumna,campoy propiedadsonsinnimos).Enestecaso,yatenemosunacolumnaUsuarioenlatablaEventoperohagmoslo msclarorenombrndolaparaqueconcuerdeconladefinicindelatablaUsuario,llamndolaID_Usuario. Tambinpodemosusarlafechaderelacinparadibujarnuestrarelacin(unavezms,lapuntadelaflecha apuntaalatablademuchos): Comopuedesver,sehaagregadounidentificadorFK1alacolumnadelaizquierda,FKsignificaForeignKey (ClaveFornea).Unaclaveforneaessimplementeunacolumnaqueserefierealaclaveprimariadeotratabla. ElmanejadorInnoDBincluidoenMySQLmanejaloqueseconocecomointegridadreferencial.Laintegridad referencialeselrequerimientodequelasclavesforneasrepresentenvaloresreales.Porejemplo,sitratarasde insertarunafilaalatablaEventoquetuvieraelID_Usuario10,InnoDBverificaraqueexisteunID_Usuario10 enlatablaUsuarioydevolveraunerrorsitalfilapadrenoexistiera.Demaneracontraria,nosepermitira eliminarunafiladelatablaUsuariosiexistieranfilasenlatablaEventoqueserefieranalafilaencuestin.Eluso deInnoDBestmsalldelalcancedeuntutorialsobreelusobsicodeMySQLynosertratadoconms profundidadenestetutorialperossereltemadealgnartculofuturo.Puedesencontrarmsinformacin sobreInnoDBen:http://www.mysql.com/doc/en/InnoDB.html. RelacionesMuchosaMuchos UnavezestablecidaslasrelacionesentreEventoyUsuario,podemoscontinuarconladefinicindelarelacin entreUsuarioyGrupo.Comorecordarn,larelacinentreUsuarioyGrupoesunarelacinmuchosamuchos. Estaclasederelacinnoestansimpledeimplementarcomounarelacinunoamuchos.Enunarelacinunoa muchos,podemosubicarlaclaveprimariadelatablademuchosenunacolumnadelatabladeuno,pero estonoencajaefectivamenteennuestrasituacindemuchosamuchos:qutablacontendrlaclaveprimaria delaotra?Larespuestaesqueningunadelasdostablascontendrlaclaveprimariadelaotra.Porelcontrario, crearemosunaterceratablaparaunirlasdos. Enestecaso,latablaUsuario_Grupotienedosclavesforneas:Nombre_GrupoeID_Usuario.Estasdosclaves forneasformanunaClavePrimariaCompuesta,asegurandoqueexistaunasolaentradaenlatablaparacada combinacinnicadeUsuario/Grupo.Adems,sehanagregadodoscamposqueindicarnsiesusuarioes coordinadororecepcionistadelgrupo,permitindonoseliminarloscamposdeambastablasquesereferana coordinadoresy/orecepcionistasdecadagrupoypermitiendotambinqueunnicousuariomanejevarios grupos. NormalizandolaBasedeDatos Lanormalizacindebasesdedatosseexplicaendetalleenotroartculoqueescribubicadoen http://www.vbmysql.com/articles/databasedesign/normalize.htmlyrecomiendoqueloleanparamsinformacin sobrenormalizacindebasesdedatos.Enestetutorialcomentarlobsicodadoqueseaplicaanuestrodiseo

deejemplo.Lanormalizacineselprocesodeeliminardatosredundantesdelastablasconelfindemejorarla eficienciadelalmacenamiento,laintegridaddelosdatosylaescalabilidad.Estamejorasuponeunaumentode complejidadypotencialesprdidasdeperformancedebidoalaunindetablasnormalizadasalrealizar consultas. PrimeraFormaNormal Elprocesodenormalizacinapuntaalograrquenuestrosdatosseadaptenatresformasnormalesprogresivas, ycadanivelsuperiordelanormalizacinnosepuedealcanzarhastaquesehayanalcanzadolosniveles anteriores(enrealidadexistencincoformasnormalesperolasltimasdossonprincipalmenteacadmicasyno sediscutirn).Laprimeraformanormal(o1NF)tienecomoobjetivoeliminarlosdatosredundantesdelasfilas horizontales.Queremosasegurarnosdequenoexistendatosduplicadosenunafiladadayquecadacolumna almacenalamenorcantidaddeinformacinposible(haciendoqueloscamposseanatmicos). TenemosdosviolacionesalaPrimeraFormaNormal(1NF)ennuestromodelodebasededatos.Elprimeroes quenuestracolumnaNombredelatablaUsuarioguardatantolosnombrescomolosapellidosdeunusuario. Estonorepresentalamenorcantidaddedatosposible.Adems,dificultaelordenamientodeusuariospor apellido.Finalmente,nuestrosusuariosnopodrspersonalizarsuslistasparamostrarfcilmentelosnombres ordenadospornombre/apellidooapellido/nombre.Pararesolveresto,simplementedividimosnuestracolumna Nombreendoscolumnas: Lasegundaviolacinala1NFeslaredundanciahorizontaldelascolumnasEstado(notaqueaunquelas columnasaparecenverticalmenteenestediagrama,enrealidadlascolumnasseagrupanhorizontalmentecuando tomanlaformadeunatabla.Imaginalatablacomounahojadeunlibromayor,conencabezadosdecolumnas enlapartesuperiordelapginayfilasindividualeshaciaabajo).Nosloserdifcilhacerconsultassobre columnashorizontalmenteredundantes(necesitarasunaconsultacomoSELECT*FROMUsuarioWHERE Estado1=MiEstadoOREstado2=MiEstado),sinoqueleshasrestringidoatususuarioslaposibilidad detenersolamentedosmensajesdeestadopersonalizados.Siunclientesolicitaalgndalacapacidadde almacenartresmensajesdeestado,tendrsqueagregarotracolumnayrescribirlaconsultadeejemploquedi anteriormente.Lascolumnashorizontalmenteredundantespuedensolucionarseagregandootratablapara guardarlosmensajesdeestado.Estotambinnosbrindalaoportunidaddeagregarlosmensajesdeestado predefinidosalsistema: Nuestranuevatabladeestadoscontendrtodoslosmensajesdeestadoquesehayaningresadoalgunavez,sea unmensajepersonalizadoopredefinido.NuestratabladeeventossevinculaentoncesconlatablaEstadopara indicarqumensajedeEstadoutilizaelevento.SiunmensajeespredefinidoentonceselcampoID_Usuariono secompletar.Sielmensajeesunmensajepersonalizado,entoncesdebecompletarseelcampoID_Usuario, asociandoelmensajedeestadoconsuautorparasuposteriorrecuperacin(recuerdaqueunadelas caractersticasquefigurarenlalistaserlarecuperacindemensajesdeestadopersonalizadosviejosparasu reutilizacin). Antesdepoderdecirquenuestrabasededatosestenprimeraformanormal,hayotroajustequepodemos hacer.EnvezdeguardarunindicadorparaCoordinadoryotrodistintoparaRecepcionista,podemoscombinar lasdoscolumnasenunacolumnadeNivelAdministrativo.Comolosdospuestossonmutuamenteexcluyentes notienemuchosentidoguardarlosdoscamposporseparadoyaqueningnusuarioserCoordinadorY Recepcionistaalamismavezparaunmismogrupo. Comounusuariopodranotenerprivilegiosdeadministradorsobreelgrupo,puseelcampocomonorequerido.

Deestaforma,elcampopuedecompletarseconNULLparaindicarqueelusuarionotieneprivilegiosde administrador. SegundaFormaNormal AscomolaPrimeraFormaNormaleliminalaredundanciadedatosalolargodeunafilahorizontal,laSegunda FormaNormal(o2NF)eliminalaredundanciadedatosdecolumnasverticales(enlasqueelmismodato apareceenvariascolumnas).Lasformasnormalessonprogresivas,porlotanto,paraalcanzarlaSegunda FormaNormallastablasyadebenestarenPrimeraFormaNormal.Enestecaso,losttulosasignadosalos nivelesadministrativos(recepcionista,coordinador)podranaparecerpotencialmenteenmuchasfilas,yaqueuna granempresapodratenermuchosrecepcionistas.Solucionaremoslaredundanciaverticaldelmismomodoque laredundanciahorizontal,agregandotablasanuestroesquema: Nuestranuevatablanospermitircambiarelttulodeunniveladministrativo(porejemplo,Coordinadorpor Supervisor)sintenerquehacerelcambioparacadausuarioqueescoordinador,comoseraelcasosituvieras lapalabracoordinadorencadafilaquelecorresponda.Estofacilitaelmantenimiento.Asimismo,puede pasarnosqueeventualmentenecesitamosagregarmsdatosacercadelniveladministrativo.Conesteenfoque podemosagregarfcilmenteindicadoresalatablaquerepresentenlosdistintosprivilegiosqueposeeelusuario, luegopermitirquelosadministradorescreennuevosnivelesadministrativossegnlocreanconveniente,dando variospermisossegncorresponda. TerceraFormaNormal EnlaTerceraFormalNormalbuscamosdatosenlatablaquenoseantotalmentedependientesdelaclave primariaperodependientesdeotrovalordelatabla.Tomaunadireccincomoejemplo:tuCiudadyEstadono dependendetisinodelcdigopostal.Entonces,crearamosunatablaaparteconCdigoPostal,Ciudady EstadoysloalmacenaramoselcdigopostalenlatablaUsuario.Sibienesteenfoquepuedefacilitarel mantenimiento,tambinpuedeintroducircomplejidadaltratardearmarunadireccin.Portalmotivo,losdatos deberanpasarseaterceraformanormalcuandoseanecesarioparalograrunbuenmantenimientodela informacin.Ennuestrocaso,noexisteningunainformacinenelesquemaquerequieramayornormalizacin parallevarloaterceraformanormal. EleccindelosTiposdeColumnasyArmadodeSentenciasCREATETABLE UnasentenciaCREATETABLEesunaconsultaespecialquelepasamosaMySQLparaindicarlequecreeuna nuevatablaparaalmacenarnuestrosdatos.LasintaxisdeCREATETABLEpuedeencontrarseenelmanualde referenciadeMySQLenhttp://www.mysql.com/doc/en/CREATE_TABLE.html.Aunquelasintaxisparezca complicada,enrealidadesbastantesimple.ParacreartablasenMySQL,necesitamosbsicamenteunnombre detabla,nombresparalascolumnasyeltipodedatosquesoportarcadacolumna.VeamoslatablaUsuario primero. ElprimercomponentedenuestraconsultaCREATETABLEeslasentenciaCREATETABLEpropiamente dicha,queindicaelnombredenuestratabla:
C R E A T ET A B L EU s u a r i o (

Elparntesisinicialindicaquelaslneasquesiguenacontinuacindefinenlascolumnasdenuestratabla.Cuando definamosloscamposnecesitaremosalgunaqueotrainformacin:primeronecesitamoselnombredelcampo,

quetomaremosdirectodeldiagramaanterior.Segundo,necesitamoslostiposdedatosdecadacampo.Esen estepuntodondedeterminamossielcampoguardarinformacinnumricaoalfanumrica,informacinsobre fechayhorauotrostiposdedatosespeciales.Lalistacompletadetiposdedatosestdisponibleenelmanual dereferenciadeMySQLenhttp://www.mysql.com/doc/en/Column_types.html,ylesrecomiendoqueseremitan alatabladeconversindetiposdedatosentreVB/MySQLenhttp://www.vbmysql.com/articles/visual basic_mysql/datatypes.html. Alelegirtiposdedatosesimportantemantenerunequilibrioentreeltamaodefilayelaprovechamiento.Cada campoocuparunaciertacantidaddeespacioenlafilaytendrciertacapacidadparaguardarinformacin. TomemoscomoejemplodelID_UsuarionuestrocampoID_Usuariotendrunvalorenteroyenteora necesitamosunoporcadaempleadodenuestraorganizacin.Nuestrasalternativasdetiposdedatosincluyen TINYINT,SMALLINT,MEDIUMINT,INTyBIGINT.Losnmerosmximosquesepuedenalmacenarcon estosdistintostiposdedatosson127,32767,8388607,2147483647y9223372036854775807 respectivamente. EnestecasopodemostomareltipoTINYINTcuyacapacidades127yconsiderarlodemasiadopequeopara nuestropropsito.SMALLINT,cuyacapacidades32767,deberasermsadecuado,inclusoparalas organizacionesmsgrandes.Laraznporlaqueelegimoseltipodedatosmspequeoposibleparanuestros datosresideenquelostiposdedatosmayoresgeneranfilasmslargasylasfilasmslargasrequierenmayor tiempodebsquedaalrealizarconsultas.Porlotanto,siempreserconvenientehacerlasfilaslomspequeas posibles.AlelegireltipodedatosSMALLINTde16bitsenvezde,porejemplo,eltipodedatosINTde32 bits,noshemosahorradocasi2gigabytesdealmacenamientoenmsdeunmillndefilas.Comoconsecuencia, otraventajadeelegirtiposdedatosmspequeoseslamejoreficienciadealmacenamiento.Siemprepodrs redefinirunacolumnaauntipodedatosmsgrandeenelfuturo,inclusocuandoelservidoryaesten funcionamiento. Elrestodenuestradescripcindefilassedestinaainformacinextraacercadelcampo.Antetodo,cuando manejamostiposdedatosnumricos,tenemoslaopcindeespecificarsielcampoaceptarnmerosnegativos. ElrangorealdenmerosquesepuedenalmacenarenuncampoSMALLINTesde32768a32767.En nuestraaplicacinparticularnotienesentidotenerunID_Usuarionegativo.Portalmotivo,seramejordeclarar elcampocomoUNSIGNED(sinsigno).Estonosloevitalainsercindenmerosnegativosennuestratabla sinoqueademsaumentaelvalormximoquepodemosalmacenarennuestrocampoa65535(estosedebea queenformatobinarioelbitmsalaizquierdadeunnmerosereservapararepresentarelsignodelnmero. MySQLutilizarelbitmsalaizquierdaparaaumentareltamaomximodelnmerocuandoseespecifique UNSIGNED). NOTNULL,DEFAULT,AUTO_INCREMENTyPRIMARYKEY OtrasopcionesquepodemosdefinirparaestecampoessielcampopermitevaloresNULLono.Como recordars,loscamposdefinidoscomorequeridosennuestrodiseodebentenerunvalorcuandosecreao actualizaunafilayNULLesunapalabraclavequeindicaqueelcamponotieneunvalorasignado.Poreso, cualquiercampoquehayamosdefinidocomorequeridotendrquetenerlaspalabrasclavesNOTNULL agregadas.NOTNULLevitarlainsercindeNULLsyharobligatorioelcampo. RelacionadaconNOTNULLaparecelapalabraclaveDEFAULT.Elhechodequeuncamposedefinacomo NOTNULLnosignificaquetenemosqueespecificarunvaloralinsertarregistros.CualquiercampoNOT NULLquenoseespecifiquealinsertarunafilatendrelvalorpredefinidoporlapalabraclaveDEFAULT.A losvaloresnumricosselesasignarnautomticamenteunvalordecero,mientrasquelosstringstendrnpor

defectounacadenavaca().PuedesutilizarlapalabraclaveDEFAULTparamodificarestecomportamiento. Existenotrasdospalabrasclavesfinalesqueseutilizancomnmentealcreartablasperoqueslopueden definirseunasolavez.EstassonlaspalabrasclavesAUTO_INCREMENTyPRIMARYKEY. AUTO_INCREMENTindicaquesinoseespecificaelcampoalinsertarfilas,labasededatosgenerar automticamenteunvalorautomticoincrementalyloguardarenelcampodefinidocomo AUTO_INCREMENT.Estoesmuytilcuandoseutilizanenterosparaidentificarlasfilas,yaqueel programadornotienequepreocuparseporcrearunniconmeroparacadafilaqueagrega.Lapalabraclave PRIMARYKEYseutilizaparadefiniruncampocomoclaveprimariadelatabla.Veamosladefinicinde nuestraprimeracolumna:


C R E A T ET A B L EU s u a r i o ( I D _ U s u a r i oI N TU N S I G N E DA U T O _ I N C R E M E N TP R I M A R YK E Y ,

CHARvs.VARCHAR Ahoraqueyahemosdefinidonuestraclaveprimaria,echemosunvistazoanuestratablaUsuario.Nuestros nombresdecolumnasernmanejadoscomostringsaloscualessepermitequecontenganvaloresalfanumricos. LosdoscamposbsicosparacontenerstringssonCHARyVARCHAR,loscualessedefinenentrminosdela cadenadetextomximaquepuedenalmacenar(definidaencaracteres,entre1y255).Ladiferenciaentre CHARyVARCHARradicaenlamaneraenquemanejanelespaciosinusar.Supontequeconsideramosquela cadenamslargaparaunapellidoesde40caracteresyunusuariotieneelapellidoWinstead(8caracteres).En uncampoCHAR,elcampoanseguirasiendode40bytesdetamao(1carcter=1byte)ylosltimos32 caracteresseranespaciosenblancoutilizadospararellenarlacadenaalos40caracterescompletos(los espaciossobrantesserneliminadoscuandorecupereselvalor).Estosignificaquenoimportaqutanlargasea lacadenaenrealidad,siempreocuparlos40caracteresdeespaciocompletosdentrodelatabla.VARHAR, porelcontrario,almacenarslolos8caracteresyocuparsolamente8bytesdeespacioenlatabla. TuprimerimpulsoseraelegirVARCHARysacarprovechodelmenorespaciodealmacenamientorequeridoen latablaconelobjetivodeaumentarlavelocidadenlasbsquedastalcomoyolodescribanteriormentepero VARCHAReslaexcepcinalaregla.CuandousasVARCHARenunatabla(aligualqueciertascolumnas creadasparagrandescantidadesdetextoyvaloresbinarios)elanchodecadafilasehaceinconsistente.Unafila podratener40bytesdelongitudmientrasqueotraslo8.MySQLpuedemanejarestoalmacenandolalongitud delafilaensusistemadearchivosperoelservidordebeleerlalongituddecadafilaantesdebuscarlay continuarconlasiguientefila,dondedeberverificarlalongitudotravez,adnauseam.Aldefinircamposde textocomoCHARocuparemosmsespacioeneldiscorgidoperohabrunaumentoenlavelocidadyaqueel servidorsabrquecadaunadelasfilastieneexactamenteelmismotamao(porejemplo120bytes), permitindolequebusqueentrelasfilassinverificarsulongitudprimero.Portalmotivo,recomiendoquedefinas tuscamposdetextocomoCHARparamejorarlaperformancedelasconsultas,amenosqueelespaciode almacenamientoseaunaconsideracinimportante(yconlospreciosdelosdiscosdehoyendaestanoesuna granpreocupacin,principalmenteconnuestraaplicacin). Echemosunvistazoalosnombresdelascolumnas:
C R E A T ET A B L EU s u a r i o ( I D _ U s u a r i oI N TU N S I G N E DA U T O _ I N C R E M E N TP R I M A R YK E Y ,

A p e l l i d oC H A R ( 4 0 )N O TN U L L , N o m b r eC H A R ( 4 0 )N O TN U L L ,

Comovers,cadacamposeruncampoCHARquecontendrhasta40caracteres.Loscampossedefinen comoNOTNULLparahacerlosobligatorios,conelusodelvalorestndardecadenavacadadoqueno hemosdefinidolocontrario. AlmacenamientodeNmerosTelefnicos Noexisteunamaneradealmacenarunnmerotelefnicoyaqueeltipodedatosautilizarpuededependerdelo queplaneashacercontusnmerosdetelfono.Siquiereshacerbsquedasbasadasenloscdigosderea quizsteconvengaalmacenarlasdistintaspartesdeunnmerotelefnicoenformaseparada,conuncampo paraelcdigoderea,uncampoparalosprimerostresdgitos,uncampoparaloscuatrodgitosyquizsalgn campoopcionalparalaextensin.Estofacilitarlasbsquedasyelordenamientodelosnmerosdetelfono. Ennuestrocaso,sloestamosalmacenandoelnmeroparatenerunareferenciadeloscompaerosdetrabajo deunusuarioasqueslologuardaremosenunacolumnaCHAR.
C R E A T ET A B L EU s u a r i o ( I D _ U s u a r i oI N TU N S I G N E DA U T O _ I N C R E M E N TP R I M A R YK E Y , A p e l l i d oC H A R ( 4 0 )N O TN U L L , N o m b r eC H A R ( 4 0 )N O TN U L L , T e l e f o n oC H A R ( 1 0 )N O TN U L L ,

NuestroscamposNombreUsuarioyContraseatambinserndeclaradoscomocolumnasCHAR:
C R E A T ET A B L EU s u a r i o ( I D _ U s u a r i oI N TU N S I G N E DA U T O _ I N C R E M E N TP R I M A R YK E Y , A p e l l i d oC H A R ( 4 0 )N O TN U L L , N o m b r eC H A R ( 4 0 )N O TN U L L , T e l e f o n oC H A R ( 1 0 )N O TN U L L , N o m b r e U s u a r i oC H A R ( 1 6 )N O TN U L L , C o n t r a s e aC H A R ( 4 0 )B I N A R YN O TN U L L ,

Elmanejodeingresosdeusuariosalsistemaserdiscutidoenunartculofuturo.LapalabraclaveBINARY utilizadaenelcampoContraseaindicaquequeremosquetodaslascomparacionesenelcampoContrasea seansensiblesamaysculasyminsculas(deformaqueConTRaseAycontraseasetratencomocadenas distintasalvalidarusuarios).LascadenasenMySQLsetratandeformasensibleamaysculasyminsculasa menosqueseutilicelapalabraclaveBINARY. ColumnasENUM ParanuestrocampoAdministradorutilizaremosunacolumnaENUM.AunacolumnaENUMpuedeasignrsele unsolovalor,elegidodeunalistadevalorespredefinidoquedeclaramosalcrearelcampo.ENUMesmuy prcticopararepresentarconjuntosdevaloresquenoaumentarnsutamaoamedidaquecrecelabasede datos(poresoutilizaremosunatablaseparadacomoconlatablaNivelesAdmin).Enestecaso,queremos representarunescenarioqueslopuedetenerdosvalores:verdaderoofalso(oeresadministradorono).

AsignarunENUMimplicacrearunconjuntodestringsseparadasporcomasformandounalistadetodoslos valoresposibles(puedesdefinirhasta65535valorespotencialesdistintosparaunacolumnaENUM,perosi necesitasmsdecincooseisquizsseamejorcrearunatablaparaguardarlosvalores):


C R E A T ET A B L EU s u a r i o ( I D _ U s u a r i oI N TU N S I G N E DA U T O _ I N C R E M E N TP R I M A R YK E Y , A p e l l i d oC H A R ( 4 0 )N O TN U L L , N o m b r eC H A R ( 4 0 )N O TN U L L , T e l e f o n oC H A R ( 1 0 )N O TN U L L , N o m b r e U s u a r i oC H A R ( 1 6 )N O TN U L L , C o n t r a s e aC H A R ( 4 0 )B I N A R YN O TN U L L , A d m i n i s t r a t o rE N U M ( ' V E R D A D E R O ' ,' F A L S O ' )N O TN U L L ,

ColumnasdeFecha LasltimasdoscolumnasdenuestratablasonloscamposCreadoyEliminado.ElcampoEliminado.Elcampo Eliminadoesunavezmsunacolumnaverdadero/falsoysertratadaigualqueelcampoAdministrador.El campoCreadorepresentalafechaenlaquesecreelregistro.MySQLproporcionacuatrocolumnaspara manejarinformacindefecha,cadaunadelascualesesbastantedescriptiva:DATE(fecha),TIME(hora), DATETIME(fechayhora)eYEAR(ao)(existeunaquintacolumnaTIMESTAMP(marcadetiempo)que discutiremosmsadelante).Alahoradeelegiruntipodedatosautilizar,consideraquclasedeinformacin necesitas.Ensumayora,losformatosmscomnmenteutilizadossonDATEyDATETIMEyaquenotiene muchosentidoguardarslolahoradeldaoelaoalalmacenarinformacin(recuerdaquelamayoradelas personasnobuscaninformacindehorasintenerencuentaelda).Paranuestrospropsitos,esapropiadala columnaDATEyaquenoesesencialsaberlahoradeldaenquesecrelafila:
C R E A T ET A B L EU s u a r i o ( I D _ U s u a r i oI N TU N S I G N E DA U T O _ I N C R E M E N TP R I M A R YK E Y , A p e l l i d oC H A R ( 4 0 )N O TN U L L , N o m b r eC H A R ( 4 0 )N O TN U L L , T e l e f o n oC H A R ( 1 0 )N O TN U L L , N o m b r e U s u a r i oC H A R ( 1 6 )N O TN U L L , C o n t r a s e aC H A R ( 4 0 )B I N A R YN O TN U L L , A d m i n i s t r a t o rE N U M ( ' V E R D A D E R O ' ,' F A L S O ' )N O TN U L L , E l i m i n a d oE N U M ( ' V E R D A D E R O ' ,' F A L S O ' )N O TN U L L , C r e a d oD A T E T I M EN O TN U L L ) T Y P E=M y I S A M ;

Elparntesisfinalindicaelfindelasdefinicionesdecolumnas.LapalabraclaveTYPEesopcionalporqueeltipo detablapordefectoesMyISAM,peropodemosusarlapalabraclaveposteriormenteparaindicarque queremosutilizaralgnotromanejadordetablasdeMySQL,talescomoInnoDB,HEAPoBDBpornombrar sloalgunos.Puedesencontrarmsinformacinsobrelosmanejadoresdetablasen http://www.mysql.com/doc/en/Table_types.html,peroparalospropsitosdeesteartculonosquedaremoscon elmanejadordetablaspordefectoMyISAM.Elcarcterpuntoycoma()ledicealservidorMySQLque hemosfinalizadonuestraconsultayquepuedeprocederaejecutarla.Laejecucindeconsultasserexplicada enuntutorialfuturo,porahorasloprepararemoslasconsultasparausoposterior.Terecomiendoquearmes

tusconsultasenuneditordetextocomoelBlocdeNotasylasguardesconunnombredearchivotipo sentencias_creacin_tablas.sql.Laextensin.sqlindicarqueelarchivocontieneconsultasSQL. CamposTIMESTAMP UntipodedatosespecialdisponibleenmuchasbasesdedatosesTIMESTAMP.Unacolumnatimestamp (marcadetiempo)esmuyparecidaalcampoDATETIME(fechayhora)perotieneciertaspropiedades especiales.SiunatablatieneunacolumnatimestampentoncesMySQLllenaralcampoautomticamenteconla horaactualcuandoseinserteunafilasinespecificarunvalorparalacolumnatimestamp(osilacolumna timestampseespecificacomoNULL).Lacolumnatimestamptambinseractualizadaalahoraactualcuando seactualiceunafilaconnuevainformacin(otravez,siempreycuandolacolumnanoseespecifiqueose establezcaaNULL). Unapropiedadtildelascolumnastimestampessucomportamientocuandotienesmsdeunacolumna timestampenunatabla.Cuandotienesvariascolumnastimestampenunatabla,atodosloscampostimestamp selesasignarlahoraactualcuandoseinserteunanuevafila,peroslolacolumnatimestampmsalaizquierda seractualizadaenlasactualizacionessubsiguientesdelatabla.Estosignificaquepuedesponerdoscampos timestampenlatabla,coneldeladerechaalmacenandolafechadecreacindelatablayeldelaizquierda registrandolaltimaactualizacindelafila.NosotrosutilizaremoseltipodedatosTIMESTAMPparaguardar lahoradecreacindeloseventosennuestratablaEvento,utilizandoelnombreMarcaTiempooTimestampen ingls.Generalmente,nosepuedeutilizaruntipodedatoscomonombredecolumnaporqueesunapalabra reservada,peroelusodelapalabraTimestampcomonombredecolumnaesunaexcepcinenMySQL:
C R E A T ET A B L EE v e n t o ( I D _ E v e n t oM E D I U M I N TU N S I G N E DN O TN U L LA U T O _ I N C R E M E N TP R I M A R YK E Y , I D _ U s u a r i oS M A L L I N TU N S I G N E DN O TN U L L , I D _ M e n s a j eM E D I U M I N TU N S I G N E DN O TN U L L , M a r c a T i e m p oT I M E S T A M P , E s t a d oE N U M ( ' E n t r a d a ' , ' S a l i d a ' )N O TN U L L , C r e a d o rS M A L L I N TU N S I G N E D ) T Y P E=M y I S A M ;

UnpardecosasatenerencuentaesquesecambielnombredelacolumnaEntrada/SalidaporEstadopara reflejarmejorsusignificado(yaqueEntrada/Salidadicequsepuedealmacenarenlacolumnaperonoqu significa).Adems,lacolumnaCreadorsecambiderequeridoanorequerido.Laraznporlaquehacemos estoesqueuncreadorNULLpuedesignificarqueelusuariodescritoporeleventoessucreador,loquepodra serdeayudaenunfuturoparadeterminarcadacuntosecreaneventosporpartedeusuariosdistintosal especificadoporelevento.Esimportantedestacarqueeldiseopuedeserunprocesoiterativoyquecambios comostesehacenfrecuentemente.Loimportanteesacordarsedeactualizartudocumentacinalhacer cambios: ClavesPrimariasCompuestas EnlatablaUsuario_Grupotenemosunaclaveprimariacompuesta.Nopodemosdefinirambascolumnasconla palabraclavePRIMARYKEYsinoquedebemosutilizarunasintaxisdiferente:
C R E A T ET A B L EU s u a r i o _ G r u p o

( N o m b r e _ G r u p oC H A R ( 2 0 )N O TN U L L , I D _ U s u a r i oS M A L L I N TU N S I G N E DN O TN U L L , I D _ N i v e lT I N Y I N TU N S I G N E D , P R I M A R YK E Y( I D _ U s u a r i o ,N o m b r e _ G r u p o ) ) T Y P E=M y I S A M ;

Cuandodefinimosclavesprimariascompuestas,definimoslaclaveprimarialuegodeterminardedefinirlas columnas. DefinicindelasTablasRestantes Lastablasrestantesdenuestraaplicacinsiguenlosmismosprincipiosquehemosdescritohastaahora:


C R E A T ET A B L EE s t a d o ( I D _ M e n s a j eM E D I U M I N TU N S I G N E DN O TN U L LA U T O _ I N C R E M E N TP R I M A R YK E Y , I D _ U s u a r i oS M A L L I N TU N S I G N E D , M e n s a j eC H A R ( 2 5 5 )N O TN U L L , E l i m i n a d oE N U M ( ' V e r d a d e r o ' , ' F a l s o ' ) ) T Y P E=M y I S A M ;

CREATETABLEGrupo ( Nombre_GrupoCHAR(20)NOTNULLPRIMARYKEY, CreadoDATETIMENOTNULL, AmbitoENUM(Publico,'Privado), EliminadoENUM(Verdadero,'Falso) )TYPE=MyISAM CREATETABLENivelesAdmin ( ID_NivelTINYINTUNSIGNEDNOTNULLAUTO_INCREMENTPRIMARYKEY, TituloCHAR(20)NOTNULL )TYPE=MyISAM Elconjuntoenterodedefinicionesdelastablasseencuentradisponibleen http://www.vbmysql.com/download/vbmysqltutorial.sql. FjatequeeninglsunavezmshasurgidoelproblemadelaspalabrasreservadasyaquelatablaGroup (Grupo)utilizabaunapalabrareservada.Esposibleusarunapalabrareservadacomonombredecolumnao tablaencerrndolaentrecomillassimples(`Group`)cadavezquequierasusarlaperoyoprefieroevitarel problema.Encambio,serenombraralatablaporGroups(Grupos)(engeneraldebeevitarseelusodepalabras pluralesenlosnombresdetabla). Debeobservarsequealigualqueusarelmismonombreparaunaclaveforneaylaclaveprimaria(usa ID_Usuarioentodaslastablasenlasquesehagareferencia),tambindeberasasegurartedeusarelmismotipo dedatos.Porlotanto,asegratedequetodosloscamposID_UsuariosonSMALLINTUNSIGNEDyque

todosloscamposNombre_GruposonCHAR(20).AsegratedequetodaslascolumnasCHARyVARCHAR tenganelmismoancho(enestecaso20caracteres)yaquenoquerrsqueunatablapuedaalmacenarun nombredegrupomslargoqueotra. Conclusin Hemoscreadounalistadefuncionesyrequerimientosparanuestraaplicacinquenoslonosayudara determinarcundoestarcompletonuestroproyectosinquetambinnosayudaradefinirlasentidadesde nuestraaplicacin.Utilizaremosnuestrodiseodeentidadesparadefinirlosobjetosdenuestraaplicaciny tambinparadisearlastablasdenuestrabasededatos.Unavenquenuestrastablashansidodefinidasy diseadas,podemosutilizarsentenciasCREATETABLEparacrearlastablasennuestroservidorMySQL.

EltutorialdeVBMySQLParte2
PorMikeHillyer
ltimaactualizacin:7deEnero,2005 1. Introduccin 2. EleccindeunaVersindeMySQL 3. DescargaeInstalacindeMySQL ElAsistentedeInstalacindeMySQL ElAsistentedeConfiguracindeMySQL 4. DescargaeInstalacindeMySQLQueryBrowser InstalacindeMySQLQueryBrowser 5. CreacindelaBasedeDatos IniciodeMySQLQueryBrowser CreacindeunaBasedeDatos CreacindelasTablas 6. CreacindeunUsuario 7. Conclusin

Introduccin
Enmiltimoartculo,escribcmodisearunabasededatosdeMySQLconelobjetivodealmacenardatos paraunaaplicacinquesecrearaenVisualBasic.NET(VB.NET).Lasdefinicionesdetablascompletas puedenencontrarseenhttp://www.vbmysql.com/download/vbmysqltutorial.sql.Enestetutorialvoya mostrartecomoinstalarMySQLenWindows ,instalarMySQLQueryBrowserycmocargarlas definicionesdetablasenMySQLutilizandolafuncinScriptEditordeMySQLQueryBrowser.Estetutorial darporsentadoqueestsutilizandoMicrosoftWindowscomosistemaoperativoprincipaltantoparael servidorMySQLcomoparaMySQLQueryBrowser,yquetucopiadeWindowsesunaversinreciente basadaenWindowsNTcomoWindows2000oWindowsXP.Estetutorialtambinasumirquenotienes ningunaversinpreviadeMySQLinstalada. Alfinalizarestetutorial,deberastenerunainstalacinfuncionaldeMySQLquecontengatubasededatosy algunosdatosdeejemplo,loquetepermitircomenzaraprogramarenVB.NETenelprximotutorial.Alfinal deestetutorialencontrarsunhipervnculoaunscriptMySQLquecontienetodaslassentenciasSQLutilizadas. Elscriptpuedeutilizarseparagenerarunclonexactodelabasededatosqueharemosenesteartculo.

EleccindeunaVersindeMySQL
ActualmenteexistentresversionesdeMySQLdisponiblesparaserdescargadasdesdedev.mysql.com:MySQL 4.0,MySQL4.1yMySQL5.0.Almomentodeescribiresteartculo,tantoMySQL4.0como4.1se encuentrancatalogadascomodeDisponibilidadGeneraloproductosfinales.Estosignificaqueestasversiones hanpasadoporextensosprocesosbetayseleshancorregidotodosloserroresconocidos,sinnuevosinformes deerroresenunperododeterminado.Puedesencontrarlascaractersticasincluidasenlastantasversionesde

MySQLenhttp://dev.mysql.com/doc/mysql/en/Roadmap.html.Generalmenteseaconsejautilizarlaltima versindeMySQLquehayasidoanunciadacomoproductofinal,ennuestrocasoeslaversin4.1.Aunque MySQL5ofrezcaunmayorconjuntodefuncionescomparadaconMySQL4.1,elhechodequenohayasido lanzadacomoDGsignificaqueserdifcildeterminarsiunerrordadoescausadopornuestrocdigoounerror enlaversinalfadeMySQL.

DescargaeInstalacindeMySQL
MySQL4.1puededescargarsedehttp://dev.mysql.com/downloads/mysql/4.1.html.Existentresversionesdela descargaparaWindows:WindowsEssentials,Windows,yWithoutinstaller(Sininstalador).Ennuestro casoelpaqueteWindowsEssentialsserelmsapropiado.Descargaelinstaladoratudiscorgidoycuando finaliceladescarga,hazdobleclicenelarchivodeinstalacinparainiciarlainstalacin(elarchivodeinstalacin sellamaralgoascomomysql4.1.7essentialwin.msi). ElAsistentedeInstalacindeMySQL Unavezquehayashechodobleclicenelarchivodeinstalacin,semostrarelAsistentedeInstalacin.Habr trestiposdeinstalacindistintosdisponibles:Typical(Tpica),Complete(Completa),yCustom (Personalizada).Ennuestrocaso,lainstalacinTpicaseajustaranuestrosobjetivos.Eligelaopcinde instalacinTypicalyhazclicenelbotnNext(Siguiente).Enlapantalladeconfirmacin,hazclicenelbotn Install(Instalar)paracomenzarlainstalacin. MySQLseinstalarenlacarpetaC:\ProgramFiles\MySQL\MySQLServer4.1(osuequivalente C:\ArchivosdePrograma\MySQL\MySQLServer4.1)ysetepreguntarsiquieresregistrarteenelsitiode MySQL.Laregistracinesopcionalperoresultatilsiquieresutilizarlosforosdeforums.mysql.comoinformar erroresabugs.mysql.com. LapantallafinaldelAsistentedeInstalacindeMySQLteinvitaainicialelAsistentedeConfiguracinde MySQL. ParamsinformacinacercadelautilizacindelAsistentedeInstalacindeMySQL,dirgetea http://dev.mysql.com/doc/mysql/en/Windows_install_wizard.html. ElAsistentedeConfiguracindeMySQL ElAsistentedeConfiguracindeMySQLcrearunarchivodeconfiguracinmy.iniportieinstalarMySQL comoservicioentusistema.LadocumentacincompletadelAsistentedeConfiguracindeMySQLest disponibleenhttp://dev.mysql.com/doc/mysql/en/Windows_config_wizard.htmlyesunabuenareferenciapara configuracionesavanzadas.EnesteartculoexplicarlobsicoparautilizarelAsistentedeConfiguracinde MySQLparaelusodeundesarrolladordeoficina. LaprimerapantalladedilogodelAsistentedeConfiguracindeMySQLtepedirqueelijasentreStandard Configuration(ConfiguracinEstndar)yDetailedConfiguration(ConfiguracinDetallada).La ConfiguracinEstndaresidealparaundesarrolladordeoficinaqueserelnicousuarioqueseconectea MySQL,dondeMySQLtendrquecompartirrecursosconelrestodetusaplicacionesdeescritorio.Elige StandardConfigurationyhazclicenelbotnNext(Siguiente).

LasiguientepantalladedilogovisualizadatepermiteconfigurarunserviciodeWindowsparaMySQL. ConfigurarMySQLcomounserviciodeWindowsharqueMySQLseiniciecuandoseprendalacomputadora yserecomiendaparaevitarellodetenerqueiniciarMySQLmanualmentecadavezquenecesitesusarlo.Yo cambiogeneralmenteelnombredelservicioporalaopcinMySQL41paraqueencajebienconotrascopias deMySQLquetengoenmiescritorio,perosivasatenerunanicainstalacindeMySQL(queesloms probable),puedenutilizarelnombredeserviciopordefectodeMySQL.PresionaNext(Siguiente)para avanzaralsiguientedilogo. LuegodeconfigurarelservicioMySQL,necesitarsestablecerlacontraseadelusuarioroot(elusuarioraz)de tuservidor.CadavezquetengasunproductoservidorMySQLdebesestablecerlacontraseadelusuario rootparalograrseguridad.Sinoestablecesunacontraseaparaelusuarioroot,cualquieraquetengaaccesoa tuservidorMySQLpodrcausartodotipodedaosatusbasededatos.Siereselnicousuarioyelpuertoal servidorestbloqueadoporunfirewallpuedesoptarpornoestablecerunacontraseadelusuariorootpara simplificarelingresoaMySQL,peroyonolorecomiendo. LoquesrecomiendoesestablecerunacontraseaparaelusuariorootytildarlaopcinRootmayonly connectfromlocalhost(Usuariorootslopuedeconectarsedesdelocalhost)siestsinstalandoMySQLen tuescritorio.NomarqueslaopcinCreateAnAnonymousAccount(CrearunaCuentaAnnima).Presiona elbotnNext(Siguiente)paraavanzaraldilogodeconfirmacin. Enlapantalladeconfirmacin,presionaelbotnExecute(Ejecutar)parainiciarelprocesodeconfiguracin. ElAsistentedeConfiguracindeMySQLcrearunarchivodeconfiguracin,iniciarelservidorMySQLy establecerlacontraseadelusuariorootquehayasespecificado.Unavezquefinaliceelprocesode configuracin,presionaelbotnFinish(Finalizar)paracerrarelasistente.

DescargaeInstalacindeMySQLQueryBrowser
MySQLQueryBrowseresunaherramientaGUIdesegundageneracindeMySQLAB.MySQLQuery Browseresunagranherramientaquetepermitecrearyeditartablasyluegoexplorarloscontenidosdelatabla, haciendocambiosenelacto.MySQLQueryBrowseresactualmenteunaversinbetaperoyasehaconvertido enunaherramientamuytil.LadocumentacindeMySQLQueryBrowserseencuentraen http://dev.mysql.com/doc/querybrowser/en/index.html. InstalacindeMySQLQueryBrowser MySQLQueryBrowserpuededescargarsedehttp://dev.mysql.com/downloads/querybrowser/index.html. EvitaelegirlaversinWithoutInstaller(SinInstalador).Guardaelarchivodeinstalacinentudiscorgido.El archivodeinstalacindeberatenerunnombreparecidoamysqlquerybrowser1.1.1gammawin.msi. Unavezquehayasdescargadoelarchivodeinstalacin,hazdobleclicparainstalarMySQLQueryBrowser.El instaladoresunasistentedeinstalacinestndarquenorequiereningunaexplicacin.MySQLQueryBrowser seinstalarenC:\ProgramFiles\MySQL\MySQLQueryBrowser1.0(osuequivalenteC:\Archivosde Programa\MySQL\MySQLQueryBrowser1.0)amenosquehayasespecificadounarutadistinta.

CreacindelaBasedeDatos
AhoraqueyahemosinstaladoelservidordebasededatosMySQLyMySQLQueryBrowser,podemos

comenzarconelprocesodecreacindenuestrabasededatos.Paradecirlobiensimple,unabasededatoses unacoleccindedatosalmacenadosentablascompuestasporcolumnasyfilas.Unabasededatosfunciona comounrecipienteparalastablasquecreamosenelprimertutorial. IniciodeMySQLQueryBrowser UnavezinstaladoMySQLQueryBrowserpuedesempezarhaciendoclicenInicio>Programas>MySQL> MySQLQueryBrowser.Luegoaparecerlapantalladedilogodeconexin: CompletaloscamposconlainformacinapropiadaparatuinstalacindeMySQL.Siinstalasteelservidor MySQLyMySQLQueryBrowserenlamismamquina,utiliza127.0.0.1comohostname(nombredehost).El campoSchema(Esquema)correspondealabasededatospordefectoqueserutilizadapararesolverlas consultas.Comotodavanohemoscreadounabasededatosparanuestraaplicacin,seincluyelabasede datostest queseinstalapordefectoentodaslasbasesdedatosMySQL.HazclicenelbotnOK(Aceptar) parainiciarMySQLQueryBrowser. CreacindeunaBasedeDatos UnavezqueMySQLQueryBrowsersehayainiciadocorrectamente,deberasverunaventanacomola siguiente: Enelladoderechopuedesverelnavegadordelabasededatos(Schemata).Esteproporcionaunalistadelas basesdedatosqueresidenactualmenteenelservidorMySQL.Labasededatosmysqlcontrolatodala informacindeingresoalservidorylospermisosquetienenlosusuariosalaccederaMySQL.Labasededatos test sepresentacomounlugarparaprobarconsultasysentenciasdecreacindetablasqueestdisponiblepara todoslosusuarios.Labasededatostestestmarcadaennegritaparaindicarqueesactualmentelabasede datospordefectocualquierconsultaqueseingreseserejecutadapordefectoenlabasededatostest. Paracrearlabasededatos,hazclicconelbotnderechodentrodelalistadebasesdedatosyeligelaopcin CreateNewSchema(CrearNuevoEsquema).Setepedirunnombreparatubasededatos.Enesta instancia,nuestraaplicacinnotieneunnombreentoncestendremosqueelegiralgunobastantedescriptivo. Comonuestraaplicacinregistraresencialmentequinhaentradoysalidodelaoficina,voyallamaralabase dedatosentrada_salida.Elnombrenotieneletrasenmaysculaparaevitarlosproblemasdediferenciasentre maysculasyminsculasquepuedanexistirentrelasversionesdeMySQLdeWindowsyLinux(notarsquehe actualizadoelscriptSQLdelltimotutorialparaadaptarloaestaconvencindenombres).Puedessepararlas palabrasconunguin,guinbajoosimplementeconnada.Evitaelusodeespaciosenelnombredetubasede datosyrecuerdaquequeremosevitarelusodepalabrasreservadas.Enmicaso,separarlaspalabrasconun guinbajo. Unavezcreadalabasededatos,hazclicconelbotnderechoyeligelaopcinMakeDefaultSchema (EstablecerEsquemaporDefecto).Latablaentradasalidaesahoralabasededatospordefectoy nuestrasprximassentenciasdecreacindetablasseaplicarnaestabasededatos. CreacindelasTablas Cuandoyahayamoscreadolabasededatosyestablecidopordefecto,podemoscargarelscriptSQLcon nuestrassentenciasdecreacindetablas.Descargaelscriptdehttp://www.vbmysql.com/download/vbmysql

tutorial.sqlentudiscorgido.EligelaopcinOpenScript(AbrirScript)delmenFile(Archivo)de MySQLQueryBrowser. Cuandosehayacargadoelscript,hazclicenelbotnExecute(Ejecutar)paracrearlastablas.Cuando terminelaejecucin(deberaserinstantnea),puedeshacerclicenlaflechitanegraalaizquierdadelnombrede labasededatosparaverlastablas.Presionalasflechitasnegrasalladodelosnombresdelastablasparaverla listadecolumnasdelatabla: Suponiendoquenotuvisteerrores,tubasededatosdeberahabersecreado.

CreacindeunUsuario
Ahoraquenuestrastablasestnensulugar,tendremosquecrearunusuario.Paracrearunafilaenunatablacon MySQLQueryBrowser,primerodebeshacerdobleclicenlatabla(ennuestrocasolatablausuario).Esto crearunaconsultaSELECT*FROMusuarioenelreadeconsultassuperior.PresionaelbotnExecute (Ejecutar)paraejecutarlaconsultayascrearunanuevasolapaderesultadosconunconjuntodefilasvacas: PresionaelbotnEdit(Editar)delaparteinferiordelaventanaparahabilitarlaedicin,luegohazdobleclicen elcampoapellidoparainiciarlaedicin.PuedesutilizarlateclaTabparadesplazartealsiguientecampodela filaamedidaqueingresaslosdatos.Enmicaso,ingreslosiguiente: apellido:Hillyer nombre:Mike telefono:4033806535SINGUIONES nombreusuario:mike contrasea:12345 administrador:VERDADERO eliminado:FALSO creado:2004112711:41:00 Lomsimportanteesrecordarquesloqueesperalatablaentrminosdeformatodelosdatos.Tunombrey apellidonopuedensuperarlos40caracteres.Tunmerodetelfononopuedesermayora10caracteres.Tu nombredeusuarionopuedeexcederlos16caracteresytucontraseanopuedetenermsde20caracteres. LosvaloresparaloscamposadministradoryeliminadodebenserVERDADEROoFALSOyelcampo creadodebetenerelformatoYYYYMMDDHH:MM:SS. Cuandohayasingresadotusdatos,presionaelbotnApplyChanges(AplicarCambios)paracrearlanueva fila.TambinpuedeshacerclicenelbotnEdit(Editar)paradesactivarlaedicin.

Conclusin
Suponiendoquenohastenidoerrores,yadeberastenerunacopiafuncionaldeMySQLinstalada,juntocon MySQLQueryBrowser.Deberashaberpodidocrearlabasededatosentrada_salidayllenarlaconlastablas quehabamosdiseadoeneltutorialanterior.Unavezquesecrearonlastablas,deberashaberpodidocrear unanuevafilaenlatablausuario.Claroquetambinpuedeshacertrampaydescargarteelscriptdesde http://www.vbmysql.com/download/vbmysqltutorial2.sqlyejecutarloparacrearunabasededatosidnticaa laqueyohecreado.

EltutorialdeVBMySQLParte3
PorMikeHillyer
ltimaActualizacin:15deFebrero,2004 1. Introduccin 2. DiseodeunSistemadeAcceso 3. UtilizarMySQLAdministrator DescargaeInstalacinMySQLAdministrator ConexinaMySQLServer AgregarUnUsuario 4. Connector/NET DescargaeInstalacindeConnector/NET 5. VisualBasic.NET DescargaeInstalacindeVisualBasic.NET2005ExpressEdition IniciodeVisualBasic.NET LaVentanaPrincipaldeVB.NET AsignarunNombrealFormularioporDefecto AgregarReferencias GuardarelProyecto 6. DiseodelFormulariodeAcceso 7. CreacindeunEvento 8. IniciodelaAplicacin 9. ImportacindelSistemadeNombresdeConnector/NET 10. AgregarunObjetoMySqlConnection 11. InstanciacindelObjetoMySqlConnection 12. ArmadodelStringdeConexin 13. AperturadelaConexin 14. UtilizacindeunMessageBox 15. CierredelaConexin 16. EliminacindelObjetoMySqlConnection 17. CapturadeErrores 18. PruebadelProyecto 19. Mejoras 20. Conclusin

Introduccin
EsteartculoeslatercerapartedeunaseriedeartculosrealizadosparadocumentarlacreacindeaplicacionesdeWindowsutilizandoVisual Basic.NETyMySQL.Enlosartculosanteriores,hedescritocmodisearunaaplicacinybasededatos,instalarMySQLyMySQLQueryBrowser ycmocompletarnuestratablautilizandolafuncinScriptEditordeMySQLQueryBrowser. Enesteartculo,describircmoinstalarMicrosoftVisualBasic2005ExpressEdition,MySQLAdministratoryMySQLConnector/NET. Utilizaremosestasherramientasparacrearunformulariodeaccesoalsistemaparanuestraaplicacinderegistro.

DiseodeunSistemadeAcceso
Existenvariasopcionesposiblesaltrabajarenunsistemadeaccesosperogeneralmenteseoptaporunadedosopciones: 1. Creartupropiosistemadeacceso.AlmacenanombresdeusuariosycontraseasenunatabladeMySQLyutilizaunanicacuentade usuarioparatodaslasinstanciasdelaaplicacinqueseconecteaMySQL.Cadainstanciadelaaplicacinseconectaraunacuentade servidoryluegovalidarelusuarioutilizandolastablasquesehancreado. 2. UtilizarlastablasdeseguridadpropiasdeMySQL.CreausuariosMySQLparacadacuentaydejaqueMySQLseencarguedela administracindelaautenticacinylosprivilegios. Ambosenfoquestienensusrespectivasventajasydesventajas.Cuandoconstruyesunsistemadeacceso,potencialmentetienenmayorcontrolsobrelos usuarios,gruposyprivilegios.TienesunmanejomssimpledelospermisosporquesenecesitaunnicoMySQLnativo.Porotraparte,existeuna mayorprobabilidaddequeexistanproblemasdeseguridadporqueloquecreesnopasarporunprocesoderevisincomoelquetieneelservidor MySQL.Adems,tienesunpuntodbilencuantoalaseguridadyaquecadainstalacindelclientetieneunacopiadelacuentacentraldeusuariopara conectarseaMySQLyesacuentadebetenerlamayorcantidaddepermisosposibleparaunusuarioadministrativo.Estasconsideracionesnosontan

importantesaldesarrollarunaaplicacinwebporqueesmsfcilmanejarunainstanciawebqueunacoleccindeaplicacionesdeescritorio. CuandouseslasopcionesdeseguridadpropiasdeMySQL,obtienesunsistemadeadministracindeprivilegiosrobustoquehasidominuciosamente revisadoyprobado.Puedesrestringirlosprivilegioscongrandetalleeinclusoasignardistintospermisosbasadosenelhostdesdeelcualseconectaun usuario.Ladesventajatienequeverconlacomplejidad:sacarleelmayorprovechoalaautenticacinpropiadeMySQLesmsdifcilquehaceruna portucuentaydebersagregarunusuarioalservidorMySQLcadavezquequierasagragarunnuevousuarioatuaplicacin. Comoestanoesunaaplicacinbasadaenweb,crearemosnuestraaplicacinutilizandoelsistemadeprivilegiospropiodeMySQL.Parapodercrear unusuarionativoenMySQLtendremosqueinstalarprimeroMySQLAdministrator,unaaplicacinGUIparalaadministracindeservidores.

UtilizarMySQLAdministrator
MySQLAdministratoresunaherramientaGUIlanzadaporMySQLABparaadministrartuservidorMySQL.MySQLAdministratorpuedeutilizarse paraadministrarusuarios,cambiarlaconfiguracindelservidor,manipularlasbasesdedatosdelservidorymonitorearelestadodelservidor. DescargaeInstalacindeMySQLAdministrator MySQLAdministratorpuededescargarsedesdehttp://dev.mysql.com/downloads/administrator/1.0.html.Ennuestrocaso,necesitamoslaversinde Windowsqueincluyeelinstalador,evitatomarlaversinWithoutInstaller(SinInstalador).Guardaelinstaladorentudiscoyhazdobleclicenel iconodelinstaladorparacomenzarlainstalacin.ElinstaladoresuninstaladorestndardeWindowsynodeberarequerirningunaaccinespecial. ConexinaMySQLServer Luegodequefinalicelainstalacin,deberaapareceruniconodeMySQLAdministratorentuescritorio.HazdoblecliceneliconodeMySQL Administratorparaverelformulariodeacceso.TambinpuedesiniciarMySQLAdministratorhaciendoclicenInicio>Programas >MySQL> MySQLAdministrator. ElformulariodeaccesodeMySQLAdministratorescasiidnticoalformulariodeaccesoaMySQLQueryBrowser,conladiferenciadequeMySQL Administratornorequierequeseleespecifiqueunesquemapordefecto.IngresatuinformacindeaccesocomousuariorootypresionaelbotnOK (Aceptar)paraabrirMySQLAdministrator. AgregarUnUsuario HazclicenlaopcinUserAdministration(AdministracindeUsuarios)delpaneldemenesdelaizquierdaparaverlapantalladeadministracin deusuarios. PresionaelbotnNewUser(NuevoUsuario)paracrearunacuentacomonuevousuario.EnlaopcinMySQLUser(UsuariodeMySQL)utilizael valordeusername(nombredeusuario)queestablecisteentufiladeusuarioeneltutorialanterior.Agregaunacontraseayestablececualquier InformacinAdicionalquequierasespecificar(todalainformacindelaseccinAdditionalInformationesopcional). Cuandoyahayaspuestounnombredeusuarioycontrasea,presionalasolapaSchemaPrivileges(PrivilegiosdelEsquema).Hazclicsobrela basededatosentrada_salidayluegosobreelbotnparaasignarleatuusuariotodoslosprivilegiosdisponiblesparalabasededatos (refinaremoslalistadeprivilegiosenelfuturo).PresionaelbotnApplyChanges(AplicarCambios)paracrearelnuevousuario.Ahora puedescerrarMySQLAdministrator.

Connector/NET
Aprincipiosde2004MySQLABcontrataReggieBurnettdeByteFXyadquirisuproveedordedatosByteFX.NETparaMySQL.Elproveedor serenombrporConnector/NETynosloseproveegratisbajolostrminosdelaGNUPublicLicense,sinoqueesunodelasmscompletosy mejoresproveedoresde.NETparaMySQLdisponiblesenlaactualidad.Connector/NETfueescritoenC#yesuncdigocompletamente manipulable,permitiendosuportabilidadacualquierplataformaquesoporte.NET,inclusoMono.UnaventajaqueofreceConnector/NETporsobre otrassolucionesessuusodelprotocoloMySQLnativo:muchasotrassolucionesenvuelvenlalibreradeclienteCdeMySQLysufrenunaprdidade performancecomoconsecuencia. DescargaeInstalacindeConnector/NET MySQLConnector/NETpuedeserdescargadodesdehttp://dev.mysql.com/downloads/connector/net/.Descargalaversinqueincluyeelinstaladora tudiscorgidolocalydescomprimeelarchivoZip. Hazdobleclicsobreelarchivodeinstalacinparacomenzarelprocesodeinstalacin.Realizaunainstalacincompletaeneldirectoriopordefecto.

VisualBasic.NET

VisualBasic.NETeslanuevaversindeVisualBasic.SibiencomparteelnombreVisualBasic,existendiferenciassignificativasentreVisualBasic6y VisualBasic.NET.VB.NETyaestentrandoensuterceraversin.LaprimeraversinfueVisualBasic.NET,lasegundafueVisualBasic.NET2003y lanuevaversinesVisualBasic.NET2005.VisualBasic.NET2005estactualmenteensufasedepruebabetayademsestaversinpresentauna nuevaversinExpressqueutilizaremosenestetutorial. LaversinExpressdeVisualBasic.NETesbsicamenteunaversinpeladaqueconservatodalasfuncionesnecesariasparaproduciraplicaciones bsicas(noquiselograrningnjuegodepalabras). DescargaeInstalacindeVisualBasic.NET2005ExpressEdition VB.NET2005ExpressEditionpuededescargarsedesdehttp://lab.msdn.microsoft.com/express/vbasic/default.aspx.Buscaalgnhipervnculode descargaparalaCommunityTechnicalPreview(AdelantoparalaComunidadTcnica)oalgnhipervnculotipoDownloadNow(DescargueAhora). Cuandohayasdescargadoelinstalador,hazledobleclicparacomenzarelprocesodeinstalacin.Lasopcionesdelainstalacinpordefectodeberan sersuficientes. IniciodeVisualBasic.NET CuandoyahayasinstaladoVB.NET2005,buscaunaccesodentrodelaseccinProgramas detumenInicioquedigaVisualBasic2005Express EditionBeta.IniciaVB.NETypresionaCtrl+Nparacrearunnuevoproyecto. IngresaunnombreparaelproyectoyeligelaplantillaWindowsApplication(AplicacinparaWindows).PresionaelbotnOK(Aceptar)paracrear elproyecto. LaVentanaPrincipaldeVB.NETWindow Cuandosecreetuproyecto,deberasverunaventanaparecidaaesta: Alaizquierdaseencuentralabarradeherramientas.Puedesarrastrarelementosdelabarradeherramientasparaagregarlosatuaplicacin.Enel centrotenemoselespaciodetrabajo,elcualnosmuestraelprimerformularioenlavistaDiseo.AladerechaestelSolutionExplorer(Exploradorde Soluciones),quemuestratodoslosarchivosinvolucradosennuestroproyecto. AsignarunNombrealFormularioporDefecto PrimerohazclicenelobjetoForm1.vbdelSolutionExploreryeligelaopcinProperties(Propiedades).Estotemostrarunaventanadedilogode propiedadesdondepodremosrenombrarelarchivo. LaherramientaPropiedadesseutilizaparaestablecervariaspropiedadesdelosobjetosquemanejaremosamedidaquetrabajemosennuestro proyecto.Enestecaso,queremoscambiarlapropiedadFileName(NombredeArchivo)parareflejarmsapropiadamenteelpropsitodel formulario.Agregarelprefijofrmalosnombresdelosformularios.Nocambieslaextensindelarchivodelformulario. Cuandohayascambiadoelnombredelarchivo,hazclicenelformulariodentrodelespaciodetrabajo.LaherramientaPropiedadescambiarpara reflejarlaspropiedadesdelformulario.DesplzatehaciaabajohastaqueencuentreslapropiedadText(Texto)yponlealgoapropiado.Enmicaso,le puseEntradaSalidaAcceso.LapropiedadTextdeterminaloqueaparececomottulodelformularioypuedesverestoreflejadoenelespaciode trabajo. AgregarReferencias AntesdecomenzarautilizarConnector/NETconVisualBasic,necesitamosagregarunareferenciaanuestroproyecto.Alagregarunareferencia,le estamosdiciendoaVB.NETdndedebebuscarMySQLConnector/NETparapoderaccederalosobjetosymtodosdeConnector/NET. Paraagregarunareferencia,eligelaopcinAddReference(AgregarReferencia)delmenProject(Proyecto).EligelasolapaBrowse (Examinar)ylocalizalainstalacindeConnector/NET,generalmenteubicadaenC:\ProgramFiles\MySQL\MySQLConnectorNet1.0.2\bin\.NET 1.1(osuequivalenteC:\ArchivosdePrograma\MySQL\MySQLConnectorNet1.0.2\bin\.NET1.1)(Larutapuedevariardependiendodel nmerodeversindeConnector/NET).EligeelarchivoMySql.Data.dllyconnector/NETseagregaratuproyecto. GuardarelProyecto Ahoraqueyahemosconfiguradoalgunasopcionesdenuestroproyecto,deberamosguardarelproyectoantesdecontinuar.EligelaopcinSaveAll (GuardarTodo)delmenFile(Archivo).Comoestaeslaprimeravezqueguardamoselproyecto,aparecelasiguientepantalladedilogo: Estasopcionesdeberanaceptarsegeneralmente,guardandoelproyectoenunanuevacarpetadentrodelacarpetaMisDocumentos/Visual Studio/Projects(enmicasoutilizounarutapersonalizadaaMisDocumentos).PresionaelbotnSave(Guardar)paraguardartuproyecto.

DiseodelFormulariodeAcceso
Paradisearelformulariodeacceso,arrastralosobjetosdesdelabarradeherramientashastaelformulario.Ennuestraprimeraversinnecesitaremos pedirlesalosusuariosunnombredeservidor,nombredeusuarioycontrasea.HazclicenelobjetoTextBoxdelabarradeherramientasyarrstralo hastaelformulario.Unavezqueseubiquedentrodelformulario,lopuedesestirar,moverygeneralmentemejorarsutamaoyposicin.Cuandoests contentoconlaubicacindelcuadrodetexto,vealaherramientaPropiedadesybuscalapropiedadName(Nombre).Cambiaelnombrepara reflejarmejorelusodelcuadrodetexto(enmicasolepusetxtServidor).AgregadoscuadrosdetextoadicionalesyllmalostxtUsuarioy txtContrasea. Aunquenosparezcaobvioculeselpropsitodecadacuadrodetexto,elusuariofinalprobablementenecesitealgodeayuda.Utilizaremosobjetos Label(Etiquetas)comoindiciosparaelusuarioqueleindicarnparaquseutilizacadacuadodetexto.Arrastraelobjetoetiquetahastaelformulario yubcalaenlamismalneaqueelprimercuadrodetexto.Unavezqueestubicada,buscalapropiedadText(Texto)enlaherramientaPropiedadesy ponlealgocomoServidor:.RepiteesteprocesodosvecesmsparalosobjetosTextBoxrestantes.Comonoutilizaremoslasetiquetasenelcdigo verdaderodelaapliacin,nohaynecesidaddecambiarlosnombrespordefectodelasetiquetas. Elelementofinalquedebeagregarseanuestroformularioserunpardebotonesunoparainiciarelprocesodeaccesoyelotroparacancelar. ArrastralosbotonesalformularioyestablecelapropiedadName(Nombre)acmdIngresarycmdCancelar.CambialapropiedadText(Texto)a IngresaryCancelar,respectivamente. Cuandohayasterminadoesteproceso,tuformulariodeberaverseas:

CreacindeunEvento
VoyaempezarcreandouneventoparaelbotnCancelar.UneventoesalgoquedisparalaejecucindecdigodentrodeVB.NET.Enestecaso,el eventoencuestinserelhaberpresionadoelbotnCancelar.Laformamssimpledecrearuneventodeclicdebotneshacerdobleclicenelbotn delformulario.Cuandohacesdobleclicenelbotncancelar,semostrarlavistaCdigodelformularioypodrsverelsiguientecdigo:
P u b l i cC l a s sf r m A c c e s o P r i v a t eS u bc m d C a n c e l a r _ C l i c k ( B y V a ls e n d e rA sS y s t e m . O b j e c t ,B y V a leA sS y s t e m . E v e n t A r g s )H a n d l e sc m d C a n c e l a r . C l i c k E n dS u b E n dC l a s s

LalneaPublicClass indicaqueestaclasedescribenuestroformularioylalneaPrivateSubmuestraqueestaesunasubfuncinquemanejaelevento ClickdelobjetocmdCancelar.LasdoslneasEndmuestrandndeterminaelcdigodecadaunadeestassecciones. Agregaremosunanicalneaalasubfuncinparacerrarlaaplicacincuandosehagaclicenelbotn:


A p p l i c a t i o n . E x i t ( )

EstalnealeindicaalaaplicacinquedebecerrarseyserejecutadacuandohagamosclicenelbotnCancelar.Ahora,tucdigodeberaverseas:
P u b l i cC l a s sf r m A c c e s o P r i v a t eS u bc m d C a n c e l a r _ C l i c k ( B y V a ls e n d e rA sS y s t e m . O b j e c t ,B y V a leA sS y s t e m . E v e n t A r g s )H a n d l e sc m d C a n c e l a r . C l i c k A p p l i c a t i o n . E x i t ( ) E n dS u b E n dC l a s s

IniciodelaApliacin
Unavezquehayasingresadoelcdigo,guardaelproyectoypresionalateclaF5paraprobarlaaplicacin.TambinpuedeselegirlaopcinStart (Iniciar)desdeelmenDebug(Depuracin)hacercliceneliconoverdedelabarradeherramientas. TuformulariodeberamostrarseysihacesclicenelbotnCancelar,elformulariodeberadesaparecerparacerrarlaaplicacin.Sipresionaselbotn Ingresar,nosucedernadayaquenohemoscreadoningncdigoparaeleventodepresionarelbotnIngresar.

ImportacindelSistemadeNombresdeConnector/NET
LosobjetosdeVB.NETseorganizanensistemasdenombres.Lossistemasdenombressonagrupacioneslgicasdeobjetosqueseutilizanpara facilitarlaorganizacinlosdistintosobjetosdisponiblesenVB.NET. ParautilizarunobjetoConnectionnecesitasdefinirlocomoMySql.Data.MySqlClient.MySqlConnection(hablaremosmssobreesteobjeto luego).PorsupuestoqueestoesmuylargoparaescribirloseguidoporloquepodemosutilizarlasentenciaImportsparaacortarlo. SiagregamosImportsMySql.Data.MySqlClientalprincipiodelarchivofuente,nospodemosreferiralobjetoConnector/NETcomo MySqlConnection.

AgregarunObjetoMySqlConnection
MySQLConnector/NETesbsicamenteunacoleccindeobjetosutilizadosparaaccederaunabasededatosMySQL.Elprimerobjetoque utilizaremoseselobjetoMySqlConnection.Elobjetodeconexinfuncionacomounintermediarioentrelosdemsobjetoscontenidosdentrode Connector/NETyelservidorMySQL.Elobjetodeconexinmanejaelprocesodeaccesoyeselobjetoqueutilizaremosparaverificarquela informacindeaccesodeunusuarioescorrecta. Existendospasosparacrearunobjeto.Primero,declaramoselobjeto,luegoloinstanciamos.Cuandodeclaramosunobjeto,leasignamosunnombre queusaremosparareferirnosalytambinindicamoselalcancedelobjeto,oenotraspalabras,qufuncionesyprocedimientospuedeaccederel objeto.Ennuestrocaso,tenemosqueasegurarnosdequecualquierfuncinoprocedimientodentrodelformulariotengaaccesoalobjetodeconexin, porlotantodeclararemoselobjetodeconexinenprimerlugardentrodelaclase:
I m p o r t sM y S q l . D a t a . M y S q l C l i e n t P u b l i cC l a s sf r m A c c e s o D i mc o nA sM y S q l C o n n e c t i o n P r i v a t eS u bc m d C a n c e l a r _ C l i c k ( B y V a ls e n d e rA sS y s t e m . O b j e c t ,B y V a leA sS y s t e m . E v e n t A r g s )H a n d l e sc m d C a n c e l a r . C l i c k A p p l i c a t i o n . E x i t ( ) E n dS u b E n dC l a s s

LapalabraclaveDimseutilizaaldeclararobjetosyvariables.Youtilicconcomonombreparamiobjetodeconexin.LapalabraclaveAsseusa paraindicarquestamosdeclarando(unobjeto,unavariable,etc).Finalmente,MySqlConnectioneselobjetoqueestamosdeclarando.

InstanciacindelObjetoMySqlConnection
Ahoraqueyahemosdeclaradoelobjetodeconexin,debemosinstanciarlo.Hastaquenohayamosinstanciadounobjeto,noestardisponiblepara serutilizado.InstanciaremoselobjetodentrodelasubfuncinquemanejaeleventoclickdelbotnIngresar.HazdobleclicenelbotnIngresarenla vistaDiseoparacrearlasubfuncin. ParainstanciarelobjetoutilizaremoslapalabraclaveNew:
P r i v a t eS u bc m d I n g r e s a r _ C l i c k ( B y V a ls e n d e rA sS y s t e m . O b j e c t ,B y V a leA sS y s t e m . E v e n t A r g s )H a n d l e sc m d I n g r e s a r . C l i c k c o n=N e wM y S q l C o n n e c t i o n ( ) E n dS u b

ArmadodelStringdeConexin
ElobjetoMySqlConnectionutilizaunstringdeconexinparaconoceraquservidordebeconectarse,qubasededatosaccederyqunombrede usuarioycontraseautilizarparaautenticarse.Lasdistintaspropiedadesseseparanconpuntoycoma.Esteesunejemplodeunstringdeconexin:
s e r v e r = l o c a l h o s t ;u s e ri d = m i k e ;p a s s w o r d = 1 2 3 4 5 ;d a t a b a s e = e n t r a d a _ s a l i d a

Obviamente,necesitamosqueelstringdeconexinreflejelainformacinqueelusuarioingreseenelformulario.Parahacerestoutilizaremoselcarcter &paraunirlosdistintosstringsyelvalor.TextdelosobjetosTextBox.Adicionalmente,utilizarelcarcter_parasepararelcdigoenvariaslneas:
P r i v a t eS u bc m d I n g r e s a r _ C l i c k ( B y V a ls e n d e rA sS y s t e m . O b j e c t ,B y V a leA sS y s t e m . E v e n t A r g s )H a n d l e sc m d I n g r e s a r . C l i c k c o n=N e wM y S q l C o n n e c t i o n ( ) c o n . C o n n e c t i o n S t r i n g=" s e r v e r = "&t x t S e r v i d o r . T e x t &" ; "_ &" u s e ri d = "&t x t U s u a r i o . T e x t &" ; "_ &" p a s s w o r d = "&t x t C o n t r a s e a . T e x t &" ; "_ &" d a t a b a s e = e n t r a d a _ s a l i d a " E n dS u b

AperturadelaConexin
LoltimoquenosquedaporhaceresindicarlealobjetodeconexinqueabralaconexinconelservidorMySQLmedianteelmtodo.Open()del objetodeconexin:
P r i v a t eS u bc m d I n g r e s a r _ C l i c k ( B y V a ls e n d e rA sS y s t e m . O b j e c t ,B y V a leA sS y s t e m . E v e n t A r g s )H a n d l e sc m d I n g r e s a r . C l i c k c o n=N e wM y S q l C o n n e c t i o n ( ) c o n . C o n n e c t i o n S t r i n g=" s e r v e r = "&t x t S e r v i d o r . T e x t &" ; "_ &" u s e ri d = "&t x t U s u a r i o . T e x t &" ; "_ &" p a s s w o r d = "&t x t C o n t r a s e a . T e x t &" ; "_ &" d a t a b a s e = e n t r a d a _ s a l i d a " c o n . O p e n ( )

E n dS u b

UtilizacindeunMessageBox
Cuandohayamosabiertolaconexinconxito,querremosqueelusuariosepasisunombredeusuarioycontraseaerancorrectos.Podemoslograr estoconelobjetoMessageBox.Ensuformamssimple,elobjetoMessageBox(cuadrodemensaje)lemostrarunmensajealusuarioconunbotn Aceptar.EstaesunasimplelneadecdigoparamostrarunMessageBox:
M e s s a g e B o x . S h o w ( " C o n e x i nA b i e r t aC o n x i t o ! " )

CierredelaConexin
Cuandohayamosterminadoconelobjetodeconexintendremosquecerrarlo.Alcerrarlaconexinliberamoslosrecursosnecesariosparamantener laconexinactiva.Esunabuenaprcticacerrarlasconexionesnibienhayasterminadodeutilizarlas.Unaconexinsecierraconelmtodo.Close().
c o n . C l o s e ( )

EliminacindelObjetoMySqlConnection
Cadavezquehayamosterminadodetrabajarporcompletoconunobjetoesunabuenaprcticaeliminarlo,reduciendoaselconsumoderecursosde nuestraaplicacin.Cuandoeliminamosunobjeto,losrecursosqueocupabaseliberanyelobjetodejadeexistir.Eliminamosunobjetollamandoasu mtodo.Dispose().
c o n . D i s p o s e ( )

CapturadeErrores
Actualmente,nuestrocdigoesapropiadoparaunasituacinideal.Sinopodemosconectarnosalservidorosiingresamosunnombredeusuarioo contraseaequivocadaelobjetodeconexindevolverunerror,tambinconocidocomoexcepcin.Paramanejarerrores,VB.NETtieneunasintaxis especialdeTRYCATCHFINALLY.PonemoselcdigoconloserrorespotencialesdespusdelapalabraclaveTRYperoantesdela palabraclaveCATCH.LApalabraCATCHseutilizaparaindicarquclasedeerrornospodemosencontrar(ennuestrocaso,elerrordevueltoser unobjetoConnector/NETMySqlException).TodoelcdigoubicadoacontinuacindelapalabraclaveFINALLYserejecutadohayaonounerror. Siocurreunaexcepcin,elcdigorestantedelaseccinTRYnoserejecutado. Esteeselcdigofinalquemanejalaconexin:
P r i v a t eS u bc m d I n g r e s a r _ C l i c k ( B y V a ls e n d e rA sS y s t e m . O b j e c t ,B y V a leA sS y s t e m . E v e n t A r g s )H a n d l e sc m d I n g r e s a r . C l i c k c o n=N e wM y S q l C o n n e c t i o n ( ) c o n . C o n n e c t i o n S t r i n g=" s e r v e r = "&t x t S e r v i d o r . T e x t &" ; "_ &" u s e ri d = "&t x t U s u a r i o . T e x t &" ; "_ &" p a s s w o r d = "&t x t C o n t r a s e a . T e x t &" ; "_ &" d a t a b a s e = e n t r a d a _ s a l i d a " T r y c o n . O p e n ( ) M e s s a g e B o x . S h o w ( " C o n e x i nA b i e r t aC o n x i t o " ) c o n . C l o s e ( ) C a t c hm i e r r o rA sM y S q l E x c e p t i o n M e s s a g e B o x . S h o w ( " E r r o rd eC o n e x i nal aB a s ed eD a t o s :"&m i e r r o r . M e s s a g e ) F i n a l l y c o n . D i s p o s e ( ) E n dT r y E n dS u b

Estocombinatodoelcdigodeconexinypermitemanejarerroressinquelaaplicacinsecierreporoperacionesinvlidas.Instanciamoselobjetode conexinyleasignamosunstringdeconexin.DentrodeunbloqueTRYCATCHdemanejodeerrores,intentamosabrirlaconexinalservidory, siserealizaconxito,lemostramosunMessageBoxalusuarioindicandoelxitoyluegocerramoslaconexin. Siocurreunerroralconectarse,seejecutarelcdigodelbloqueCATCH.EnestecasolemostraremosalusuariounMessageBoxconlapropiedad .MessagedelobjetoMySQLException,quecontieneelmensajeasociadoalerrorcomprensibleparaloshumanos. EnelbloqueFINALLYeliminamoselobjetodeconexin.HacemosestoenelbloqueFINALLYporquehayaonotenidoxitolaconexin, querremoseliminarelobjeto.

PruebadelProyecto
Cuandoelcdigoestensulugar,guardaelproyectoypresionalateclaF5parainiciarlaaplicacinenmododepuracin.Pruebalaverdadera direccindelservidor,nombredeusuarioycontrasea,luegopruebausarunadireccindeservidorequivocadayluegopruebaunacontrasea

errnea.Notarsdistintosmensajesdeerroralutilizarunadireccinerrneaquealutilizarunacontraseaerrnea.Elmensajedeerroralutilizarun nombredeusuarioerrneoeselmismoquealutilizarunacontraseaerrnea,yaqueunmensajedeerrorseparadoconstituiraunaamenazaala seguridadyaqueunpotencialintrusopodrasabersiunnombredeusuarioescorrectoono.

Mejoras
Hayalgunasmejorasquedebernhacerseanuestroformulariodeacceso.Enprimerlugar,nuestrousuarionodeberatenerqueingresarladireccin delservidorcadavezquedeseenusarlaaplicacinyenunfuturoveremoscmoguardarladireccindelservidorenunarchivodeconfiguracin. Lasegundamejoraesconrespectoalmanejodeerrores.MostrarelmensajedeerrordeMySQLestbiendurantelaetapadedesarrolloperola versinfinaldenuestraaplicacinnodeberamostrarloserroresdelabasededatosdirectamente.Podemosutilizarlapropiedad.Numberdelobjeto MySqlExceptionparadeterminarquclasedeerrorestamostratandoyluegocrearunmensajedeerrorpersonalizado. Parafinalizar,obviamentenecesitaramoslograrqueunaconexinexitosanoslleveaunnuevoformularioennuestraaplicacin.Sinuestraaplicacin consistieraenformulariodeaccesoynadams,seguramentenosermuypopular.

Conclusin
EnestetutorialhemosexplicadolainstalacindeMySQLAdministratorylacreacindeunanuevacuentadeusuarioMySQL.Luegoinstalamos VB.NETyMySQLConnector/NET.FinalmenteutilizamosVB.NETparacrearunformulariodeaccesoparanuestraaplicacinquenosconectaal servidorMySQL(suponiendoqueingresamosladireccindeservidoryelnombredeusuarioycontraseacorrecta).Elformularioseconfigurpara manejarerroresdurantelaconexinmedianteelusodelasintaxisTRYCATCHFINALLY. Elarchivodelproyectocreadoenestetutorialestdisponibleenelhipervnculodeabajo.LosarchivosdelproyectosonparaVisualBasic2005 ExpressEdition. Enelprximotutorialcrearemosnuestroprimereventoyharemosunformularioparamostrarelestadoactualdenuestrosusuarios. CdigodeEjemplo#1 DescargarCdigodeEjemploAdjunto EjemplodecmoconectarseaunaBasedeDatosMySQLutilizandoVB.NETyConnector/NET.
P r i v a t eS u bc m d I n g r e s a r _ C l i c k ( B y V a ls e n d e rA sS y s t e m . O b j e c t ,B y V a leA sS y s t e m . E v e n t A r g s )H a n d l e sc m d I n g r e s a r . C l i c k c o n=N e wM y S q l C o n n e c t i o n ( ) c o n . C o n n e c t i o n S t r i n g=" s e r v e r = "&t x t S e r v i d o r . T e x t &" ; "_ &" u s e ri d = "&t x t U s u a r i o . T e x t &" ; "_ &" p a s s w o r d = "&t x t C o n t r a s e a . T e x t &" ; "_ &" d a t a b a s e = e n t r a d a _ s a l i d a " T r y c o n . O p e n ( ) M e s s a g e B o x . S h o w ( " C o n e x i nA b i e r t aC o n x i t o " ) c o n . C l o s e ( ) C a t c hm i e r r o rA sM y S q l E x c e p t i o n M e s s a g e B o x . S h o w ( " E r r o rd eC o n e x i nal aB a s ed eD a t o s :"&m i e r r o r . M e s s a g e ) F i n a l l y c o n . D i s p o s e ( ) E n dT r y E n dS u b