Vous êtes sur la page 1sur 12

Base de Datos I

Gua uso GestorDeBaseDeDatos (ver proyecto prac_mvc)


Gua para usar la clase gestora de la base de datos: GestorDeBaseDeDatos creada por
nosotros para implementar la idea del modelo MVC, de modo que todo lo que tenga que
ver con la capa de datos est en esta clase y no por todas partes como cuando se us la
estrategia de desarrollo drug and drop.
1. Copiar el archivo GestorDeBaseDeDatos.cs en el directorio del proyecto. El
contenido de este archivo se encuentra en el ANEXO 1 del presente documento:
2. Agregar el archivo en el proyecto desde el men: Proyecto -> Agregar Archivo
existente.
3. Aadir al proyecto una referencia al System.Configuration:
Forma1:
Explorador de soluciones -> seleccionar References -> click Botn derecho
->agregar referencia -> .NET -> seleccionar de la lista System.Configuration
Forma2:
Proyecto -> agregar referencia -> .NET -> seleccionar de la lista
System.Configuration
4. En el archivo GestorDeBaseDeDatos.cs modificar el namespace:
namespace nombreDelProyecto

En este caso el nombre del proyecto es pracMVC. Note que debe ser el mismo
namespace que aparece en el archivo Program.cs
5. Si an no existe (ver en explorador de soluciones) aadir un archivo de
configuracin de aplicacin: App.config de la siguiente manera:
Men-> proyecto-> agregar nuevo elemento -> Archivo de configuracin de
aplicacin.
Se aadir el archivo XML App.config Para qu servir esto? Para el caso en que
que se tengan muchas llamadas a la base de datos, si se define la cadena de
conexin en el cdigo, cuando querramos cambiar el servidor de la conexin, ser
un lo pues habra que sustituir cada una de las connection strings. Para evitar esto,
se crea el archivo de configuracin de la aplicacin, donde se podr agregar desde
cadenas de conexin, hasta por ejemplo, colores de algn elemento visual. El
formato del App.config est en xml, por lo que se especifican etiquetas:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<appSettings>
<add key="MyConnectionString"
value="Data Source=CORP-0C81DC295D\SQLEXPRESS;Initial
Catalog=academica;Integrated Security=True"/>
</appSettings>
</configuration>

Note que MyConnectionString es la variable que usamos en el


GestorDeBaseDeDatos para cargar la configuracin.
Tatiana Aparicio

Base de Datos I
El valor que va en value es la cadena de conexin, que se la puede obtener
entrando a la base de datos (usando el explorador de servidores) y ver en
propiedades Cadena de conexin y copiar su contenido para pegarlo despus de
value=
En este caso la base de datos se llama academica
6. Para usar el archivo de configuracin, se debe agregar una nueva referencia, al
ensamblado System.Configuration, es por eso que en nuestro archivo
GestorDeBaseDeDatos.cs se tiene:
using System.Configuration
7. Ahora podemos usar el gestor de bases de datos para nuestra aplicacin. Por
ejemplo, podemos crear un formulario que nos permita aadir un registro a la tabla
materia, para hacerlo proceder como sigue:
a) Crear el formulario frmMateria
b) Aadir cajas de texto y etiquetas con todos los atributos que deseamos
aadir a la tabla materia as como el botn registrar:

c) Doble clik en el botn registrar y aadir el siguiente cdigo:


