28
jun
10

Protegido: Nuestra historia…..

This content is password protected. To view it please enter your password below:

25
jun
10

Entorno desconectado en VB.NET 2005

Un entorno desconectado es aquel en el que un usuario o una aplicación no están conectados constantemente a una fuente de datos. Las aplicaciones de Internet utilizan frecuentemente arquitecturas desconectadas. Se abre la conexión, se recuperan los datos y la conexión se cierra. El usuario trabaja con los datos en el navegador y la conexión vuelve a abrirse para actualizar u otras
peticiones.

Los usuarios móviles que trabajan con equipos portátiles son también los usuarios principales de los entornos desconectados. Los usuarios pueden llevarse un subconjunto de datos en un equipo desconectado y posteriormente fusionar los cambios con el almacén de datos central.

Un entorno desconectado proporciona las siguientes ventajas:

  • Las conexiones se utilizan durante el menor tiempo posible, permitiendo que menos conexiones den servicio a más usuarios.
  • Un entorno desconectado mejora la escalabilidad y el rendimiento de las aplicaciones, maximizando la disponibilidad de conexiones.

Un entorno desconectado tiene los siguientes inconvenientes:

  • Los datos no siempre están actualizados.
  • Pueden producirse conflictos de cambios que deben solucionarse

Explicaré con un mantenimiento sencillo cómo podría aplicarse el entorno desconectado en una aplicación .NET, practicamente se usarán repositorios en memoria del lado del cliente (llamados DATASET) para poder almacenar los datos.

El formulario contiene…

Objeto Nombre Valor Habilitado
Form form1 Mantenimiento de Usuarios Si
Button btnNuevo &Nuevo Si
Button btnEditar E&ditar Si
Button btnEliminar &Eliminar Si
Button btnSalir &Salir Si
Label lblUsuario Usuario: Si
Label lblPasswd Contraseña: Si
Label lblNombres Nombres: Si
Label lblApellidos Apellidos: Si
TextBox txtUsuario Si
TextBox txtPasswd Si
TextBox txtNombres Si
TextBox txtApellidos Si
DataGridView dgvUsuarios Si

El formulario quedaría así…

Y la base de datos en SQL Server 2000, quedaría así…

Y finalmente el código…

Las primeras líneas son para importar las librerías requeridas.

Dentro de la clase del formulario (las primeras líneas), esta un bloque de código el cual explicaré… La primera, es para crear la variable de conexión (está más explicado en el post de Entorno conectado). La asegunda línea, se declara la variable dsUsuarios como objeto DataSet, la cual nos servirá para describir una simple base de datos relacional en memoria. La tercera línea es para declarar la variable daUsuarios como objeto SqlDataAdapter, el cual es como un “Puente” utilizado para transferir data entre una fuente de datos y un objeto DataSet. En la cuarta línea se declara una variable cbUsuarios como objeto SqlCommandBuilder, el cual es el responsable de generar las sentencias SQL necesarias para hacer las acciones de inserción, actualización y eliminación de registros. La quinta línea, se declara la variable sqlusuarios como string, el cuál posee la sentencia SQL respectiva para llenar el DATASET con la información que manejará éste formulario. Finalmente, la lína sexta, es una variable posicion del tipo entero que nos servirá más adelante para obtener la posición del índice dentro del DATASET.

El siguiente bloque de código va dentro de la clase Load del formulario. Primero, se limpia el dataset (por si tiene algo…), luego se pone la instrucción Try para poder controlar los errores. En la lína 3, se le asigna a la variable daUsuarios la instancia de la clase SqlDataAdapter, de tal forma que le asignamos como parámetros la sentencia SQL y la conexión. En la línea 4, llenamos el DATASET por medio de daUsuarios. En la lína 5, se instancía el objeto SqlCommandBuilder para que ya podamos realizar INSERT, UPDATE y DELETE automáticos desde el DATASET.

Continuando con el mism bloque de código… La siguiente línea sirve para especificarle al DataGrid View cuál será su orgíen de datos, y la otra línea es (Donde se hace referencia al Datamember) para decirle con qué tabla trabajará dentro del DATASET, dado que el DATASET es un repositorio de una o varias tablas. De ahí, las siguientes 4 líneas sirven para poder crear el vínculo entre los TextBox y el DataViewGrid, de tal manera que estan vínculados con el indice del DATASET. Se termina el Try catch, de tal forma que nos muestre un mensaje con cualquier error que pueda ocurrir y se finaliza éste bloque de código.

Ya terminamos con el bloque de código del LOAD, ahora irémos al bloque del botón NUEVO (btnNuevo). Aqui iré un poco más rápido ya que hay muchas cosas que son cuestión de estética. Por ejemplo, se hace un IF para poder determinar si el botón esta en modalidad “Nuevo” o en modalidad “Guardar”. Si esta en Nuevo, éste hará varias cosas de estética pero la línea importante de éste bloque es: BindingContext(dsUsuarios, “Usuarios”).AddNew() -> Ésta línea lo que hace es iniciar un registro nuevo en el DATASET y todo el formulario se centrará en éste registro.

Si en caso, el botón tiene como propiedad Text “&Guardar”, lo que hará es ejecutar el bloque de código que esta después del Else y explicaré una a una cada línea de éste bloque:

