Archivo para 28 septiembre 2009

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…

Anuncios
21
Sep
09

Que hacer en caso de un terremoto…. (Hecho por un Salvadoreño…)

Que hacer en caso de haber un terremoto???, bueno, primeramente ponga cara de vivo y diga: ‘¡Hey está temblando!’; después ‘tanteye’ si es conveniente salir dependiendo de la magnitud del sismo. Calle a los chuchos (si es que tiene) pues es mas el ajolote que le transmiten a uno. Chiflele a los cipotes para que esten listos y sáquelos ‘chiniados’. Cuando termine la réplica diga lo de siempre, ‘¿Hey sintieron?’.

QUE HACER SI LA REPLICA LO AGARRO EN EL BAÑO?. Cuando oiga los chuchos haciendo un gran ‘deschongue’, mejor corte su tirita de papel higiénico y téngala lista por si acaso, pues cuando los chuchos se ponen bulliciosos es porque va a temblar. Si se esta bañando y lo agarra una réplica de 7.3 grados aviéntese chulon directo a la puerta de salida y corra como nunca, mas vale que los vecinos hablen de su caso todo lo que resta del año por haberlo visto chulón, a que pasen todo el año diciendo, ‘tan bueno que era’.

QUE HAGO SI ESTOY EN UNA 4a. ó 6a.PLANTA?. Primero cálmese, después diga: ‘En tus manos encomiendo mi espíritu’….. y expire en paz.

SI ESTA EN UN CENTRO COMERCIAL?. Si el almacen es de ropa, agarre una mudada completa de su talla y corra a los vestidores, le aseguro que en el ajolote, nadie se dará cuenta que salió estrenando. Si es una tienda de electrodomésticos y estaba a punto de hacer un abono cuando empezó el agarrón, pues haga como que ya le había dado a la cajera los $100 y pida su vuelto de los $15.00 que iba a pagar.

QUE HACER SI LE AGARRA UNA REPLICA EN UN SOTANO?. Ni se preocupe por salir corriendo a las gradas o al ascensor, total ¿para qué quiere subir si ya todo el edificio viene para abajo? Mejor serenese, pongase en posicion horizontal viendo hacia arriba, cruce las manos encima del pecho y si por aquello de las casualidades anda un limón, cortelo por la mitad y pongaselo en la boca. Por lo menos cuando lo encuentren pensarán ‘este murió en paz, no corrió… no era impío’.

QUE HACER SI EL SAMAQUION ME AGARRA EN CASA DE MI NOVIA?. Antes que nada recuerde que debe demostrar que usted será el hombre de la casa algún día y sus suegros deben ver en usted a alguien sereno (calmaaaado…calmaaaado). Levántese y organice una salida ordenada, por nada del mundo vaya a olvidarse de la abuela, chinee al cuñadito de 5 años que le cae mal y finja preocupación por él, aproveche esta situación para meterle ese empujón (casi trompón) a su suegra asumiendo demencia y dígale después que era por salvarle la vida. Si su suegro le debe alguna también, sueeeeeeeneselo y ya sabe despues solo deselas de Superman…

QUE HAGO SI LA REPLICA ME AGARRO CABAL A MEDIA PELICULA EN EL CINE?. Para empezar, ¡¿quién lo manda ir al cine en esos momentos de tribulación?! Pero bueno, asumamos que fue lo suficientemente …. o mejor dicho valorudo (por no ofenderlo) y esta en el cine en medio de aquel ‘gentillal’ y en la oscuridad total. Si se va la luz no vaya a perder el tiempo gritando: ‘devuélvanme la cora’ o chiflando la vieja. ¡Coooooorra maestroooooo!, salte sobre las butacas si es necesario, empuje con todas sus fuerzas el nudo de gente que seguramente habrá en la puerta, grite, llore cuando le caiga el cielo falso en la cabeza y vea que todo el ripio se desprende… Total ¡QUIEN LO MANDA ANDAR EN ESAS ENCERRADERAS OSCURAS EN ESTOS DIAS! RECOMENDACIONES ADICIONALES: Si esta en un edificio o casa, ‘cargue’ siempre una bolsa plastica negra de su tamaño, y cuando comience a temblar métase en ella, ahorrele el trabajo a los chamacos de rescate. Siempre lleve una media libra de Purina (comida para chuchos), para que los perros de rescate lo localicen más rápido en medio de los escombros…

Saludos…

16
Sep
09

Evento: Software Freedom Day! en El Salvador

Éste evento se llevará acabo en la UTEC…

evento-software-libre

Con respecto a la ponencia de IPCop, trataré de grabarlo en video y lo subiré en éste mismo blog.

Saludos!!!!!