private void btnRegistrar_Click(object sender, EventArgs e)
{
// para insertar un registro no necesitamos el dataset,
// simplemente insertamos el texto que hemos ingresado.
StringBuilder strInsert = new StringBuilder();
// para probar hacemos la consulta para ingresar slo la sigla:
// insert into materia(sigla) values('inf-102')
strInsert.AppendFormat("insert into materia(sigla) values('{0}');",
txtSigla.Text);
int cantMatsInsertadas =
GestorDeBaseDeDatos.Instance.EjecutarConsulta(strInsert.ToString());
MessageBox.Show("se ingres "+cantMatsInsertadas.ToString() +
"registro(s)", "Mensaje");
Close();

Tatiana Aparicio

Base de Datos I
Note que en caso de que se violara la regla de integridad de entidad, o hubiera una falla al
abrir la conexin de la base de datos, no se realizara con xito la operacin, pero el gestor
de bases de datos capturara esta excepcin y nos devolvera en cantMatsInsertadas el
valor 0. A continuacin se presenta el mtodo del gestor que controla esto mediante la
sentencia try-catch:
public int EjecutarConsulta(string query)
{
int registrosAfectados = 0;
try // intenta ejecutar las siguientes sentencias
{
myConnection.Open();
myCommand = new SqlCommand(query, myConnection);
registrosAfectados = myCommand.ExecuteNonQuery();
return registrosAfectados;
}
catch (Exception) // si hay un error (por que no se pudo
//abrir la conexin o porque no se pudo
//insertar por la regla de integridad de
// entidad) retorna
{
return registrosAfectados;
}
Finally //cierra la conexin
{
if (myConnection.State != ConnectionState.Closed)
myConnection.Close();
}
}

8. Crear un formulario que permita ver los diferentes registros de la tabla alumno en
un datagrid.

Para hacerlo siga los siguientes pasos:


a) Crear el formulario frmVerAlumno
b) Aadir un datagrid dgdAlumnos

Tatiana Aparicio

Base de Datos I
c) En el mtodo Load del formulario (doble clic en frmVerAlumno), cargar el
dataset y asociarlo al datagrid aadiendo el siguiente cdigo:
private void frmVerAlumnos_Load(object sender, EventArgs e)
{
dstAlumno =
GestorDeBaseDeDatos.Instance.EjecutarConsultaSelect("select * from alumno");
dgdAlumnos.ReadOnly=true;
dgdAlumnos.DataSource = dstAlumno;
dgdAlumnos.DataMember = dstAlumno.Tables[0].ToString();
}

9. Crear un formulario que nos permita ver los diferentes registros de la tabla materia
(uno cada vez), para hacerlo proceder como sigue:
a) Crear el formulario frmVerMateria
b) Aadir cajas de texto y etiquetas con todos los atributos que deseamos
recuperar de la tabla materia as como el botn Siguiente:

c) Como necesitaremos un dataset y el nmero de registro cargado en el


formulario, declarar estas variables en la clase Form:
public partial class frmVerMaterias : Form
{
// estas variables se usarn en todo el formulario por eso
// las declaro en esta seccin;
int nroRegitro = 0; //registro que se cargar al formulario
DataSet dstMaterias; //dataset donde se cargarn los datos

d) Doble clic en el botn Siguiente y aadir el siguiente cdigo:


private void btnSgte_Click(object sender, EventArgs e)
{
nroRegitro++;
int cantRegistros=dstMaterias.Tables[0].Rows.Count;
if (nroRegitro >= cantRegistros) {
MessageBox.Show("LLeg al final, volver al primero", "mensaje");
nroRegitro = 0;
}
mostrarRegistro(nroRegitro);
}

Tatiana Aparicio

Base de Datos I
e) Note que se tiene un procedimiento mostrarRegistro. Como necesitamos
hacerlo dos veces (al cargar el formulario y al presionar el botn siguiente),
es por esto que el cdigo para mostrar en el formulario un registro del
dataset se lo ha implementado en un procedimiento, que est ubicado en la
clase frmVerMaterias, inmediatamente despus del constructor:
private void mostrarRegistro(int nroReg) {
txtSigla.Text = dstMaterias.Tables[0].Rows[nroReg][0].ToString();
txtNomMat.Text = dstMaterias.Tables[0].Rows[nroReg][1].ToString();
txtArea.Text = dstMaterias.Tables[0].Rows[nroReg][2].ToString();
txtCreditos.Text=dstMaterias.Tables[0].Rows[nroReg][3].ToString();
}

f) Doble clik en el formulario y aadir el siguiente cdigo, para que al


momento de cargar el formulario se carguen los datos de la materia en el
dataset:
private void frmVerMaterias_Load(object sender, EventArgs e)
{
// carga las materias en el dataset dstMateria
dstMaterias =
GestorDeBaseDeDatos.Instance.EjecutarConsultaSelect("select
sigla,nomMat,area,creditos from materia");
mostrarRegistro(nroRegitro);
}

10. Formularios con parmetros: Aadir un formulario alumno que pida el ci de un


alumno y muestre por pantalla los datos del alumno con el carnet ingresado:
a) Crear un formulario para ingresar el ci
b) Crear un formulario (frmVerAlumno) donde se mostrarn los datos del
alumno

