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".
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