Archive for the 'Programación' Category

28
Sep
09

ADO.NET.- Conectar Base de Datos SQL con VB.NET

Bueno, esta vez hablaremos sobre ADO.NET, la evolución de la arquitectura de acceso a datos de Micro$oft…

ADO = ACtiveX Data Objects, ADO.NET provee a los programadores .NET de un acceso a las fuentes de datos relacionales, XML y aplicaciones de datos, es una gran herramienta que puede trabajar con diversos proveedores de datos, desde Sql Server, hasta Oracle y MySql…

Esta vez voy a mostrarles como crear procedimientos con los objetos básicos de ADO.NET para conectarse y trabajar con una base de datos hecha en Sql Server…

Primero pasarémos a revisar los principales objetos de ADO.NET:

Objeto DataReader: proporciona un acceso rápido y unidireccional (solo hacia adelante) a los datos, es de solo lectura.

Objeto DataSet: proporciona una representación relacional de los datos en memoria, es decir, es capaz de crear tablas y relaciones en memoria para trabajar en ellas.

Objeto DataAdapter: sirve como un puente entre el DataSet y el origen de los datos.

Objeto Command: proporciona lo que Micro$oft llama Funcionalidad Explícita, que consiste en los métodos ExecuteNonQuery para las operaciones que no devuelven un resultado a la consulta, (Insert, Update, Delete), y ExecuteScalar para funciones que devuelven un único valor en lugar de un conjunto de filas.

Ahora, una forma de optimizar nuestro trabajo es identificar el tipo de cosulta que haremos, a modo de ejemplo tomaremos tres casos:

  1. Consulta Lineal con un flujo de datos hacia adelante y de solo lectura: Puede utilizarse este modo para el tipo de consultas simples que no requieren de mucha interacción del usuario o de actualizarse o regresar a un registro anterior, esto lo hacemos con el objeto DataReader, que fue diseñado para mantener una conexión permanente con el origen de datos mientras este activo, su función, básicamente, es leer los registros de la consulta de a uno en uno y en dirección hacia adelante (Forward-Only).
  2. Consulta de tipo Desconectado: Puede proveer una representación totalmente desconectada de los datos, para que el usuario pueda manipularlos sin verse restringido por problemas de recursos del servidor o disponibilidad de la fuente de datos, podemos utilizar el objeto DataSet, dentro del cual podemos contener tablas con los resultados de nuestras consultas no importando el origen de estos, (base de datos, archivos xml, o datos que genera la aplicación), esto permite una flexibilidad mayor cuando se trabaja con datos relacionados y permite exportarlos como archivos Xml.
  3. Recuperar y actualizar desde una fuente de datos: Bueno, esto es medio sencillo si se ve así: el DataAdapter se conecta con el origen de datos y permite llenar el DataSet con los resultados, al manipular, modificar o/y actualizar los datos en el DataSet, también permite actualizarlos en el origen de datos.

Ahora, después de toda esta (necesaria) chachara, hemos de pasar a los ejemplos prácticos de utilización de los objetos de ADO.NET para establecer conexión y trabajar con un origen de Datos, (Micro$oft Sql Server)

Veremos primero como importar el espacio de nombre necesario para trabajar con los objetos para el servidor sql, luego, declarar los objetos y conectarse a la base de datos…

Imports System.Data.SqlClient

Luego necesitamos declarar una variable que nos diga dónde está el servidor y como se llama la base…

Public Conexion As String = “Server =Server_1;packet size=4096;integrated security=SSPI;data source=Server_1;persist security info=False;initial catalog=Estudiantes”

Esta es una de las cadenas más sencillas donde se establece el nombre del servidor y la base de datos, aunque si necesitamos declarar Usuario y Password utilicemos esta:

Public Conexion As String = “Server =Server_1;packet size=4096;User Id=Axl;Password=123;data source=Server_1;initial catalog=Estudiantes”

Tengo que recordarles, que en SQL, si utilizamos un usuario y password para entrar a la base, tenemos que darle permisos a ese usuario en todas las propiedades de las tablas que queramos que tenga acceso, en especial los Stored Procedures, que hay que marcarlos uno por uno 😦

