.Net: El DataSet (C#)

(he resubido el archivo de ejemplo el link al final del post funciona)

Descargar ejemplo

Hoy voy a hablar del DataSet que es el componente principal de .NET para el tratamiento de datos, la mayor ventaja que implementa este en comparación con el DataReader es que trabaja de forma desconectada del origen de datos y es independiente del mismo, ya que no es necesario determinar a que tipo de servidor de datos es el que provee los datos un dataset actualiza los datos mediante un dataadapter el cual si debe de saber cual es el data provider pero eso es otro cantar, por que usar dataset pues al no depender de un proveedor de datos todas tus aplicaciones pueden trabajar con las mismas funciones ya que siempre operas sobre un dataset así si tu app trabaja con

acle, MS SQL Server, MySQL, etc., nuestro trabajo solo seria en cambiar los data adapters ya que todo el procesamiento lo haríamos en el dataset y sin importarnos a que servidor se vaya trabajaría la aplicación de forma correcta.

Al final dejo el proyecto de ejemplo en VS 2005 para su descarga

Un data set lo que hace es leer la data del data provider y almacenarla en memoria de forma que puede ser accedida de manera local ya que no necesita estar conectado hasta que se le indique al dataadapter realizar un refresco de la información.

Bueno ahora voy a mostrar en un ejemplo como se debe de crear un dataset desde código ya que hacerlo desde los wizard’s de VS es sencillo y mi idea es que se entienda como es que funciona y alguna de las clases de manejo de datos de .NET.

Lo primero, voy a usar únicamente SQL Server 2005 (en su versión express) en un post posterior voy a describir el data provider de MySQL, Postgress y SQLite, el de Oracle no por ahora pues primero no tengo licencia de Oracle y segundo pues aun que estoy descargando la versión express de este servidor de datos creo que merece un post especial aparte.

Manos a la obra:

Primero que nada el namespace que se usara:

using System.Data.SqlClient;

Ahora las clases necesarias para la conexión, el dataadapter y el dataset

SqlConnection conn;
DataSet dsEjemplo;
SqlDataAdapter da;

El SqlConnection es el que me permite conectarme con el servidor de datos y su sintaxis es simple, nada mas se le da la cadena de conexión y luego se llama al método Open del mismo y se conecta en el código tengo una función que requiere dos parámetros el nombre del servidor (que puede ser una IP) y el nombre de la base de datos, esta cadena de conexión es muy simple ya que asumo que trabaja con la seguridad integrada de SQL Server (inicia sesión basado en el usuario de Windows), sino tendríamos que ponerle el user y el password también algo como: Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword; bueno en todo caso si lo que quieres es saber como se arma una cadena de conexión con una gran cantidad de servidores de datos (SQL Server, MySQL, Oracle, Firebird, DB2 entre otros) pues en pagina http://www.connectionstrings.com/ encontraras muchos ejemplos (por no decir todos).

private void conectar(string cServer, string cDB)
{

if (conn == null)
{
conn= new SqlConnection(“Server=” + cServer + “;DataBase=” + cDB + “;Integrated Security=SSPI;”);
conn.Open();
}
else
{
if (conn.State != ConnectionState.Open)
conn.Open();
}
}

Ahora a la definición del dataadapter este es el paso mas importante de todos ya que este es el que se encarga de hacer las operaciones hacia el data provider una definición sencilla que solo nos traiga los valores de los datos seria:

da = new SqlDataAdapter(“select * from fichas”, conn);

Con eso y con llenar el DataSet con:

da.Fill(dsEjemplo, “Fichas”);

pues ya tenemos nuestro dataset lleno de los datos de la tabla pero aun que si enlazamos este DataSet a un control dataGridView pues normal nos muestra los valores, es mas nos deja agregar, modificar, eliminar y demás cosas pero no las va a grabar en nuestra base de datos por que el dataadapter no esta preparado para ello, para que esto ocurra tenemos que indicarle a al dataadapter cuales son acciones para el insert, el update y el delete de nuestra tabla, bueno aquí vamos:

Lo primero que se tiene que saber que no solo basta con definir las sentencias, sino que también es necesario definir los parámetros de las mismas, así si tenemos un insert y le decimos que como parámetros le mandamos los valores tienes que definirlos para eso se usa la clase SqlParameter como veremos en el ejemplo:

dsEjemplo = new DataSet();
da = new SqlDataAdapter(“select * from fichas”, conn);
da.InsertCommand = new SqlCommand(“INSERT INTO [ejemplos].[dbo].[fichas]([nombre],[direccion],[telefono],[monto]) “+
“VALUES “+
“( @nombre,”+
“@direccion, “+
“@telefono, “+
“@monto )”,conn);
this.da.InsertCommand.Parameters.Add(new SqlParameter(“@nombre”, SqlDbType.VarChar, 0, ParameterDirection.Input, 0, 0, “nombre”, DataRowVersion.Current, false, null, “”, “”, “”));

this.da.InsertCommand.Parameters.Add(new SqlParameter(“@direccion”, SqlDbType.VarChar, 0, ParameterDirection.Input, 0, 0, “direccion”, DataRowVersion.Current, false, null, “”, “”, “”));

this.da.InsertCommand.Parameters.Add(new SqlParameter(“@telefono”, SqlDbType.VarChar, 0, ParameterDirection.Input, 0, 0, “telefono”, DataRowVersion.Current, false, null, “”, “”, “”));

this.da.InsertCommand.Parameters.Add(new SqlParameter(“@monto”, SqlDbType.Decimal, 0, ParameterDirection.Input, 18, 2, “monto”, DataRowVersion.Current, false, null, “”, “”, “”));

Primero el dataadapter tiene cuatro comandos para realizar las operaciones en una tabla: SelectCommand (para traer datos), el InsertCommand (para insertar registros), el UpdateCommand (para actualizar registros) y el DeleteCommand (para eliminar registros) en todos los casos siempre son sentencias sql y si tienen parámetros tienen que ser definidos estos como en el ejemplo creando una instancia de la clase SqlParameter (si no saben cuales son los parámetros o los valores de los parámetros pues muy sencillo creen un DataSet añadiéndolo al proyecto y luego arrastren la tabla del server explorer luego pueden editar el archivo DataSet1.Designer1.cs y allí verán las sentencias correctas para los parámetros)

Ya listo terminamos de definir nuestro DataAdapter ahora la sentencia:

da.Fill(dsEjemplo, “Fichas”);

y si estamos en nuestro winform pues y tenemos un datagridview insertado pues podemos hacer lo siguiente:

this.dataGridView1.DataSource = dsEjemplo;
this.dataGridView1.DataMember = “Fichas”;

Estas dos líneas hacer que se conecte el datagridview con nuestro dataset y poder así trabajar los datos, el primero le indica a la grilla que su origen de datos es nuestro dataset pero como un dataset puede contener mas de una tabla pues necesitamos ponerle al datamember el nombre de la tabla, este tiene que ser el mismo que se puso cuando se relleno el dataset desde el método Fill del DataAdapter (el segundo parámetro que en nuestro ejemplo es “Fichas”)

Ahora si, vamos a ver cual es el proceso para que los cambios que realizamos en nuestro DataSet se refleje en la base de datos:

1. Crear un dataset que contenga los cambios con el método GetChanges()

DataSet cambios;
cambios = dsEjemplo.GetChanges();

2. Enviar estos cambios al dataadapter con el método Update()

da.Update(cambios,”Fichas”);

3. Aceptar los cambios en el DataSet con el método AcceptChanges()

dsEjemplo.AcceptChanges();

También podemos cancelar los cambios con el método del dataset RejectChanges() que nos permite cancelar los cambios.

El Dataset implementa banderas para indicar si quedan o no actualizaciones pendientes como HasChanges() que dirá si se realizaron o no cambios, este método devolverá true si se modificaron datos y no se ha llamado al método AcceptChanges o RejectChanges.

Bueno aquí les dejo el proyecto. Dentro del rar esta la base de datos que tienen que adjuntarla a SQL Server.

Nota he posteado esto con Windows Live Writer.

Acerca de

Antes que nada voy a dejar en claro algo, en este blog escribo como se me place, asi que no busquen errores de ortografia o de redaccion que los van a encontrar a montones y tampoco me critiquen o me digan nada sobre ellos pues no tengo intencion alguna de cambiarlos, lo que escribo lo dejo asi y no lo corrijo,claro esta a menos que sean lineas de codigo. Jorge Prado Anci, profesional en desarrollo de aplicaciones, en especial las dirigidas a bases de datos. He trabajado con VFP en casi todas sus versiones, se algo de Java (que no me gusta, es eso solo no me gusta, es bueno pero no me gusta), lo suficiente de PHP como para tener mi propio CMS(es que sigue sin gustarme por la capacidad de desorden que te permite este “lenguaje”), VB lo conoci y lo deteste tanto que lo olvide al punto de no querer adoptar ni por obligacion a su reemplazante VB .NET (por lo mismo de Java) y si C# este si me encanta y aun que conozco bastante bien el lenguaje, la verdad es que me falta mucho del Framework (del 100% estare en un 65%). Soy un apasionado por el orden (en los proyectos de desarrollo), de la programacion en capas (de MVC conozco pero no he aplicado mucho), los estandares y las condenadas pruebas unitaria. Venga creo que ya con esto fue suficiente.

Tagged with: , , , , , , ,
Publicado en c#
6 comments on “.Net: El DataSet (C#)
  1. […] ahora voy a usar el mismo disenho de formulario que en el ejemplo anterior donde usaba SQL SERVER asi que aqui […]

  2. Sebastian dice:

    Excelente explicación, me quedo todo muy claro
    gracias!

  3. matiasp dice:

    muy buena la nota, tengo una duda…que sucede si al momento de refrescar los cambios de ds en la bd, este se encuentra con que algunos de los registros fue modificado o eliminado previamente por otro ds, por ej, en una aplicacion de acceso concurrente….saludos y agradezco mucho tu ayuda!

  4. Robinson dice:

    oye no puedo descargar el proyecto, lo puedes volver a subir por favor?

  5. Jose dice:

    Que tal, tengo un problema con un DataSet, no es de tu proyecto, pero tal vez me puedas ayudar. Estoy usando archivos DBF, todo va bien, pero al momento de recuperar datos del DataSet con el método SELECT no filtra la información, solo se trata de una sola tupla la que tiene que devolver, pero devuelve en el DataRow todos los registros del DataSet. Utilicé FoxPro para verificar que la expresión de consulta y es correcta; pero no obtengo el mismo resultado con C#.

    Ojalá me puedas orientar.

    Saludos y gracias.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Escribe tu dirección de correo electrónico para suscribirte a este blog, y recibir notificaciones de nuevos mensajes por correo.

Únete a otros 441 seguidores

Blog Stats
  • 304,137 hits
A %d blogueros les gusta esto: