Índice de la sección dedicada a .NET (en el Guille) ADO.NET

Generar clases para acceder a una tabla

Crear clases (en VB o C#) con el contenido de una tabla de una base de datos de Access o SQL Server

Publicado: 13/Jul/2004
Actualizado: 07/Mar/2008
Autor: Guillermo 'guille' Som

Nota del 07/Mar/08:
El código fuente de esta utilidad, (y la DLL que genera el código), con algunas modificaciones y adaptado a Visual Basic 2005, lo puedes bajar desde Codeplex, para más información, lee esto que publiqué el 4 de Mayo de 2007.

 

 

Introducción

Con esta utilidad vamos a poder generar una clase (tanto para VB .NET como para C#) que nos permitirá acceder a una tabla de una base de datos ya sea de Access como de SQL Server.

La idea de este código (o el porqué me compliqué la vida para hacerlo) es para poder tener una clase con cada uno de los campos de una tabla de una base de datos, de forma que la propia clase contenga todo el código necesario para conectar a la base de datos, así como poder crear nuevos registros (filas), eliminarlos, actualizarlos e incluso buscar en la tabla. También con la clase generada podemos acceder a cada uno de los campos mediante un índice, el cual puede ser numérico (al estilo de un array) o bien alfanumérico, es decir, podemos acceder al contenido de un campo (columna) indicando el nombre de dicha columna.
La clase generada también nos permitirá obtener un objeto DataTable con el contenido de los datos de dicha tabla, usando para ello, (si queremos), un filtro con el que poder seleccionar las filas que queremos obtener (usando la típica cadena SELECT).

 

Los miembros de la clase generada

La clase generada por esta utilidad tendrá una serie de propiedades y métodos que nos permitirán trabajar con los datos de cada fila de la tabla, algunos serán de instancia y otros serán estáticos o compartidos, de forma que podamos acceder a ellos sin necesidad de crear un nuevo objeto, aunque estos últimos serán los menos, ya que la intención es que la clase "apunte" a una fila de la tabla en cuestión.
Veamos las propiedades y métodos públicos que tendrá la clase generada automáticamente.

Constructores

Esta clase tendrá dos constructores, uno sin parámetros y el otro que recibe la cadena de conexión a usar. Aunque esto último no es necesario, ya que la cadena de conexión usada es la misma que la que se utilizó para crear la clase. Pero si por cualquier razón quieres usar la clase en otro equipo, puedes usar el constructor para indicar la nueva cadena de conexión a la base de datos.

La propiedades (de instancia)

Habrá una propiedad pública por cada una de las columnas (campos) de la tabla. Estas propiedades serán de instancia (sólo accesibles mediante un objeto creado en la memoria).

La propiedad predeterminada (Item en VB, el indizador en C#) nos permitirá acceder a los valores de cada una de las propiedades mediante un índice, el cual puede ser:
Numérico, con valores desde cero hasta el número de columnas (menos uno) que contenga la tabla, de forma que podamos usar un bucle para acceder a cada uno de los valores contenidos.
Alfanumérico, en cuyo caso usaremos el nombre de cada columna para poder acceder al valor.

Campos estáticos/compartidos

CadenaSelect
Este campo público (y compartido) nos permitirán acceder (e incluso modificar) a la cadena de selección, es decir, aquí podremos indicar los datos a los que queremos acceder. Esta es la típica cadena SELECT, la cual podremos usar para clasificar los datos o simplemente para "filtrarlos".

Los métodos estáticos/compartidos

Hay dos métodos estáticos (compartidos) que nos permitirá realizar las operaciones sin necesidad de crear una nueva instancia de la clase.

Tabla
Este método nos servirá para obtener el contenido de la tabla completa o las filas que indiquemos en la cadena de selección (campo CadenaSelect), también podemos usar una de las sobrecargas en la que podemos indicar la cadena de selección a usar para obtener los datos.

Buscar
Este método estático nos permitirá buscar un registro en la tabla y devuelve un objeto del tipo de la clase con el contenido.
Tiene un parámetro en el cual indicaremos lo que se usará en la cláusula WHERE de la cadena de selección usada para buscar.

 

Los métodos de instancia

Existen tres métodos de instancia para realizar las típicas operaciones de actualización, eliminación y creación de un nuevo registro.

En los dos primeros, de forma predeterminada, se utilizará una cadena de selección en la que se "busca" el campo principal (único o autoincremental) de la tabla. Por ejemplo, si el campo índice es un campo llamado ID, se buscará en la base de datos un registro que coincida con el valor que la propiedad ID tenga. En esos tres métodos también se podrá indicar la cadena de selección que queramos, pero sólo deberíamos hacerlo si sabemos a ciencia cierta lo que queremos hacer...

Veamos cada uno de ellos:

Actualizar
Este método nos permitirá actualizar un registro existente de la tabla con el contenido de la clase.
Por tanto es importante que el objeto en memoria "apunte" a un registro existente, que será el que queremos actualizar.
Existen dos sobrecargas de este método, una en la que se usará una cadena de selección en la que se "busca" el registro que coincida con el campo principal de la tabla (tal como he indicado anteriormente), y otra en la que podrá indicarse la cadena de selección a usar para obtener el registro.

Borrar
Elimina de la tabla el registro al que hace referencia el contenido de la clase.
Al igual que en Actualizar, existen dos sobrecargas, una que usa la cadena "predeterminada" para localizar el registro en la tabla y otra en la que podemos indicar la forma de localizar el registro.

En estos dos casos, es recomendable usar la sobrecarga sin parámetros y si queremos cambiarla, podemos hacerlo en el propio código de la clase.

Crear
Crea un nuevo registro usando el contenido de la clase.
En el caso de que exista un campo autoincremental, debemos asegurarnos que no se asigne ningún valor a dicho campo, ya que será el propio motor de la base de datos el que se encargue de asignarle el valor correspondiente.
La utilidad de generar la clase analiza el contenido de la tabla y si se encuentra con un campo incremental, comentará la parte del código que asigna un valor a la fila de dicho campo, esto se hace en el método <nombreClase>2Row.

 

En los métodos Actualizar, Crear y Borrar hay dos formas de realizar las operaciones.
Una de ellas utiliza un objeto CommandBuilder para crear las cadenas de actualización, inserción y eliminación, esta es la que estará predeterminada a pesar de que es la que más recursos y tiempo consume.
La otra forma es creando las cadenas y parámetros que nos permitan realizar dichas acciones en la base de datos.
Es preferible usar esta última, pero la razón de que la deje comentada, es porque en algunos casos no funciona al 100%, aunque en las pruebas que he hecho siempre ha funcionado, tanto para las bases de SQL Server como para las de Access, pero... como más vale tarde pero seguro, he optado por dejarlas comentadas.
Lo que recomiendo que hagas es quitarle los comentarios y comprobar que funciona bien, en ese caso te recomiendo que las utilices, ya que el rendimiento es mejor, por la sencilla razón de que podemos "afinar" más el proceso de actualización, creación o eliminación.

De todas formas, en la utilidad de creación de las clases he añadido una opción para poder elegir entre usar CommandBuilder o usar la correspondiente cadena UPDATE, INSERT o DELETE, según sea el caso.

 

Y esto es lo que tendrá la clase generada de forma automática.
Con estos métodos y propiedades podemos acceder a los datos y realizar, de forma simple, las operaciones que normalmente solemos hacer con las tablas.


Los links

En los siguientes links tienes acceso a la librería que genera automáticamente las clases, así como la utilidad que puedes usar para generar dichas clases y para que veas que todo funciona, una pequeña utilidad que te servirá para usar cualquiera de las clases generadas con sólo un par de cambios en el código.

En esas páginas encontrarás los links al código y las librerías y ejecutables usados.

 

Espero que lo disfrutes... que bastante trabajillo me ha costado hacer que más o menos sea operativa al 100%.

Por supuesto, estoy abierto a cualquier sugerencia o comentario, así como a que me digas los fallos con los que te hayas encontrado al usar la utilidad y la librería.
También te recomiendo que leas lo que digo en esas páginas para que sepas las "limitaciones conocidas", ya que no todo iba a ser perfecto... aunque me gustaría que lo fuera, pero...

Nos vemos.
Guillermo


la Luna del Guille o... el Guille que está en la Luna... tanto monta...