luego declaramos los objetos necesarios para empezar a trabajar…

Dim Cmd As New SqlCommand
Dim Cnn As New SqlConnection
Dim Sql As String
Dim Dr As DataRow
Dim Da As New SqlDataAdapter

Estos objetos los utilizaremos en cuatro procedimientos que crearemos a continuación, Consulta de Busqueda, Inserción, Actualización y Eliminación…

Busqueda:

Dim ds As New Data.DataSet
Sql = “Select * from Materias”
Cnn = New SqlConnection(Conexion)
Cnn.Open()
Da = New SqlDataAdapter(Sql, Cnn)
Da.Fill(ds)
Cnn.Close()

Explicación (línea por línea):

Declara un Objeto tipo Dataset para depositar los datos de la consulta.

Asigna la cadena de la consulta a la variable “Sql” (tipo string)

Le da al objeto SqlCommand la dirección de la base y lo instancia para poder utilizarlo

Abre la conexión con la propiedad .Open() del SqlCommand

Le da al SqlDataAdapter la cadena de consulta y el objeto de conexión

El SqlDataAdapter tiene la especial propiedad .Fill que vuelca todo lo que tiene en el objeto entre los paréntesis, (el dataset), y ojo que solo lo hace en un dataset.

Cuando has volcado el contenido de la consulta en el dataset simplemente cerras la conexión.

Ojo y doble ojo en esto, se debe cerrar cada conexión que se abra, no importa que tipo de consulta se haga, las conexiones abiertas se acumulan y pueden volar tu servidor y simplemente se quedará pegado.

Actualización:

Sql = “Update ” & tabla & ” Set ” & camposyvalores & ” Where ” & condicion
Cnn = New SqlConnection(Conexion)
Cnn.Open()
Cmd = New SqlCommand(Sql, Cnn)
Cmd.ExecuteNonQuery()
Cnn.Close()

Explicación (Línea por línea):

Asigna la cadena de la consulta a la variable “Sql” (tipo string)

Le da al objeto SqlCommand la dirección de la base y lo instancia para poder utilizarlo

Abre la conexión con la propiedad .Open() del SqlCommand

Le damos al SqlCommand el objeto de conexión y la cadena con la instrucción Sql

Aquí utilizamos la propiedad .ExecuteNonQuery del SqlCommand que permite ejecutar una instrucción sin arrojar ningún resultado.

Como ya lo he dicho antes, hay que cerrar la conexión.

Eliminación:

Sql = “Delete From ” & tabla & ” Where ” & condicion
Cnn = New SqlConnection(Conexion)
Cnn.Open()
Cmd = New SqlCommand(Sql, Cnn)
Cmd.ExecuteNonQuery()
Cnn.Close()

Explicación (Línea por línea):

Asigna la cadena de la consulta a la variable “Sql” (tipo string)

Le da al objeto SqlCommand la dirección de la base y lo instancia para poder utilizarlo

Abre la conexión con la propiedad .Open() del SqlCommand

Le damos al SqlCommand el objeto de conexión y la cadena con la instrucción Sql

Aquí utilizamos la propiedad .ExecuteNonQuery del SqlCommand que permite ejecutar una instrucción sin arrojar ningún resultado.

Como ya lo he dicho antes, hay que cerrar la conexión.

Inserción:

Sql = “Insert Into ” & tabla & ” (” & campos & “) Values (” & valores & “)”
Cnn = New SqlConnection(Conexion)
Cnn.Open()
Cmd = New SqlCommand(Sql, Cnn)
Cmd.ExecuteNonQuery()
Cnn.Close()

Explicación (Línea por línea):

Asigna la cadena de la consulta a la variable “Sql” (tipo string)

Le da al objeto SqlCommand la dirección de la base y lo instancia para poder utilizarlo

Abre la conexión con la propiedad .Open() del SqlCommand

Le damos al SqlCommand el objeto de conexión y la cadena con la instrucción Sql