12
Sep
09

Copiar o duplicar disco duro virtual en VirtualBox

Hace poco virtualicé IPCop en mi laptop y, antes de hacer “destrozos” con ésta distro se me ocurrió hacer una copia del archivo VDI que es el archivo que utiliza VirtualBox como disco duro virtual, y éstos archivos se encuentra generalmente en /home/usuario/.VirtualBox/HardDisks.

Como paréntesis, Hay que tomar en cuenta que en Nautilus todas las carpetas que empiezan con “punto” son tratados como archivos ocultos y no se muestran así de entrada, por lo que se deberá presionar la combinación de teclas CTRL+H o dar clic en “Ver->Mostrar los archivos ocultos”

vbox01

Luego de hacer pruebas destructivas con la máquina virtual IPCop, decidí restaurar el sistema con la copia que había hecho del archivo VDI pero mi sorpresa es que, cuando quice poner como disco duro de la máquina virtual la copia que tenía del VDI me salió un mensajito así…

vbox3

Por lo que aprendí una lección: los archivos vdi no solo se deben copiar ya que éstos poseen un código UUID (Identificador Universalmente Unico) que se utilizan generalmente en dispositivos como discos duros. Ya que el archivo VDI es un disco duro “virtual”, éste también posee un UUID que no debe ser “único”.

Investigando encontré que, para hacer una copia de un archivo VDI, se debe de utilizar un comando que ya tiene VirtualBox. Básicamente la línea de comando para hacer la copia o clonado es la siguiente:

oscard@skrdz:~$ cd /home/oscard/VirtualBox/HardDisks/
oscard@skrdz:~$ VBoxManage clonehd demo-ipcop.vdi  demo-ipcop2.vdi

  • La primera para ubicarnos en donde se encuentran los archivos VDI
  • La segunda línea es el comando que nos permite clonar el disco duro asignándole un nuevo UUID. Donde dice “demo-ipcop.vdi” es el disco duro que quiero copiar/clonar y el que dice “demo-ipcop2.vdi” es el disco duro virtual resultante.

La salida que muestra el comando es:

vbox06

Y ya con ésto es suficiente. Al querer crear una nueva máquina virtual asigándole el disco duro que hemos clonado con diferente UUID, VirtualBox nos dejará pasar y tendrémos otro SO sin necesidad de volver a empezar de CERO.

Espero que le ayude a alguien así como me ayudo a mi jejejj XD

Saludos!

11
Sep
09

Transact Sql Básico – Crear una Base de Datos con llaves primarias y relaciones en SQL-Server 2005

Bueno, creo que este es un buen tema para publicar, como hacer una base de datos en Sql Server con sus llaves primarias y relaciones pero a puro código, asi que comparto este código con ustedes, lo único que deben hacer es pegarlo en el editor de consultas de SQL y listo…

Lo primero es crear la base de datos…

Create Database Inscripciones
go

luego le decimos que cambie a la base que hemos creado

Use Inscripciones
go

Ahora creamos las tablas en nuestra base de datos:

Create Table Estudiantes
(IdEstudiante int,
Nombres VarChar(25),
Apellidos VarChar(25),
Direccion VarChar(50),
Telefono VarChar(8),
Primary Key (IdEstudiante))
go

Create Table Materias
(IdMateria int,
Materia VarChar(30),
Primary Key (IdMateria))
go

Create Table Notas
(IdEstudiante int,
IdMateria int,
Nota decimal (10,2))
go

Ahora que tenems nuestras tablas creadas con sus respectivas llaves primarias, procederemos a crear los constraint o relaciones para las tablas.

Alter Table Notas
add constraint fk_Notas_IdEstudiante
Foreign key (IdEstudiante)
References Estudiantes(IdEstudiante)
go

Alter Table Notas
add constraint fk_Notas_IdMateria
Foreign key (IdMateria)
References Materias(IdMateria)
go

ahora podemos perfectamente ver el diagrama de la base de datos que queda de esta forma:

Diagrama DB Inscripciones

Ahora nuestra base de datos está lista para que podamos trabajar con ella, y para que sea mas real, le agregaremos algunos registros y jugaremos con ella un poco…

Primero, agregaremos algunos estudiantes…

Insert Into Estudiantes Values (01, ‘Maria’, ‘Hernandez’, ‘Col. Santa Isabel’, ‘22542121’)
Insert Into Estudiantes Values (02, ‘Oscar’, ‘Mejía’, ‘Final 4º calle ote.’, ‘26098345’)
Insert Into Estudiantes Values (03, ‘Hilario’, ‘Urrutia’, ‘Final calle el progreso’, ‘29078341’)
Insert Into Estudiantes Values (04, ‘José’, ‘Quezada’, ‘Mejicanos’, ‘23456895’)
Insert Into Estudiantes Values (05, ‘Adriana’, ‘Urrutia’, ‘San Jacinto’, ‘22204789’)