c) Doble clik en el botn Ver datos del Alumno e ingresar el siguiente


cdigo:
private void btnVerDatosAlumno_Click(object sender, EventArgs e)
{
int valorCarnet = Convert.ToInt16(txtCi.Text);
frmVerAlumno fVerAlumno = new frmVerAlumno(valorCarnet);
fVerAlumno.ShowDialog();
}

Tatiana Aparicio

Base de Datos I
d) Modificar el constructor del formulario frmVerAlumno, de modo que
reciba como argumento valorCi, y guardarlo en un atributo del formulario
carnet (declarado al principio de la clase):
public frmVerAlumno(int valorCi)
{
InitializeComponent();
carnet=valorCi;
}

e) Doble clik en el formulario frmVerAlumno e ingresar el siguiente cdigo:


private void frmVerAlumno_Load(object sender, EventArgs e){
string consulta="Select ci,nombre,sexo,direccion,colegio from alumno
where ci=" + carnet.ToString();
DataSet dstAlumno = new DataSet();
dstAlumno=GestorDeBaseDeDatos.Instance.EjecutarConsultaSelect(consulta);
if (dstAlumno != null){
txtCi.Text = dstAlumno.Tables[0].Rows[0][0].ToString();
txtNombre.Text = dstAlumno.Tables[0].Rows[0][1].ToString();
txtSexo.Text = dstAlumno.Tables[0].Rows[0][2].ToString();
txtDireccion.Text = dstAlumno.Tables[0].Rows[0][3].ToString();
txtColegio.Text = dstAlumno.Tables[0].Rows[0][4].ToString();
}
else{
MessageBox.Show("No existe el ci ingreado...", "ERROR");
Close(); // equivale a this.Close(), que cierra el formulario actual
}
}

11. Implementar una opcin que permita desplegar los datos de los alumnos y permita
que los datos se puedan editar de la siguiente manera:
Haciendo clic en la fila del alumno que nos interesa editar, deber aparecer un
formulario que permita realizar la edicin, y al presionar el botn registrar
cambios los datos se actualizarn y se retornar a la pantalla inicial con los datos
modificados. Asimismo que se puedan aadir o borrar alumnos. Cabe indicar que
en este ejemplo suponemos que la tabla alumno de la base de datos contiene los
atributos ci, nom y sexo:

dgdAlumno
s

frmEditarAlumnos

Tatiana Aparicio

Base de Datos I

frmIngresarUNalumno

frmEditarUNalumno

Para hacerlo realice lo siguiente:


a) Crear el formulario frmEditarAlumnos , frmEditarUNalumno y el
formulario frmIngresarUnAlumno. En el formulario frmEditarUNalumno
tenga cuidado de poner en ReadOnly el atributo txtCi (para evitar que se
pueda cambiar el valor de la clave principal, lo que podra provocar errores
de integridad).
b) Crear un objeto del tipo data set aadiendo el cdigo DatSet dstAlumno en
la clase frmEditarAlumnos:
public partial class frmEditarAlumnos : Form
{
DataSet dstAlumno;
......

c) Doble click en el formulario frmEditarAlumnos y escribir el siguiente


cdigo:
private void frmEditarAlumnos_Load(object sender, EventArgs e)
{
dstAlumno =
GestorDeBaseDeDatos.Instance.EjecutarConsultaSelect("select * from alumno");
dgdAlumnos.DataSource = dstAlumno;
dgdAlumnos.DataMember = dstAlumno.Tables[0].ToString();
}

Tatiana Aparicio