Aquí utilizamos la propiedad .ExecuteNonQuery del SqlCommand que permite ejecutar una instrucción sin arrojar ningún resultado.

Como ya lo he dicho antes, hay que cerrar la conexión.

Ok, si han sido buenos observadores habrán descubierto que en los últimos tres procedimientos solo cambia la instrucción Sql, por lo demás son iguales, ¿Porque?, porque a mi juicio, hay dos tipos de instrucciones, Las que te devuelven algo y las que no te devuelven nada. El Select te devuelve algo, lo que sea, un campo, una fila, una columna, una tabla, cualquier cosa, los demás (Insert, Update, Delete) no te devuelven nada por eso usamos el .ExecuteNonQuery del amigo SqlCommand y podemos utilizar el mismo código para los tres.

Como lo he dicho desde la primera entrada que hice en nuestro blog, utilizaré los métodos más simples para hacer las cosas, porque bueno, Occam dijo que la respuesta más simple y obvia es casi siempre la mas probable, (en nuestro caso, no es solo la única), pero no siempre la correcta. Hay muchas formas de hacer las cosas, pero trataremos de tomar las más fáciles y las más prácticas.

Saludos…

10
Sep
09

La Nomenclatura Hungara

Creo que a todos nos ha pasado, que al darle mantenimiento a nuesto código nos topamos con nombres que no identificamos de que tipo de objeto se trata o si es alguna variable entre todo lo que hemos hecho. Una buena práctica como programadores es mantener un estándar de calidad, sea personal o a nivel de trabajo, pero es importante ser ordenado en lo que se hace, sobre todo porque no sabemos si en algún momento a alguien le tocará darle mantenimiento a alguna de nuestras aplicaciones, y a nosotros no nos gustaría encontrar alguna aplicación que alguien más haya hecho y nos topemos con una “Tripa chuca” (Los Salvadoreños entenderán), por lo que hay que empezar por ordenarnos nosotros mismos.

La Nomenclatura Hungara es un tipo de estándar, que consiste en colocar prefijos a los nombres de los objetos, pero que coincidan con el tipo de objeto con el que trabajamos, por ejemplo, al trabajar con un botón al cual le hayamos colocado como nombre “Guardar”, podremos colocarle el prefijo “Btn”, que nos indicará que el objeto con el que trabajamos es un botón.

Guardar ——-> BtnGuardar

De esta forma nos evitamos confusiones al momento de escribir código, ya que por ejemplo, puede que también necesitemos una etiqueta Guardar

Guardar ——-> LblGuardar

No hay cosa mejor que abrir un código que has hecho tiempo atrás y entenderlo a la perfección, sin quebrarte la cabeza adivinando que cosa es lo que estas viendo, aqui les dejo unos cuantos prefijos que podemos aplicar a cualquier lenguaje y un vínculo a una lista mas extensa en el sitio de Micro$oft.

Form                          Frm

Label                          Lbl

Button                       Btn

TextBox                   Txt

Listbox                     Lst

Image                       Img

CheckBox               Chk

Mas prefijos en http://support.microsoft.com/kb/173738/es

10
Sep
09

Crear Formularios MDI

Weno, me gustaría comentar sobre los formularios MDI, ya que es un tema que cuando yo lo busque, me recorrí todo el google buscando y solo encontré documentos mediocres que trataban astralidades innecesarias, me han de disculpar los “Elite“, (mi amigo Skrdz), por lo básico de las entradas, pero me han llegado peticiones en otras páginas de que explique cosas básicas que, en realidad, la gente no comenta porque “asumen que los demás ya lo saben”….

MDI = Multiple Document Interface ó Interfaz de múltiples documentos, es básicamente, un contenedor, que te permite abrir dentro de él, multiples ventanas, muy útil para las aplicaciones que requieren utilizar muchos formularios y que no se pierda el control de estos.

La primer cosa que haremos es crear un proyecto de tipo Windows Application, en el proyecto recién creado nos dejará un formulario normal vacío.

Form Normal

Luego iremos a las propiedades del formulario y cambiaremos la propiedad “IsMdiContainer” de False a True

Propiedades IsMdiContainter