Ahora agregamos algunas materias…

Insert Into Materias Values(111, ‘Base de Datos II’)
Inset Into Materias Values(114, ‘Ingeniería del Software’)
Insert Into Materias Values(115, ‘SQL Server’)

Ahora algunos registros de notas…

Insert Into Notas Values (01, 111, 7)
Insert Into Notas Values (01, 115, 6.0)
Insert Into Notas Values (01, 115, 4)
Insert Into Notas Values (02, 111, 6)
Insert Into Notas Values (02, 114, 10)
Insert Into Notas Values (02, 115, 8.0)

Ahora, con la base creada y con registros en ella podemos modificar lo que queramos…

por ejemplo, borrar los registros de notas que correspondan a la materia ‘Base de Datos II’:

Delete From notas Where IdMateria = 111

Modificarle a 9.0 la nota a Oscar Mejía para la materia ‘Sql Server’:

Update notas Set nota = 9.0 Where IdEstudiante = 02 and IdMateria = 115

Modificar el nombre de la materia ‘Ingeniería del Software’ a ‘Desarrollo de Software:

Update Materias Set Materia = ‘Desarrollo del Software’ Where Materia = ‘Ingeniería del Software’

Borrar a los estudiantes que tengan apellido ‘Urrutia’:

Delete From Estudiantes Where Apellidos = ‘Urrutia’

Mostrar a todos los estudiantes:

Select * From Estudiantes

Mostrar el apellido y la dirección del estudiante 01

Select Apellidos, Direccion From Estudiantes Where IdEstudiante = 01

Seleccionar el código de materia, el nombre de materia y la nota de las materias que cursa el estudiante 02, (Este inner join esta bueno para los que nunca han consultado dos tablas a la vez).

Select Materias.IdMateria, Materias.Materia, Notas.Nota From Materias inner join Notas on Materias.IdMateria = Notas.IdMateria Where Notas.IdEstudiante = 02

Muestra la nota media de cada estudiante para las materias que cursa.

Select IdEstudiante, AVG(Nota) From Notas Group By IdEstudiante

bueno… espero que les sirva para crear bases de datos más grandes, completas y funcionales.

Creo que siempre es bueno saber como hacer las cosas a pie, es decir, con código, porque los nuevos lenguajes tratan de acostumbrar a los nuevos programadores a trabajar con los asistentes, cosa que no considero que este bién, es bueno conocer las herramientas, utilizarlas hasta cierto punto, pero no hay nada mejor que crear tu propio código sin que el sistema te diga como o con que elementos crearlo, sobre todo con sistemas de Micro$oft…

Saludos…

10
Sep
09

El Software Freedom Day en El Salvador!

Amig@s!!!! el 19 de Septiembre 2009 se amenizará un evento en la Universidad Tecnológica de El Salvador (UTEC), cuyo tema eje es: La libertad del software o software libre (El Software Freedom Day!!). Si quieren mayor información, pueden visitar el sitio: http://www.opensuse.org.sv/wiki y http://www.danielsuarez.org

Yo realizaré la ponencia de: “Construyendo tu propio firewall con IPCop” y trataré de capturar el video de todo lo que haga en la laptop y lo que diga de tal manera que lo pueda subir a éste blog, así que esten pendientes y, para los que estan en El Salvador, estan invitados a éste evento y compartan ésta información con sus amig@s para que nos hagan barra y compartamos el amor al software libre.

Aqui les pongo más o menos la programación del día:

ACTIVIDAD EXPOSITOR Tiempo (min) INICIO FIN
Presentación Erick Garcia y Franklin Cisneros 10 09:30 09:40
Transición
La comunidad openSUSE de El Salvador y el proyecto openSUSE Jose Roberto Alas 30 9:45 10:15
Transición
Diseño gráfico con GIMP e INKSCAPE Walter Tobar y Manuel Guardado 60 10:20 11:20
Introducción a UBUNTU Mauricio Reyes 40 11:20 12:00
Transición
Instalación de Slackware GNU/Linux Daniel Suárez 40 12:05 12:45
GNU/Linux y TCP/IP Erick Garcia 60 13:00 14:00
Transición
Software libre y el proyecto FEDORA Andrés Pascasio 60 14:05 15:05
Transición
Construyendo tu propio firewall con IPCop SkrDz 60 15:10 16:10
Invitación a integrarse a openSUSE SV y UBUTEC Daniel Estevez 10 16:10 16:20
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