Base de Datos I
d) Para que en la tabla slo aparezcan los estudiantes que nos interesan, doble
click en el botn buscar y aadir el siguiente cdigo:
private void button1_Click(object sender, EventArgs e)
{
string sql = "select * from alumno where nom like '" + txtAlumno.Text +
"%'"; // si no funciona % use *
//string sql = "select * from alumno where nom = '" + txtAlumno.Text + "'";
dstAlumno = GestorDeBaseDeDatos.Instance.EjecutarConsultaSelect(sql);
try
{
dgdAlumnos.DataSource = dstAlumno;
dgdAlumnos.DataMember = dstAlumno.Tables[0].ToString();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message,"Error");
}
}

e) Doble clik en el botn "aadir alumno" y escribir el siguiente cdigo:


private void btnAnadir_Click(object sender, EventArgs e)
{
frmIngresarUnAlumno fIngresarUnAlumno = new frmIngresarUnAlumno();
fIngresarUnAlumno.ShowDialog();
this.Close();
this.Dispose();
}

f) En el formulario frmIngresarUnAlumno, hacer doble click en "Registrar" y


aadir el siguiente cdigo:
string sql = "insert into alumno(ci,nom,sexo)" +
"values(" + txtCi.Text +
",'" + txtNom.Text +
"','" + txtSexo.Text +
"')";
int
cantAlumsIngresados=GestorDeBaseDeDatos.Instance.EjecutarConsulta(sql);
this.Close();
this.Dispose();
frmEditarAlumnos fEditarAlumnos = new frmEditarAlumnos();
fEditarAlumnos.ShowDialog();

Note que para que los datos se actualicen en el datagrid, cerramos el


formulario y creamos el objeto frmEditarAlumnos para que el data grid se
cargue con los nuevos datos.

Tatiana Aparicio

Base de Datos I
a) Para que al seleccionar un estudiante ste se pueda editar, hacer doble clic
dentro del datagrid para implementar el mtodo cellContentClick del
datagrid y escribir el siguiente cdigo, que permitir editar el alumno
seleccionado:
private void dgdAlumnos_CellContentClick(object sender,
DataGridViewCellEventArgs e)
{
int posSel= e.RowIndex;
frmEditarUNalumno fEditarUNalumno = new
frmEditarUNalumno(dgdAlumnos,posSel,this);
fEditarUNalumno.ShowDialog();
}

Note que se crea un objeto frmEditarUNalumno, al que le mandamos los


objetos dgdAlumnos, la posicin y el formulario actual (this). Mandamos el
formulario actual para el caso en que se borre el estudiante, se cierran todos
los formularios abiertos, menos el del men principal.
g) Aadir los atributos dgdAlum, posSelec y fPadre a la clase
frmEditarUNalumno (lneas 3,4,5) y modificar el constructor aadiendo los
parmetros y las inicializaciones de los atributos aadidos (lneas
6,7,8,9,10):
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.

public partial class frmEditarUNalumno : Form


{
DataGridView dgdAlum;
int posSelec;
frmEditarAlumnos fPadre;
public frmEditarUNalumno(DataGridView vdgdAlum, int vposSelec,
frmEditarAlumnos vfPadre)
{
dgdAlum = vdgdAlum;
posSelec = vposSelec;
fPadre=vfPadre;
InitializeComponent();
}
...........

h) Cargar en el formulario frmEditarUNalumno los datos el estudiante


seleccionado: doble clik en el formulario frmEditarUNalumno y aadir el
siguiente cdigo en el mtodo Load:
private void frmEditarUNalumno_Load(object sender, EventArgs e)
{
txtCi.Text = dgdAlum.Rows[posSelec].Cells["ci"].Value.ToString();
txtNom.Text = dgdAlum.Rows[posSelec].Cells["nom"].Value.ToString();
txtSexo.Text = dgdAlum.Rows[posSelec].Cells["sexo"].Value.ToString();
}

Tatiana Aparicio

Base de Datos I

i) doble click en el botn "Registrar cambios" y escribir el siguiente cdigo:


