SQLServer desde C#

El otro día en clases de Desarrollo de Aplicaciones Informáticas, mi profesor de C# pretendía que utilizáramos el motor de bases de datos SQLServer. Seguramente, os parezca una tarea sencilla, pero la mitad de la clase no sabe programar y su programa de enseñanza deja mucho que desear. Su frase favorita es: bájate un manual de Google.

Anteriormente trabajé con otros motores de base de datos con Delphi y me imaginé que sería similar desde el Visual Studio. En Delphi cuentas con el componente TDBGrid y añadir, eliminar y hacer consultas SQL es muy simple; en cambio en el Visual Studio tienes el componente DataGridView que me produjo grandes dolores de cabeza, seguramente a causa de mi torpeza. Tras una hora de pelearme con el Visual Studio y siguiendo guías del msdn, busqué en Google como ejecutar instrucciones SQL sin DataGridView, sin DataSet...

Me encontré con la clase OleDbConnection, OleDbCommand y OleDbReader que hacen todo lo que buscaba. La primera hace posible la conexión con la base de datos, OleDbCommand ejecuta consultas SQL y OleDbReader obtiene los resultados de las consultas. Así que se me ocurrió crear mi propia clase y hacer una pequeña aplicación de prueba, el resultado fue esta sencilla agenda.

Primero vamos a crear la base de datos para utilizarla en nuestro proyecto. Vamos al explorador de soluciones, seleccionamos nuestro proyecto y le damos al botón derecho. Agregamos un nuevo elemento y seleccionamos "Base de datos local".


Seleccionamos Entity Data Model, siguiente, Modelo Vacío y finalizar.
En el explorador de soluciones abrimos nuestra base de datos, se nos abrirá un nuevo panel. Vamos a "Tablas", botón derecho y le damos a Crear Tabla.


Se nos abrirá una ventana nueva. En el nombre de la tabla ponemos: "Agenda" y agregamos los siguientes campos:

Id: int, identidad y clave principal.
Nombre: nvarchar(20), not null.
Apellidos: nvarchar(30), not null.
Telefono: int, not null.
Direccion: nvarchar(50), not null.


Ya tenemos la base de datos creada, ahora añadimos la clase SqlDB.cs.

using System;
using System.Data.OleDb;
using System.Windows.Forms;

/*
 * Unidad SqlDB.cs
 * Esta unidad contiene la clase SqlDB para trabajar
 * con bases de datos SQLServer mediante una interfaz
 * mínima y sin complicaciones.
 * 
 * Autor: Khronos14
 * email: khronos14@hotmail.com
 * Blog: khronos14.blogspot.com
 */ 

namespace Sqldb
{
    class SqlDB
    {       
        public const int DB_COULDNT_CONNECT     = 1;
        public const int DB_NOT_CONNECTED       = 2;
        public const int DB_ALREADY_CONNECTED   = 3;
        public const int DB_SQL_ERROR           = 4;

        private OleDbConnection DbConnection;
        private string DBFileName;
        private bool FActived;

        public SqlDB(string DBFileName)
        {
            this.DBFileName = DBFileName;
            this.FActived = false;
        }
        
        public void Close()
        {
            if (FActived)
                DbConnection.Close();
        }

        public void Connect()
        {
            if (FActived == true)
            {
                if (OnError != null)
                    OnError(this, DB_ALREADY_CONNECTED);
                return;
            }

            string StrConnection = "Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source="
                + DBFileName + ";";
            
            try
            {
                DbConnection = new OleDbConnection(StrConnection);
                DbConnection.Open();
                FActived = true;
                if (OnConnected != null)
                    OnConnected(this);
            }
            catch (Exception)
            {
                if (OnError != null)
                    OnError(this, DB_COULDNT_CONNECT);
            }
        }

        public string ExecSql(string Sql)
        {
            if (FActived == false)
            {
                if (OnError != null)
                    OnError(this, DB_NOT_CONNECTED);
                return null;
            }

            try
            {
                OleDbCommand Command = new OleDbCommand(Sql, DbConnection);

                OleDbDataReader RecordSet = Command.ExecuteReader();
                if (RecordSet.HasRows == true)
                {
                    RecordSet.Read();
                    string Result = RecordSet[0].ToString();
                    return Result;
                }
            }
            catch (Exception)
            {
                if (OnError != null)
                    OnError(this, DB_SQL_ERROR);
            }
            return null;
        }

        public void ExecSql(string Sql, ref ListView lvTable)
        {
            if (FActived == false)
            {
                if (OnError != null)
                    OnError(this, DB_NOT_CONNECTED);
                return;
            }

            try
            {
                OleDbCommand Command = new OleDbCommand(Sql, DbConnection);
              
                OleDbDataReader RecordSet = Command.ExecuteReader();
                if (RecordSet.HasRows == true)
                {
                    lvTable.View = View.Details;
                    lvTable.Clear();
                    for (int i = 0; i < RecordSet.FieldCount; i++)
                        lvTable.Columns.Add(RecordSet.GetName(i));

                    ListViewItem Item = null;
                    while (RecordSet.Read())
                    {
                        Item = new ListViewItem();
                        for (int i = 0; i < RecordSet.FieldCount; i++)
                        {
                            if (i == 0)
                                Item.Text = RecordSet[i].ToString();
                            else
                                Item.SubItems.Add(RecordSet[i].ToString());
                        }

                        lvTable.Items.Add(Item);
                    }
                }
            }
            catch (Exception)
            {
                if (OnError != null)
                    OnError(this, DB_SQL_ERROR);
            }
        }

        public bool Actived
        {
            get { return FActived; }
        }
        public delegate void TOnConnected(Object sender);
        public event TOnConnected OnConnected;

        public delegate void TOnError(Object sender, int ErrorCode);
        public event TOnError OnError;
    }
}


La función más importantes de la clase SqlDb es ExecSql, que tiene dos versiones. La primera devuelve un string y sólo tiene como parámetro una cadena que será la consulta SQL. Esta función está pensada para buscar un dato de una tabla. La segunda función tiene dos parámetros: la consulta SQL y un ListView que se pasa como referencia. Esta función te cargará las tablas en el ListView, con las columnas correspondientes.



En la imagen puedes ver como me quedó la Agenda. A continuación puedes descargar el programa compilado con todo el código fuente.

http://www.megaupload.com/?d=N0DUL0MZ

0 Response to "SQLServer desde C#"

Publicar un comentario