BindigContext(dsUsuarios, “Usuarios”.EndCurrentEdit() -> Se detiene la edición del registro, ya sea si se esta insertando uno nuevo o se esta editando alguno.
daUsuarios.Update(dsUsuarios, “Usuarios”) -> Se actualiza ésta información en el DATASET.
dsUsuarios.Tables(“Usuarios”).AcceptChanges() -> Se aceptan los cambios y se actualiza dicho (o dichos) registro/s en la base de datos. Del DATASET hacia la Base de datos.

De ahí para haya solo es cuestión de estética y se finaliza con el Try catch, siempre de tal forma que nos envíe un mensaje por cualquier error.

El siguiente bloque de código que estudiarémos es el del botón Editar (btnEditar). Como el botón Nuevo, éste tiene dos modalidades… Si su propiedad Text es “E&ditar” o “&Cancelar”. Si se llama “E&ditar”, se ejecutan unas instrucciones de solo estética, pero si se llama “&Cancelar”, se ejecuta un bloque de código en donde la única línea interesante es:

BindingContext(dsUsuarios, “Usuarios).CancelCurrentEdit() -> Con ésto, se cancela la edición o inserción del registro en el DATASET.

Lo demás del código solo es estética y la terminación del Try catch.

El siguiente bloque de código que se estudiará es el que esta en el botón Eliminar (btnEliminar). Aqui, se inicia el Try y luego, en la segunda línea, se puede ver que se le asigna a la variable posicion (integer) la posición actual en donde se encuentra el DATASET (o sea, el número de registro en donde esta apuntando). Las siguientes líneas la veremos una a una.

dsUsuarios.Tables(“Usuarios”).Rows(posicion).Delete() -> Cón ésta instrucción, se marca como que dicho registro (registro actual, encontrado por la variable posición) será eliminado.
daUsuarios.Update(“Usuarios”, “Usuarios”) -> Se elimina el registro del DATASET.
dsUsuarios.Tables(“Usuarios”).AcceptChanges() -> Se aceptan los cambios de tal forma que se actualicen en la base de datos. O sea, el registro eliminado en el DATASET será eliminado también en la base de datos.

El resto del código practicamente no es interesante, pero ya ejecutado el programa, dará algo así como resultado:

Si desea descargar éste ejemplo, dar clic Aqui…

25
jun
10

Entorno conectado en VB.NET 2005

Un entorno conectado es aquel en el que un usuario o una aplicación están conectados continuamente a una fuente de datos. Durante muchos años de la historia de la informática, el único entorno disponible era el entorno conectado

Ventajas:
  • El entorno es más fácil de mantener.
  • La concurrencia se controla más fácilmente.
  • Es más probable que los datos sean actuales que en otros escenarios.
Inconvenientes:
  • Debe tener una conexión de red constante
  • Escalabilidad limitada

He aquí algunos ejemplos en los que debe utilizarse una conexión continua:

  • Una fábrica que requiere una conexión en tiempo real para controlar la salida de producción y el almacén.
  • Un agente de bolsa que requiere una conexión constante a los valores del mercado

Ahora, de una forma sencilla y mediante un programita en VB.NET explicaré éste entorno conectado.

El formulario contine…

Objeto Nombre Valor Habilitado
Form form1 Conexión Si
Label lblUsuario Usuario Si
Label lblPasswd Contraseña Si
TextBox txtUsuario Si
TextBox txtPasswd Si
Button btnEntrar Entrar Si

Quedaría así…

Y la base de datos se llama Pruebas, con una tabla llamada tst_usuarios, la cual tiene los siguientes campos con sus respectivos valores:

Ahora que ya tenemos la base de datos y el formulario, vamos por el código…

Primero, importamos las librerías que nos permitirá conectarnos a la base de datos gracias al componente ADO.NET.

Imports system.Data.SqlClient

Luego, en la siguiente línea de código (dentro de la clase publica del Form1)  se declara la variable conexion como objeto SqlConnection, y se le asigna el String de conexión. El String de conexión consta de 4 parámetros básicos: Data Source (que es para indicarle el servidor de base de datos al que nos conectaremos, Initial Catalog (se le asigna la base de datos con la que se trabajará), User Id (Usuario de conexión) y Password (Contraseña del usuario con el que se conectará).

En la segunda línea, se declara una variable leer como un SqlDataReader, la cual será usada para procesar eficientemente una lista grande resultados, un registro a la vez.

Dim conexion As New SqlConnection("Data Source=.; Initial Catalog=pruebas; User Id=usuario; Password=123")
Dim leer As SqlDataReader

Dentro de la clase del botón btnEntrar, la primera línea se declara la variable query que contiene la sentencia SQL que verifica si lo que el usuario ingresa en el formulario (usuario y contraseña) se encuentra registrado en la base de datos.

Dim query As String = "select * from tst_usuarios where idusuario = '" & Me.txtUsuario.Text & "' and passwd = '" & Me.txtPasswd.Text & "'"

Se declara una variable comando como SqlCommand, que nos ayudará a realizar la acción en la fuente de datos, ya sea para lectura, actualización, borrado etc. En nuestro caso, lo usaremos para consulta. Se le pasa como parámetros (o atributos), la variable query (con la sentencia SQL) y la variable de conexión.

Dim comando As New SqlCommand(query, conexion)

Por si exista algún tipo de error, se manejarán dichos errores con Try Catch

Try

Se abre la conexión…

conexion.Open()

Se le asigna a la variable leer (tipo SqlDataReader) el resultado de la sentencia SQL por medio del ExecuteReader.

leer = comando.ExecuteReader

Se verifica si leer posee algún registro (que debería ser el registro del usuario que corresponde con el usuario y contraseña que ingresó el usuario final). Si tiene, se envía un mensaje de bienvenida. Si no tiene, es porque el usuario final ingreso mal el usuario o la contraseña.

If leer.Read Then
MessageBox.Show("Bienvenido al sistema", "Inicio")
Else
MessageBox.Show("Nombre de usuario o contraseña incorrectas", "Error")
Me.txtUsuario.Select()
End If

Se cierra el DataReader

leer.Close()

Se cierra el Catch, dejando un mensaje con el error específico que ocurrió si en caso sucede.

Catch ex As Exception
MsgBox(ex.Message)
Entd Try

Se cierra la conexión.

conexion.close()

El resultado al ejecutar el código es el siguiente:

Puedes descargar éste ejemplo aqui…

23
jun
10

Hacer respaldos de base de datos en MS SQL 2000

En Microsoft SQL Server 2000 es muy fácil hacer respaldos de las bases de datos. Ahora se describirá una forma de hacerlo pero quizás la más sencilla es por medio de un asistente que esta en Tools -> Wizards -> Management- Backup Wizard del SQL Server Enterprise Manager (seleccionado la base de datos específica obviamente). Para las personas que son un poco novatas les recomendaría hacer dicho proceso por medio del Wizard, dado que hay varias configuraciones que les permite de forma fácil programar tareas de respaldo, pero para éste post únicamente se verá como crear un respaldo de una base de datos.

Primero, se deberá de abrir el Enterprise Manager que esta en Inicio -> Todos los programas -> Microsoft SQL Server -> Enterprise Manager, y aqui deberá de seleccionar la base de datos a la cual le desea respaldar. Una vez seleccionada, se da clic derecho, luego en Todas las tareas y finalmente en Backup Database…

Enterprise Manager

Aparecerá una ventana en donde deberemos de especificar cierta información. El campo Database corresponde a la base de datos que se quiere respaldar, el campo Name es para asignar un nombre a ésta tarea de respaldo. En la parte de Backup, se determina el tipo de respaldo que se desea hacer; para éste ejemplo,  se hará el respaldo Completo, pero hay otros tipos de respaldos como lo son el diferencia y el del log de transacciones. En la parte llamada Overwrite, se debe elegir si se desea que ésta tarea de respaldo será agregada al destino (ya sea con otro nombre) o si sobre escribirá el destino. La opción Schedule sirve para poder programar ésta tarea de tal forma que se pueda ejecutar con cierta periodicidad, pero en nuestro caso no utilizarémos ésta opción. En la siguiente imagen se muestra la ventana que se esta describiendo.

Backup

En la parte de Destination, aqui esta el destino a donde colocarémos el respaldo. Damos clic en Add… para poder asignarle el destino.

DestinoFigura X

En ésta parte (la figura X), hay dos alternativas de destino: La primera llamada File name es la que permite crear un destino de respaldo específico de forma directa, dado que le establecemos la dirección y el nombre de archivo específico. La segunda se llama Backup device, la cual es la más usada la cual consiste en que previamente se debe crear un dispositivo de respaldo en el Enterprise Manager, que podría ser una cinta de tape backup física o simplemente un archivo en una ubicación del disco duro. Vamos a elegir, en ésta ocasión, la opción File name asignándole la ubicación y el nombre de archivo específico.

Se da clic en OK a dicha ventana y a la de Backup le damos clic en Aceptar también para ver el proceso de respaldo. Al final, aparecerá una ventana que muestra que se ha terminado el respaldo exitosamente.

Proceso

Finalización

Con ésto ya se realizó correctamente el respaldo. Ahora explicaré un poco sobre la opción Backup Device en la Figura X. Para crear dicho dispositivo de respaldo, en el Enterprise Manager se busca en el arbol de la izquierda la carpeta Backup, que se encuentra dentro de Management y se da clic derecha en ésta carpeta y luego en New Backup Device. Ver la imagen para mayor referencia.

Backup Device

En la ventana que aparece, se debe de asignar un nombre para el dispositivo de respaldo (en el campo Name) y en la parte de File name, se debe buscar la ubicación (por medio del botón ) así como asignar el nombre del archivo en donde se crearán los respaldos. La opción Tape drive name solo aparece cuando hay un dispositivo de cintas de tape backup. Una vez hecho ésto, se da clic en Aceptar y ya con ésto queda creado el dispositivo de respaldo.

Crear dispositivo

Una vez creada, ya se puede ver en la carpeta Backup y se puede usar en la ventana Figura x.

Dispositivos de Backup

23
jun
10

Reducir tamaño de Log de Transacciones en MS SQL 2000

Luego de hacer un respaldo completo a la base de datos en MS SQL 2000, en dicho respaldo se lleva tanto los datos como los log de transacciones, y si éste último crece demasiado, el respaldo completo se vuelve lento y también el rendimiento del mismo servidor puede volverse un poco lento, por lo que es necesario que de vez en cuando se realice una reducción de éste log de transacciones, el cual va creciendo de forma dinámica dejando, aparte del tamaño real de los logs, un porcentaje de espacio en disco reservado para dicha tarea.

Primero hay que identificar si realmente es necesario realizar éste proceso, por lo que abrimos la herramienta que esta en Inicio -> Todos los programas -> Microsoft SQL Server -> Enterprise Manager. En la ventana principal, expandimos El árbol de la columna izquierda hasta llegar a la carpeta llamada Databases de nuestro servidor. Aqui, se da clic derecho en la base de datos a la cual queremos ver cómo se encuentra el tamaño del log de transacciones, luego en Ver y finalmente damos clic en Taskpad.

Ver

Ahora si, en la parte de la parte derecha de la ventana, veremos el apartado llamado Space allocated, el cual nos muestra el tamaño real tanto de la data como del log de transacciones.

Taskpad

Se puede ver entonces que el espacio del log de transacciones, para éste ejemplo, es bastante bajo relativamente, pero hay ocasiones que si uno no le presta atención a éste detalle suele duplicar o triplicar el tamaño de la data dado que el log de transacciones almacena todas las instrucciones que han sido ejecutadas. Para poder reducir éste espacio, primero se recomienda que se realice un respaldo completo de la base de datos y luego abrir el SQL Query Analyzer (Se puede abrir dando clic en Tools -> SQL Query Analyzer). Se debe de asegurar que se encuentre en la base de datos master, (de preferencia, ejecutar el comando use master. Un vez en la ventana del SQL Query Analyzer, se debe de digitar el siguiente script (La imagen siguiente…)

Comando

Donde MiBase deberá de ser reemplazada por el nombre de la base de datos a la cual se le quiere reducir el espacio del log de transacciones. Se ejecuta dicho comando (con F5 digamos) y se mostrará la siguiente información:

Resultados

Entonces, si nos vamos al Taskpad del SQL Server Enterprise Manager, verémos que la información cambia respecto al tamaño del log de transacciones.

Taskpad

22
jun
10

Mover base de datos de Exchange 2003 a otra ubicación

En diversos escenarios es necesario mover las bases de Exchange de disco, carpeta, partición, etc. Por cuestiones de capacidades, u otras situaciones, y en éste post se cubrirá todos los aspectos técnicos para realizar esta operación satisfactoriamente.

Como primer paso abriremos la consola de Administración de Exchange; Éste se encuentra en Inicio -> Todos los programas -> Microsoft Exchange -> System Manager. Expandimos “Servers”, ubicamos nuestro servidor, lo expandimos también, expandimos nuestro “Storage Group” y allí encontraremos los almacenes de buzones. Una vez que tengamos ubicado el almacén de buzón que queremos mover, hacemos clic con el botón secundario sobre él, y luego propiedades:

Aparecerá la siguiente ventana, donde se muestran las rutas de las bases actuales:

Para cambiar la ruta y mover automáticamente las bases, debemos hacer clic en browse y seleccionar la carpeta de destino:

Cuando tengamos casi todo listo, en la pantalla aparecerán las nuevas rutas a modo de confirmación.

Cuando presionemos “OK” saldrá una advertencia. El proceso de mover las bases de datos requiere que los buzones sean desmontados, por lo tanto no accesibles a los usuarios. Si estamos muy seguros de lo que estamos haciendo, y que lo estamos haciendo cuando nadie está trabajando, le decimos que SI.

Si todo a funcionado bien, se verá ésta ventana:

Para el almacén de carpetas públicas es exactamente el mismo procedimiento.

Nota: Para brindar adecuadamente los permisos NTFS a las bases de datos se debe configurar, en la carpeta de destino, los siguientes permisos:

Administrators: Full control
Authenticated Users: Read and Execute, List Folder Contents, Read
Creator Owner: Nada
Server Operators: Modify, Read and Execute, List Folder Contents, Read, Write
System: Full Controll

El procedimiento para mover los registros de transacciones es similar. Los logs son compartidos por todos los mailbox stores de un storage group, por lo tanto esta configuración debe ser realizada a nivel de SG:

Veremos una ventana similar a las anteriores, seleccionamos Browse y luego le declaramos la nueva ruta:

Nuevamente, si estamos seguros de lo que estamos haciendo y nadie está trabajando, podemos darle OK y saldrá la advertencia porque se desmontarán los buzones:

Y el breve mensaje confirmación:

Con eso ya hemos movido las bases de mensajes y registros de transacciones de disco.

22
jun
10

Recuperar buzón de correo en Exchange 2003

Cuando se tiene un respaldo de la base de datos de Exchange (es otro tema…), es posible poder restaurar un buzón de correo específico después de haber eliminado dicho buzón por alguna equivocación o por simple solicitud. Exchange 2003 tiene la facilidad que ya no es necesario hacer tantos artilugios para realizar dicha tarea (tener otro equipo con mismo sistema operativo, instalar exchange, etc.), sino que ya cuenta con un Grupo de almacenamiento de recuperación, el cual trataré de poder explicar la forma de utilizarlo para el fin de éste post.

Para comenzar, se deberán configurar los permisos adecuados en el servidor Exchange y además se configurará el archivo exmerge.ini para no tener inconvenientes a la hora de extrar/importar buzones a archivos de carpetas personales (.pst) y viceversa.

Se tendrá que descargar el programa Exmerge. En el archivo comprimido veremos varios archivos:

  • Exmerge.exe (ejecutable de la aplicación)
  • Exmerge.ini (archivo de configuración)
  • Eula.txt (End user license Agreement)
  • Mailbox Merge Wizard (ExMerge).doc (documentación)
Exmerge.exe y Exmerge.ini deberán ser copiados al subdirectorio Bin del
directorio de instalación de Exchange (por defecto %programfiles%\Exchsrvr).
Si Exchange está en español, deberemos abrir el exmerge.ini y localizaremos
la siguiente línea:

Quitar el “;” del inico del renglón. Luego ubicaremos la siguiente línea y harémos lo mismo:

El siguiente paso será configurar los permisos correctos para no tener conflictos. Por cuestiones de esta demo utilizaremos el usuario Administrador, pero tranquilamente podríamos usar otra cuenta siempre y cuando hayamos configurado correctamente las delegaciones de control. Expandimos servidores, y sobre el servidor entramos a las propiedades:

Luego, solapa de seguridad:

Donde ingresaremos a las opciones avanzadas para quitar la herencia. Quitamos el cheque de “Permitir que los permisos heredables del primario…” y se mostrarán tres advertencias que debemos aceptar:

Ahora lo que tenemos que hacer es quitar los cheques a las entradas “Denegar” que tenga el usuario administrador y todos los grupos donde éste permanezca (recordemos que el denegar pisa cualquier aceptar que tengamos):

Con esto alcanza y sobra. Ahora abriremos la aplicación principal (exmerge.exe) desde:

Y la extracción será exitosa, al menos a lo que permisos respecta.

RESTAURACIÓN DE BUZÓN

Para comenzar el procedimiento abriremos la consola de Administración

de Exchange, expandimos Servidores y hacemos clic con el botón Secundario sobre el servidor Exchange sobre el cual queremos hacer la restauración, luego seleccionamos “Nuevo –> Grupo de almacenamiento de recuperación…”.


Seleccionamos la ruta donde ubicaremos los archivos de transacciones y de acceso del sistema, y hacemos clic en aceptar.


Veremos que tenemos un nuevo grupo de Almacenamiento. Ahora lo que tenemos que hacer es decirle qué base de datos de mensajes vamos a restaurar. Para eso haremos clic con el botón secundario del mouse sobre “Grupo de almacenamiento de recuperación –> Agregar base de datos para recuperar…


Esto disparará una búsqueda que mostrará las bases disponibles para la restauración, donde debemos seleccionar una:


Aparecerán las propiedades, y hacemos clic en aceptar:

Ya tenemos todo configurado del lado del Exchange para hacer el restore. Ahora iniciamos la herramienta de backup (ntbackup.exe), seleccionamos la copia de seguridad a restaurar y, dentro de los contenidos, seleccionamos SOLAMENTE el almacén de buzón:

Como siguiente paso, indicaremos una ruta temporaria de extracción y Chequearemos la opción “Último conjunto de restauración…” si correspondiese.

Una vez finalizada la restauración, aparecerá el siguiente mensaje:

Como siguiente paso, montaremos el almacén de recuperación para poder accederlo:

Aparecerá la siguiente advertencia que indicaremos “si”:

Bien, hasta este punto estamos en orden. La única manera de acceder a este almacén de recuperación es con Exmerge. Para ello deberíamos haber configurado todo como se explica anteriormente. La única diferencia que encontraremos es que al iniciar Exmerge tendremos una base de datos más de donde extraer la información:

Para finalizar se realizan los pasos sencillos que Exmerge pide y finalmente se puede restaurar el buzón o múltiples buzones al Servidor Exchange.




Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.