private void btnActualizar_Click(object sender, EventArgs e)
{
int exito = 0;
string vconsulta="update alumno set nom='"+txtNom.Text+
"',sexo='"+txtSexo.Text+
"' where ci="+ txtCi.Text.Trim();
exito=GestorDeBaseDeDatos.Instance.EjecutarConsulta(vconsulta);

string mje= "Se actualizaron " + exito.ToString()+ " registros.";


MessageBox.Show(mje,"Actualizacin exitosa");
// actualizamos el datagrid del formulario anterior
dgdAlum.Rows[posSelec].Cells["nom"].Value = txtNom.Text;
dgdAlum.Rows[posSelec].Cells["sexo"].Value = txtSexo.Text;
// note que el ndice de Cells puede ser el nombre del
// campo o el nmero de campo:
//dgdAlum.Rows[posSelec].Cells[1].Value = txtNom.Text;
//dgdAlum.Rows[posSelec].Cells[2].Value = txtSexo.Text;
Close();

j) Doble click en borrar registro y escribir el siguiente cdigo:


private void btnBorrar_Click(object sender, EventArgs e)
{
DialogResult resp;
resp= MessageBox.Show("Est Ud. seguro de querer borrar el registro?",
"Confirmacin");
if (resp.ToString()=="OK")
{
int exito;
string vconsulta="delete from alumno where ci="+txtCi.Text;
exito=GestorDeBaseDeDatos.Instance.EjecutarConsulta(vconsulta);
string mje="Se borr "+exito+" registros";
MessageBox.Show(mje, "Eliminacin exitosa");
// falta actualizar el datagrid
this.Close();
fPadre.Close();
}
}

Note que en las ltimas dos lneas de cdigo cerramos los dos formularios
abiertos (el actual y el padre) y volvemos al men principal.

12. Idem al anterior, pero que el ci sea obtenido despus de seleccionar el nombre de
un estudiante en un combo box
13. Idem al anterior pero que adems muestre sus notas.
14. Permitir modificar los datos de un alumno.

Tatiana Aparicio
10

Base de Datos I
ANEXO 1: archivo GestorDeBaseDeDatos.cs:
using
using
using
using
using
using
using
using

System;
System.Collections.Specialized;
System.Collections.Generic;
System.Linq;
System.Text;
System.Data.SqlClient;
System.Data;
System.Configuration; // para usar el archivo XML App.config
// donde hemos guardado la cadena de conexin
using System.Windows.Forms;
namespace pracMVC
{
public class GestorDeBaseDeDatos
{
private static GestorDeBaseDeDatos instance = null;
private string myConnectionString;
private SqlConnection myConnection;
private SqlCommand mySelectCommand;
private SqlCommand myCommand;
private SqlDataAdapter myDataAdapter;
public SqlConnection MyConnection
{
get { return myConnection; }
}
public string MyConnectionString
{
get { return myConnectionString; }
set { myConnectionString = value; }
}
public GestorDeBaseDeDatos()
{
myConnectionString =
ConfigurationManager.AppSettings.Get("MyConnectionString");
myConnection = new SqlConnection(myConnectionString);
}
public static GestorDeBaseDeDatos Instance
{
get
{
if (instance == null)
instance = new GestorDeBaseDeDatos();
return instance;
}
}
public DataSet EjecutarConsultaSelect(string selectQuery)
{
DataSet myDataSet = new DataSet();
try
{
myConnection.Open();
mySelectCommand = new SqlCommand(selectQuery, myConnection);
myDataAdapter = new SqlDataAdapter();
myDataAdapter.SelectCommand = mySelectCommand;
myDataAdapter.Fill(myDataSet);
if (myDataSet != null)
{
if (myDataSet.Tables.Count != 0)
{

Tatiana Aparicio
11

Base de Datos I
if (myDataSet.Tables[0].Rows.Count != 0)
{
return myDataSet;
}
else
{
return null;
}
}
else
{
return null;
}
}
else
{
return myDataSet;
}
}
catch (Exception)
{
return null;
}
finally
{
if (myConnection.State != ConnectionState.Closed)
myConnection.Close();
}
}
public int EjecutarConsulta(string query)
{
int registrosAfectados = 0;
try
{
myConnection.Open();
myCommand = new SqlCommand(query, myConnection);
registrosAfectados = myCommand.ExecuteNonQuery();
return registrosAfectados;
}
catch (Exception)
{
return registrosAfectados;
}
finally
{
if (myConnection.State != ConnectionState.Closed)
myConnection.Close();
}
}
}
}

Tatiana Aparicio
12

Vous aimerez peut-être aussi