Luego de cambiar la propiedad, el cambio más significativo que veremos en el formulario será su color de fondo, que cambiará del clásico gris claro a uno más oscuro y con borde.

Form Mdi

Ahora tenemos un formulario MDI, el cual puede funcionar perfectamente para llamar desde él a otros formularios que se abrirán dentro de este, muy apropiado para aplicaciones grandes como por ejemplo sistemas contables, administrativos, y todo tipo de aplicaciones que puedan diseñarse y que requieran como un formulario raíz, que pueda controlar a todos los demás y controlar todo desde él, ahora, del Cuadro de Herramientas nos jalaremos un ToolStrip, que es una barra de herramientas en la que podemos colocar diversos objetos, nosotros colocaremos un botón…

Agrega Toolstrip

Ahora, para que todo esto tenga utilidad, agregaremos a nuestro proyecto un nuevo formulario que servirá como Hijo de nuestro MDI, y al evento Clic del botón que agregamos al ToolStrip, escribiremos este código…

codigo mdi

Las Líneas:

  • Dim FormHijo As New Form2 : Crea un objeto a partir del Form2 para que podamos utilizarlo, (esto no es estrictamente necesario, pero es para darle orden y no tener que usar nombres muy largos)
  • FormHijo.MdiParent = Me : Le define a FormHijo su formulario principal o padre, (Es como decirle, “Yo soy tu tata“).
  • FormHijo.Show() : despliega el FormHijo dentro del Mdi para poder ser utilizado.

Este sería nuestro Mdi en tiempo de ejecución:

Mdi en ejecución

Y al darle Clic al ToolStripButton1, esto es lo que obtendíamos:

Mdi con form abierto

Se puede jugar con las propiedades de los formularios hijos, como por ejemplo quitarles los botones de maximizar y minimizar, darles un tamaño específico, darles transparencia, etc, todo lo que se nos ocurra para que se vea estético, pero antes que ponerle las flores, debemos estar seguro que funcione bién y con el mínimo de errores, (porque siempre se le escapa algo a uno), o nuestro sistema será como los lindos senos falsos de las actrices porno, muy bonitos pero inútiles.

Saludos a todos y espero que les sirva esta información…

09
Sep
09

Crear una Librería de Clases (DLL)

Bueno, luego de una larga ausencia, vuelvo para colaborar con nuevos contenidos, he de comenzar con esto:

Una DLL es una librería de clases, es decir, una colección de procedimientos, funciones y/o propiedades almacenadas en un archivo .dll que pueden ser llamadas en cualquier parte de nuestras soluciones para no tener que repetir el código del procedimiento cada vez que lo necesitemos utilizar, buena forma de cumplir con en Encapsulamiento y la Reutilización de Código, dos de las principales características de la P.O.O. y plataforma .NET.

A continuación mostraré de la manera más sencilla, como crear una librería de clases y hacer que nuestro proyecto en Visual Basic .Net 2005 pueda trabajar con ella sin ningún problema…

El primer paso para esto es, por supuesto, tener un proyecto Windows Application con el que conectaremos nuestra DLL, en mi caso he de trabajar con el Sistema de Control Clínico que hice hace algún tiempo, pero bueno, dejemos de lado la chachara….

Esta es la vista del explorador de soluciones en el que se puede ver que únicamente existe el proyecto de windows application:

Explorador de soluciones 1

Dentro de la solución, agregaremos un nuevo proyecto:

Agregar nuevo proyecto

Elegiremos un nuevo proyecto de tipo “Biblioteca de Clases”:

Elegir el proyecto y asignar el nombre

He marcado el área de nombre para recordar cambiarlo, porque a veces simplemente te vas con el nombre que el sistema asigna y no siempre es bueno, cuando los proyectos se vuelven grandes puede haber confusiones, aunque siempre se puede cambiar el nombre despues de creado…

Una vez creado el nuevo proyecto podemos verlo así en el explorador de soluciones:

Explorador de soluciones con los dos proyectos en la solución

Una vez creado el proyecto lo que haremos es crear la respectiva referencia entre el proyecto WindowsApplication y la Biblioteca de Clases, la referencia permite que se pueda instanciar como un espacio de nombre a la dll, de forma que en cualquier parte del proyecto se pueda importar el espacio de nombre y utilizar los procedimientos creados en las clases que contiene… la referencia se hace de la siguiente forma: (ojo que es en 2005, en versiones anteriores se hace de manera distinta, y el 2008, pues no me lo he pillado en español… XD): “Notése que la referencia se crea en el proyecto WindowsApplication para que este tenga acceso a la Bibiloteca de Clases, si se hace al revés, simplemente no funcionará”

Agregar referencia de nuestra DLL en el proyecto WindowsApplication

Al hacer click en Agregar Referencia en el proyecto WindowsApplication, nos saldrá esta ventanita, en la que hemos de seleccionar la pestaña “Proyectos” para que busque en los proyectos de nuestra solución, nos muestra el proyecto que acabamos de crear y le damos Aceptar.

Agregar referencia

Una vez creada la referencia al proyecto, procederemos a trabajar en la “Clase” dentro de él,  aqui escribiremos todos los procedimientos, funciones o propiedades que necesitemos usar, en mi caso, he colocado las funciones que trabajan con la base de datos, y que ejecutan tareas como Recuperar, Insertar, Actualizar y Eliminar Datos, ya que son funciones que utilizo muy a menudo en casi todo el sistema y que no voy a estar escribiendo las mismas veinte lineas a cada rato….

Procedimientos de la clase

una vez creadas nuestras funciones en la clase de nuestra librería (yo he creado solo cuatro y uno sobrecargado, eso sí, hay que declararlas públicas para que puedan ser llamadas desde el otro proyecto, creo que no tengo que explicar eso), podremos utilizarlas por medio de la referencia que creamos.

Vista del procedimiento aplicado en un formulario

Aqui esta la vista de uno de los formularios dl proyecto WindowsApplication, la forma de importar la Dll con la referencia hecha es la siguiente:

  • fuera de la clase, (en la primera linea), llamas la librería con la línea Imports Cclin01pro.Clsproc
    Donde: “Cclin01pro” es el proyecto de Biblioreca de Clases, “Clsproc” es la clase de la biblioteca a la que haremos referencia.
  • Declaramos, dentro de la clase una instancia de la biblioteca que acabamos de importar:
    Dim Cclinpro as new Cclin01pro.clsproc
    Esto nos permitirá llamar mas fácilmente las funciones que estén dentro de la clase Clspro.
  • La función que voy a llamar es BuscaDatos, pide varios parámetros para poder hacer la consulta a la base de datos, y el resultado de la consulta lo devuelve en  un objeto DataSet, por lo que para poder llamarlo debo hacerlo con un objeto DataSet en el cual va a depositar el resultado de la consulta:
    Ds = Me.Cclinpro.BuscarDatos(……Parametros…..)
    Hay que recordar que: “Los nueves se casan con los nueves, los cuatros con los cuatros, los sietes con los sietes“, no se puede igualar un dos con un nueve, por lo que para poder llamar esta función de tipo DataSet, declaré arriba un DataSet llamado “Ds” porque ahi se depositará el resultado de la consulta que viene en ese tipo de objeto.

Bueno, ahora solo queda disponer a vuestra voluntad de los datos devueltos por la consulta, y utilizar este procedimiento cuantas veces querais dentro de nuestro formulario, ojo que hay que hacer los dos primeros pasos en cada formulario que vayan a ocupar la clase y sus funciones y/o pocedimientos.

Como lo he dicho al principio, esta es la forma mas simple de crear y utilizar DLL, esto significa que existen cientos de formas de hacerlo, el cielo es el límite y solo hay que poner Alas en la Mente….

23
Sep
08

Sobre los Proyectos de Alas en la Mente…

Alas en la Mente esta conformada por un grupo de programadores Salvadoreños que tiene como objetivo profundizar en las técnicas de Desarrollo Orientado a Objetos y contribuir con trabajos de calidad a la creciente comunidad del Software Libre…