SlideShare una empresa de Scribd logo
1 de 17
Descargar para leer sin conexión
Conexión a la base de datos desde 
Visual Studio y la arquitectura 
Modelo Vista Controlador (MVC) 
En esta práctica, estudiaremos como realizar la conexión a la base de datos desde una 
aplicación en C#. Después usando lo aprendido, crearemos una pequeña aplicación que 
interactúe con la base de datos usando un patrón arquitectónico llamado Modelo Vista 
Controlador. 
Antes de todo: 
Primeramente, debemos tener una base de datos donde trabajar. Para esto, inicie el SQL 
Managment Studio. 
Abra el script proporcionado, y ejecútelo, al final debería tener una base de datos equivalente 
a esta:
Conexión a la base de datos desde C# 
Ahora intentaremos realizar la conexión desde una aplicación en C# a la base de datos, para 
esto, usaremos una tecnología de la plataforma .NET, llamada ADO.NET, que significa ActiveX 
Data Object, para usar la tecnología y conectarse a la base de datos realice los siguientes 
pasos: 
1. Ingrese a Visual Studio 
2. Cree un proyecto en Consola para C# 
3. Dentro del método Main introduzca el siguiente código: 
static void Main(string[] args) 
{ 
string connectionString = "server=.SQLEXPRESS;" + 
4. Antes de ejecutar el código, observe la cadena de conexión. La cadena de conexión es 
un equivalente a la URL. En esta cadena uno debe indicar donde esta el servidor de la 
base de datos, y el nombre de la base de datos a acceder. Dependiendo como es la 
instalación de su servidor, la cadena de conexión puede variar. En el campo “server”, 
puede venir los siguientes ejemplos 
a. .SLQEXPRESS 
"integrated security=SSPI;" + 
"database=Universidad"; 
string sql = "SELECT TOP 10 nombre, apellido FROM Alumno"; 
SqlConnection conn = new SqlConnection(connectionString); 
conn.Open(); 
SqlCommand command = new SqlCommand(sql, conn); 
SqlDataReader reader = command.ExecuteReader(); 
while (reader.Read()) 
{ 
Console.WriteLine("{0}tt{1}", reader[0], reader[1]); 
} 
conn.Close(); 
}
b. .MSSQLSERVER 
c. Nompre-PCSQLEXPRESS 
d. .NombreInstancia 
5. En el campo database debe estar el nombre de la base de datos a acceder. 
6. Edite la cadena de conexión dependiendo como se acopla a su caso. 
7. Ejecute el programa. 
Responda las siguientes preguntas 
1. Que hace el programa? 
2. Que cree que hace el objeto SqlConnection? 
3. Que cree que hace el objeto SqlCommand? 
4. Que cree que hace el objeto SqlDataReader? 
Arquitectura Modelo Vista Controlador 
En el desarrollo de software existen los patrones arquitectónicos, modelos de diseño de 
software que permiten organizar mejor las clases y objetos de tal manera de crear programas 
con un buen diseño orientado a objetos. Uno de estos patrones se denomina el patrón 
Modelo Vista Controlador (MVC). Este patrón es usado bastante en el mundo del desarrollo de 
software. Muchos frameworks en varios lenguajes fueron desarrollados siguiendo esta 
arquitectura. Ejemplos de esto son: 
· ASP.NET MVC 
· Ruby on Rails 
· Java Server Faces 
La idea de esta arquitectura, es separar las responsabilidades de las clases y dividirlos en 
capas. Existe un objeto llamado el modelo. Que se ocupa de mantener la lógica de validación y 
que los objetos en el programa se mantengan en un estado consciente. Como parte del 
modelo, existe el manejo de los datos. Y como guardarlos por ejemplo en una base de datos, o 
en un archivo, dependiendo los requerimientos del sistema. 
Después del modelo. Tenemos las vistas. Estos objetos pertenecientes a la vista se ocupan de 
mostrar los datos de alguna manera al usuario. La idea de la arquitectura Modelo Vista 
Controlador es que fácilmente podamos cambiar las vistas. Por ejemplo de tener una vista que 
esta en Windows Forms, a una vista manejado como sistema web en ASP.NET o en consola. 
Al final existe una clase, llamada Controlador, que es la que se encarga de comunicar a la Vista 
con el Modelo. Este se encarga de mandar mensajes al modelo para que se actualice y los 
resultados mandarlos a la Vista, para que el usuario puede ver los resultados. 
En esa clase, se mostrara una implementación básica de la arquitectura Modelo Vista 
Controlador. 
Empecemos a implementar. 
Antes de todo, se supone que dentro de su servidor SQLServer ya ejecuto el script 
proporcionado y tiene una base de datos llamada Universidad.
1. Cree un proyecto de Windows Forms 
2. Dentro de este proyecto cree las siguientes carpetas 
a. Model 
b. View 
c. Controller 
d. Database 
3. Dentro de la carpeta Model cree una clase llamada Student, y una clase llamada 
ModelException 
4. En la clase ModelException introduzca el siguiente código: 
public class ModelException : Exception 
{ 
public ModelException(string msg) 
: base(msg) {} 
}
5. En la clase Student introduzca el siguiente código: 
public class Student 
{ 
private int ci; 
private string firstName; 
private string lastName; 
private DateTime birthday; 
private int cellphone; 
public Student() 
{ 
ci = 0; 
firstName = ""; 
lastName = ""; 
birthday = DateTime.Now; 
cellphone = 71234567; 
} 
public int CI { 
get 
{ 
return ci; 
} 
set 
{ 
if (value < 100000) 
throw new ModelException("El CI no es válido"); 
ci = value; 
} 
} 
public string FirstName 
{ 
get 
{ 
return firstName; 
} 
set 
{
if (String.IsNullOrEmpty(value)) 
throw new ModelException("El nombre no puede estar vacio"); 
if (value.Length > 30) 
throw new ModelException("El nombre no puede tener mas de 30 
carácteres"); 
firstName = value; 
} 
} 
public string LastName 
{ 
get 
{ 
return lastName; 
} 
set 
{ 
if (String.IsNullOrEmpty(value)) 
throw new ModelException("El apellido no puede estar 
vacio"); 
if (value.Length > 30) 
throw new ModelException("El apellido no puede tener mas de 
30 carácteres"); 
lastName = value; 
} 
} 
public DateTime Birthday 
{ 
get 
{ 
return birthday; 
} 
set 
{ 
if (value > DateTime.Now) 
throw new ModelException("La fecha de nacimiento aun no 
pasó!!"); 
birthday = value; 
} 
} 
public int CellPhone 
{ 
get 
{ 
return cellphone; 
} 
set 
{ 
if (value < 60000000 || value > 80000000) 
throw new ModelException("Celular no valido"); 
cellphone = value; 
} 
} 
}
6. Antes de seguir. Revise y estudie el código y responda las siguientes preguntas: 
a. Que representa la clase Student? 
b. Que se hace en las funciones set/get de la clase? 
c. Como se reporta errores en el modelo? 
7. Dentro de la carpeta cree una clase llamada ConnectionManager. La responsabilidad 
de esta clase será la encargada de mantener la cadena de conexión, Conectarse a la 
base de datos y dar una manera de ejecutar comandos SQL a las otras clases. La clase 
es como sigue: 
public class ConnectionManager : IDisposable 
{ 
private string connectionString = "server=.SQLEXPRESS;" + 
8. Antes de continuar, responda, los objetos usados en esta clase le parecen familiar? 
9. Cree una clase DatabaseException. El código de la clase sigue asi: 
public class DatabaseException : Exception 
{ 
public DatabaseException(string message) : 
base(message) { } 
} 
10. Cree una clase dentro de la carpeta Database llamada StudentsDatabase, el código de 
la clase es como sigue: 
"integrated security=SSPI;" + 
"database=Universidad"; 
private SqlConnection connection; 
public ConnectionManager() 
{ 
connection = new SqlConnection(connectionString); 
connection.Open(); 
} 
public SqlCommand GetCommand(string sql) 
{ 
return new SqlCommand(sql, connection); 
} 
public void Dispose() 
{ 
connection.Close(); 
connection.Dispose(); 
}
public class StudentsDatabase : IDisposable 
{ 
private ConnectionManager connection; 
public StudentsDatabase() 
{ 
connection = new ConnectionManager(); 
} 
public Student GetUserByCI(int CI) 
{ 
try 
{ 
String sql = "SELECT * FROM Alumno WHERE CI = @CI"; 
SqlCommand command = connection.GetCommand(sql); 
command.Parameters.AddWithValue("@CI", CI); 
SqlDataReader reader = command.ExecuteReader(); 
if (reader.HasRows) 
{ 
reader.Read(); 
Student student = new Student 
{ 
CI = Convert.ToInt32(reader[0]), 
FirstName = Convert.ToString(reader[1]), 
LastName = Convert.ToString(reader[2]), 
Birthday = Convert.ToDateTime(reader[3]), 
CellPhone = Convert.ToInt32(reader[4]) 
}; 
reader.Close(); 
return student; 
} 
reader.Close(); 
} 
catch (Exception exception) 
{ 
throw new DatabaseException("Error en la base de datos: " + 
exception.Message); 
} 
return null; 
} 
public void CreateNewStudent(Student student) 
{ 
try 
{ 
String sql = "INSERT INTO Alumno (CI, nombre, apellido, fechanac, 
celular) " + 
"VALUES (@CI, @firstname, @lastname, @birthday, 
@cellphone)"; 
SqlCommand command = connection.GetCommand(sql); 
command.Parameters.AddWithValue("@CI", student.CI); 
command.Parameters.AddWithValue("@firstname", student.FirstName); 
command.Parameters.AddWithValue("@lastname", student.LastName); 
command.Parameters.AddWithValue("@birthday", student.Birthday); 
command.Parameters.AddWithValue("@cellphone", student.CellPhone);
int rows = command.ExecuteNonQuery(); 
if (rows == 0) 
throw new DatabaseException("Error en la base de datos"); 
} 
catch (Exception exception) 
{ 
throw new DatabaseException("Error en la base de datos: " + 
exception.Message); 
} 
} 
public void UpdateStudent(Student student) 
{ 
try 
{ 
String sql = "UPDATE Alumno SET" + 
"nombre = @firstname, " + 
"apellido = @lastname, " + 
"fechanac = @fechanac, " + 
"celular = @cellphone " + 
"WHERE CI = @CI"; 
SqlCommand command = connection.GetCommand(sql); 
command.Parameters.AddWithValue("@CI", student.CI); 
command.Parameters.AddWithValue("@firstname", student.FirstName); 
command.Parameters.AddWithValue("@lastname", student.LastName); 
command.Parameters.AddWithValue("@birthday", student.Birthday); 
command.Parameters.AddWithValue("@cellphone", student.CellPhone); 
int rows = command.ExecuteNonQuery(); 
if (rows == 0) 
throw new DatabaseException("Error en la base de datos"); 
} 
catch (Exception exception) 
{ 
throw new DatabaseException("Error en la base de datos: " + 
exception.Message); 
} 
} 
public void DeleteStudentByCI(int CI) 
{ 
try 
{ 
String sql = "DELETE FROM Alumno " + 
"WHERE CI = @CI"; 
SqlCommand command = connection.GetCommand(sql); 
command.Parameters.AddWithValue("@CI", CI); 
int rows = command.ExecuteNonQuery(); 
if (rows == 0) 
throw new DatabaseException("Error en la base de datos"); 
} 
catch (Exception exception) 
{ 
throw new DatabaseException("Error en la base de datos: " + 
exception.Message); 
} 
}
public List<Student> GetAllStudents() 
{ 
List<Student> students = new List<Student>(); 
try 
{ 
String sql = "SELECT * FROM Alumno"; 
SqlCommand command = connection.GetCommand(sql); 
SqlDataReader reader = command.ExecuteReader(); 
while(reader.Read()) 
{ 
11. Deténgase en esta clase, analice el código y responda las siguientes preguntas: 
a. Que responsabilidades tiene esta clase? 
b. Que hace cada método de la clase? 
c. Como se ejecutan las sentencias SQL? 
d. Como se reportan errores de la base de datos al programa? 
e. Como se busca un objeto en la base de datos? 
f. Como se inserta un nuevo objeto en la base de datos? 
g. Como se elimina un objeto en la base de datos? 
h. Como se edita un objeto en la base de datos? 
i. Investigue un poco mas acerca de las sentencias SQL preparadas. Que ventajas 
tiene usar este tipo de sentencias? Ve alguna sentencia SQL Preparada en esta 
clase? 
12. En la carpeta View cree una carpeta llamada Student, dentro de este cree los 
siguientes formularios: 
Student student = new Student 
{ 
CI = Convert.ToInt32(reader[0]), 
FirstName = Convert.ToString(reader[1]), 
LastName = Convert.ToString(reader[2]), 
Birthday = Convert.ToDateTime(reader[3]), 
CellPhone = Convert.ToInt32(reader[4]) 
}; 
students.Add(student); 
} 
} 
catch (Exception exception) 
{ 
throw new DatabaseException("Error en la base de datos: " + 
exception.Message); 
} 
return students; 
} 
public void Dispose() 
{ 
connection.Dispose(); 
} 
}
a. StudentMenu: 
b. RegisterStudentForm
c. ShowStudentForm 
d. EditStudentForm 
13. En los formularios de, Editar Alumno, Buscar Alumno y Registrar Alumno cree los 
siguientes métodos (Cambie el nombre de los objetos dependiendo como usted llamo 
a sus controles al crear los formularios):
public (Nombre_Constructor)(StudentController theController) 
{ 
InitializeComponent(); 
controller = theController; 
} 
public String CI 
{ 
get 
{ 
return ciTextBox.Text; 
} 
set 
{ 
ciTextBox.Text = value; 
} 
} 
public String FirstName 
{ 
get 
{ 
return firstNameTextBox.Text; 
} 
set 
{ 
firstNameTextBox.Text = value; 
} 
} 
public String LastName 
{ 
get 
{ 
return lastNameTextBox.Text; 
} 
set 
{ 
lastNameTextBox.Text = value; 
} 
} 
public String BirthDay 
{ 
get 
{ 
return birthdayDate.Text; 
} 
set 
{ 
birthdayDate.Text = value; 
} 
}
public String Cellphone 
14. Cree una clase dentro de la carpeta Controller una clase llamada StudentController, el 
código de la clase es como sigue: 
public class StudentController : IDisposable 
{ 
private StudentMenu studentMenu; 
private StudentsDatabase model; 
public StudentController(StudentMenu menu) 
{ 
studentMenu = menu; 
model = new StudentsDatabase(); 
} 
public void ShowRegisterStudent() 
{ 
studentMenu.Hide(); 
RegisterStudentForm register = new RegisterStudentForm(this); 
register.Show(); 
} 
public void RegisterStudent(RegisterStudentForm registerForm) 
{ 
try 
{ 
Student student = new Student(); 
student.CI = Convert.ToInt32(registerForm.CI); 
student.FirstName = registerForm.FirstName; 
student.LastName = registerForm.LastName; 
student.Birthday = Convert.ToDateTime(registerForm.BirthDay); 
student.CellPhone = Convert.ToInt32(registerForm.Cellphone); 
if (model.GetUserByCI(student.CI) != null) 
{ 
throw new Exception("El Estudiante ya ha sido registrado"); 
} 
{ 
get 
{ 
return cellphoneTextBox.Text; 
} 
set 
{ 
cellphoneTextBox.Text = value; 
} 
} 
public void ShowError(String message) 
{ 
MessageBox.Show(message, "Error", MessageBoxButtons.OK, 
MessageBoxIcon.Error); 
}
model.CreateNewStudent(student); 
registerForm.Hide(); 
registerForm.Dispose(); 
studentMenu.Show(); 
} 
catch (Exception ex) 
{ 
registerForm.ShowError(ex.Message); 
} 
} 
public void Dispose() 
{ 
model.Dispose(); 
} 
} 
15. Dentro del formulario StudentMenu, edite el código e introduzca el siguiente código: 
private StudentController controller; 
private PrincipalMenu principal; 
public StudentMenu(PrincipalMenu principalMenu) 
{ 
InitializeComponent(); 
controller = new StudentController(this); 
principal = principalMenu; 
} 
16. Haga doble click en el botón Registrar Alumno, en el evento generado introduzca el 
siguiente código: 
controller.ShowRegisterStudent(); 
17. En el formulario de Registrar Alumno, en el botón registrar, haga doble click, ejecute el 
siguiente código: 
controller.RegisterStudent(this);
18. En el formulario creado por defecto en el proyecto, renómbrelo por PrincipalMenu, 
coloque controles, este se tiene que ver de la siguiente manera: 
19. Haga doble click en el botón Alumnos, introduzca el siguiente código: 
StudentMenu menu = new StudentMenu(this); 
menu.Show(); 
Hide(); 
20. Haga doble click en el botón Salir, introduzca el siguiente código: 
Application.Exit(); 
21. En el formulario StudentMenu, haga doble click en el botón Volver e introduzca el 
siguiente código: 
principal.Show(); 
Hide(); 
controller.Dispose(); 
Dispose(); 
22. Ejecute el programa 
23. Responda las siguientes preguntas: 
a. Que hace el controlador? 
b. Que hacen las vistas? 
c. Que ventajas ve usted al separar las responsabilidades en distintas clases? 
d. Que desventajas ve usted al separar las responsabilidades en distintas clases? 
e. Cual es el objetivo de crear métodos set/get en las vistas? 
f. Donde se muestran los errores reportados por todas las clases creadas? 
24. Pruebe el programa 
25. Intente completar el “modulo” de Alumnos, implementando el buscar, editar y 
eliminar. Las vistas ya están creadas, El modelo ya esta listo, complete el controlador y 
los eventos necesarios de las vistas. 
26. Intente implementar el “modulo” Materias.
Entrega 
La práctica debe ser entregada de la siguiente manera: 
El código completo de la practica, un archivo en Word con las respuestas de las preguntas de la 
practica, propiamente nombradas, en un archivo comprimido de la siguiente manera: 
PracticaV-(nombrecompleto).rar 
El archivo comprimido enviarlo al correo inf151ucb@gmail.com con el asunto PrácticaIX- 
(nombre completo). Entregar el trabajo hasta las 23:59 del día 4 de noviembre del año 2013. 
* Si se detecta copia, el trabajo será anulado para el que copió y el que hizo copiar. 
* Este trabajo será evaluado como parte de la evaluación continua

Más contenido relacionado

La actualidad más candente

C# conexión sql server2012-visualstudio2012-mantenimientos
C#   conexión sql server2012-visualstudio2012-mantenimientosC#   conexión sql server2012-visualstudio2012-mantenimientos
C# conexión sql server2012-visualstudio2012-mantenimientosJomar Burgos Palacios
 
Unidad 9. acceso a base de datos desde java
Unidad 9. acceso a base de datos desde javaUnidad 9. acceso a base de datos desde java
Unidad 9. acceso a base de datos desde javadevsco63
 
Introducción a Java Persistence API
Introducción a Java Persistence APIIntroducción a Java Persistence API
Introducción a Java Persistence APIJose Martinez
 
Manual poo-unidad-visual-basic
Manual poo-unidad-visual-basicManual poo-unidad-visual-basic
Manual poo-unidad-visual-basicRaul Hernandez
 
Ser vlet conectar con base de datos
Ser vlet conectar con base de datosSer vlet conectar con base de datos
Ser vlet conectar con base de datosDavid
 
Cesnavarra 2009-boletín 1
Cesnavarra 2009-boletín 1Cesnavarra 2009-boletín 1
Cesnavarra 2009-boletín 1Cein
 
Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)Ronald Cuello
 
Toturial aplicacion base de datos jsp
Toturial aplicacion base de datos jspToturial aplicacion base de datos jsp
Toturial aplicacion base de datos jspGabriela Vazquez
 
CONEXION VISUAL STUDIO.NET - SQL SERVER
CONEXION VISUAL STUDIO.NET - SQL SERVERCONEXION VISUAL STUDIO.NET - SQL SERVER
CONEXION VISUAL STUDIO.NET - SQL SERVERDarwin Durand
 
Tutorial 1 android
Tutorial 1 androidTutorial 1 android
Tutorial 1 androidlibidinosa
 
Manual Netbeans Bases Datos2
Manual Netbeans Bases Datos2Manual Netbeans Bases Datos2
Manual Netbeans Bases Datos2mtemarialuisa
 
Taller: Prueba Unitaria con JUnit en NetBeans
Taller: Prueba Unitaria con JUnit en NetBeansTaller: Prueba Unitaria con JUnit en NetBeans
Taller: Prueba Unitaria con JUnit en NetBeansEmerson Garay
 
instalacion y conexion a base de datos postgrest /java
instalacion y conexion a base de datos postgrest /javainstalacion y conexion a base de datos postgrest /java
instalacion y conexion a base de datos postgrest /javaNey Rogger Miranda
 
Manual Swing-Java-PostgreSQL
Manual Swing-Java-PostgreSQLManual Swing-Java-PostgreSQL
Manual Swing-Java-PostgreSQLpablo
 

La actualidad más candente (19)

C# conexión sql server2012-visualstudio2012-mantenimientos
C#   conexión sql server2012-visualstudio2012-mantenimientosC#   conexión sql server2012-visualstudio2012-mantenimientos
C# conexión sql server2012-visualstudio2012-mantenimientos
 
Unidad 9. acceso a base de datos desde java
Unidad 9. acceso a base de datos desde javaUnidad 9. acceso a base de datos desde java
Unidad 9. acceso a base de datos desde java
 
Introducción a Java Persistence API
Introducción a Java Persistence APIIntroducción a Java Persistence API
Introducción a Java Persistence API
 
Manual poo-unidad-visual-basic
Manual poo-unidad-visual-basicManual poo-unidad-visual-basic
Manual poo-unidad-visual-basic
 
Ser vlet conectar con base de datos
Ser vlet conectar con base de datosSer vlet conectar con base de datos
Ser vlet conectar con base de datos
 
Cesnavarra 2009-boletín 1
Cesnavarra 2009-boletín 1Cesnavarra 2009-boletín 1
Cesnavarra 2009-boletín 1
 
Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)
 
Toturial aplicacion base de datos jsp
Toturial aplicacion base de datos jspToturial aplicacion base de datos jsp
Toturial aplicacion base de datos jsp
 
JPA en Netbeans
JPA en NetbeansJPA en Netbeans
JPA en Netbeans
 
CONEXION VISUAL STUDIO.NET - SQL SERVER
CONEXION VISUAL STUDIO.NET - SQL SERVERCONEXION VISUAL STUDIO.NET - SQL SERVER
CONEXION VISUAL STUDIO.NET - SQL SERVER
 
Tutorial 1 android
Tutorial 1 androidTutorial 1 android
Tutorial 1 android
 
Manual Netbeans Bases Datos2
Manual Netbeans Bases Datos2Manual Netbeans Bases Datos2
Manual Netbeans Bases Datos2
 
Taller: Prueba Unitaria con JUnit en NetBeans
Taller: Prueba Unitaria con JUnit en NetBeansTaller: Prueba Unitaria con JUnit en NetBeans
Taller: Prueba Unitaria con JUnit en NetBeans
 
Guía herramientas de BD PHP
Guía herramientas de BD PHPGuía herramientas de BD PHP
Guía herramientas de BD PHP
 
instalacion y conexion a base de datos postgrest /java
instalacion y conexion a base de datos postgrest /javainstalacion y conexion a base de datos postgrest /java
instalacion y conexion a base de datos postgrest /java
 
Manual Swing-Java-PostgreSQL
Manual Swing-Java-PostgreSQLManual Swing-Java-PostgreSQL
Manual Swing-Java-PostgreSQL
 
Guia7 java
Guia7 javaGuia7 java
Guia7 java
 
Espacio de nombres System.Data.SQLClient
Espacio de nombres System.Data.SQLClientEspacio de nombres System.Data.SQLClient
Espacio de nombres System.Data.SQLClient
 
Hack x crack_sq_linjection
Hack x crack_sq_linjectionHack x crack_sq_linjection
Hack x crack_sq_linjection
 

Similar a Practica9 bases de datos

Tema 9 aplicaciones de dos capas por gio
Tema 9   aplicaciones de dos capas por gioTema 9   aplicaciones de dos capas por gio
Tema 9 aplicaciones de dos capas por gioRobert Wolf
 
Taller desarrollando sitios web multiplataforma
Taller desarrollando sitios web multiplataformaTaller desarrollando sitios web multiplataforma
Taller desarrollando sitios web multiplataformaLuis Beltran
 
Tema 15 aplicaciones de dos capas por gio
Tema 15   aplicaciones de dos capas por gioTema 15   aplicaciones de dos capas por gio
Tema 15 aplicaciones de dos capas por gioRobert Wolf
 
Instalación del conector de MySQL para Visual Studio
Instalación del conector de MySQL para Visual StudioInstalación del conector de MySQL para Visual Studio
Instalación del conector de MySQL para Visual StudioYoshuaZea
 
Ejercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docxEjercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docxssuser2e6b96
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datosJhiZzelh T Cz
 
la mejor forma de Conectar c# con mysql con archivos de configuracion
 la mejor forma de Conectar c# con mysql con archivos de configuracion  la mejor forma de Conectar c# con mysql con archivos de configuracion
la mejor forma de Conectar c# con mysql con archivos de configuracion juandavid1118
 
Dprn3 u3 a1_roog Actividad 1: Mysql.Data.MySqlClient
Dprn3 u3 a1_roog  Actividad 1: Mysql.Data.MySqlClientDprn3 u3 a1_roog  Actividad 1: Mysql.Data.MySqlClient
Dprn3 u3 a1_roog Actividad 1: Mysql.Data.MySqlClientrodrigo ornelas
 
Espacio de nombres system.data.sql client
Espacio de nombres system.data.sql clientEspacio de nombres system.data.sql client
Espacio de nombres system.data.sql clientLIZBETH LIZANA CARRASCO
 
Año del buen servicio al cuidadano
Año del buen servicio al cuidadanoAño del buen servicio al cuidadano
Año del buen servicio al cuidadanoSILVA19_PAMELA
 
Visual para principiantes
Visual para principiantesVisual para principiantes
Visual para principiantesAlberto Rojas
 

Similar a Practica9 bases de datos (20)

Tema 9 aplicaciones de dos capas por gio
Tema 9   aplicaciones de dos capas por gioTema 9   aplicaciones de dos capas por gio
Tema 9 aplicaciones de dos capas por gio
 
Taller desarrollando sitios web multiplataforma
Taller desarrollando sitios web multiplataformaTaller desarrollando sitios web multiplataforma
Taller desarrollando sitios web multiplataforma
 
Connection
ConnectionConnection
Connection
 
Tema 15 aplicaciones de dos capas por gio
Tema 15   aplicaciones de dos capas por gioTema 15   aplicaciones de dos capas por gio
Tema 15 aplicaciones de dos capas por gio
 
Dprn3 u3 a1_osfm
Dprn3 u3 a1_osfmDprn3 u3 a1_osfm
Dprn3 u3 a1_osfm
 
Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3
 
DAM-S7.pptx
DAM-S7.pptxDAM-S7.pptx
DAM-S7.pptx
 
Instalación del conector de MySQL para Visual Studio
Instalación del conector de MySQL para Visual StudioInstalación del conector de MySQL para Visual Studio
Instalación del conector de MySQL para Visual Studio
 
Ejercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docxEjercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docx
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
Block
BlockBlock
Block
 
la mejor forma de Conectar c# con mysql con archivos de configuracion
 la mejor forma de Conectar c# con mysql con archivos de configuracion  la mejor forma de Conectar c# con mysql con archivos de configuracion
la mejor forma de Conectar c# con mysql con archivos de configuracion
 
Dprn3 u3 a1_eeul
Dprn3 u3 a1_eeulDprn3 u3 a1_eeul
Dprn3 u3 a1_eeul
 
Dprn3 u3 a1_roog Actividad 1: Mysql.Data.MySqlClient
Dprn3 u3 a1_roog  Actividad 1: Mysql.Data.MySqlClientDprn3 u3 a1_roog  Actividad 1: Mysql.Data.MySqlClient
Dprn3 u3 a1_roog Actividad 1: Mysql.Data.MySqlClient
 
Espacio de nombres system.data.sql client
Espacio de nombres system.data.sql clientEspacio de nombres system.data.sql client
Espacio de nombres system.data.sql client
 
Conexión de Base de Datos
Conexión de Base de DatosConexión de Base de Datos
Conexión de Base de Datos
 
Dprn3 u3 a1_rahv
Dprn3 u3 a1_rahvDprn3 u3 a1_rahv
Dprn3 u3 a1_rahv
 
My Sql A C#
My Sql A C#My Sql A C#
My Sql A C#
 
Año del buen servicio al cuidadano
Año del buen servicio al cuidadanoAño del buen servicio al cuidadano
Año del buen servicio al cuidadano
 
Visual para principiantes
Visual para principiantesVisual para principiantes
Visual para principiantes
 

Último

Diagrama de flujo metalurgia del cobre..pptx
Diagrama de flujo metalurgia del cobre..pptxDiagrama de flujo metalurgia del cobre..pptx
Diagrama de flujo metalurgia del cobre..pptxHarryArmandoLazaroBa
 
produccion de cerdos. 2024 abril 20..pptx
produccion de cerdos. 2024 abril 20..pptxproduccion de cerdos. 2024 abril 20..pptx
produccion de cerdos. 2024 abril 20..pptxEtse9
 
Fe_C_Tratamientos termicos_uap _3_.ppt
Fe_C_Tratamientos termicos_uap   _3_.pptFe_C_Tratamientos termicos_uap   _3_.ppt
Fe_C_Tratamientos termicos_uap _3_.pptVitobailon
 
Espontaneidad de las reacciones y procesos espontáneos
Espontaneidad de las reacciones y procesos espontáneosEspontaneidad de las reacciones y procesos espontáneos
Espontaneidad de las reacciones y procesos espontáneosOscarGonzalez231938
 
Tarea de UTP matematices y soluciones ingenieria
Tarea de UTP matematices y soluciones ingenieriaTarea de UTP matematices y soluciones ingenieria
Tarea de UTP matematices y soluciones ingenieriaSebastianQP1
 
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023ANDECE
 
Simbología de Soldadura, interpretacion y aplicacion en dibujo tecnico indus...
Simbología de Soldadura,  interpretacion y aplicacion en dibujo tecnico indus...Simbología de Soldadura,  interpretacion y aplicacion en dibujo tecnico indus...
Simbología de Soldadura, interpretacion y aplicacion en dibujo tecnico indus...esandoval7
 
trabajos en altura 2024, sistemas de contencion anticaidas
trabajos en altura 2024, sistemas de contencion anticaidastrabajos en altura 2024, sistemas de contencion anticaidas
trabajos en altura 2024, sistemas de contencion anticaidasNelsonQuispeQuispitu
 
Historia de la Arquitectura II, 1era actividad..pdf
Historia de la Arquitectura II, 1era actividad..pdfHistoria de la Arquitectura II, 1era actividad..pdf
Historia de la Arquitectura II, 1era actividad..pdfIsbelRodrguez
 
Sistema de Base de Datos (Rubén Alberto)
Sistema de Base de Datos (Rubén Alberto)Sistema de Base de Datos (Rubén Alberto)
Sistema de Base de Datos (Rubén Alberto)mendezruben1901
 
3.3 Tipos de conexiones en los transformadores trifasicos.pdf
3.3 Tipos de conexiones en los transformadores trifasicos.pdf3.3 Tipos de conexiones en los transformadores trifasicos.pdf
3.3 Tipos de conexiones en los transformadores trifasicos.pdfRicardoRomeroUrbano
 
CFRD simplified sequence for Mazar Hydroelectric Project
CFRD simplified sequence for Mazar Hydroelectric ProjectCFRD simplified sequence for Mazar Hydroelectric Project
CFRD simplified sequence for Mazar Hydroelectric ProjectCarlos Delgado
 
QUIMICA ORGANICA I ENOLES Y ENAMINAS LIBR
QUIMICA ORGANICA I ENOLES Y ENAMINAS LIBRQUIMICA ORGANICA I ENOLES Y ENAMINAS LIBR
QUIMICA ORGANICA I ENOLES Y ENAMINAS LIBRyanimarca23
 
S454444444444444444_CONTROL_SET_A_GEOMN1204.pdf
S454444444444444444_CONTROL_SET_A_GEOMN1204.pdfS454444444444444444_CONTROL_SET_A_GEOMN1204.pdf
S454444444444444444_CONTROL_SET_A_GEOMN1204.pdffredyflores58
 
Sistema de Gestión de Freelancers (Base de Datos)
Sistema de Gestión de Freelancers (Base de Datos)Sistema de Gestión de Freelancers (Base de Datos)
Sistema de Gestión de Freelancers (Base de Datos)dianamateo1513
 
MEC. FLUIDOS - Análisis Diferencial del Movimiento de un Fluido -GRUPO5 sergi...
MEC. FLUIDOS - Análisis Diferencial del Movimiento de un Fluido -GRUPO5 sergi...MEC. FLUIDOS - Análisis Diferencial del Movimiento de un Fluido -GRUPO5 sergi...
MEC. FLUIDOS - Análisis Diferencial del Movimiento de un Fluido -GRUPO5 sergi...Arquitecto Alejandro Gomez cornejo muñoz
 
5.1 MATERIAL COMPLEMENTARIO Sesión 02.pptx
5.1 MATERIAL COMPLEMENTARIO Sesión 02.pptx5.1 MATERIAL COMPLEMENTARIO Sesión 02.pptx
5.1 MATERIAL COMPLEMENTARIO Sesión 02.pptxNayeliZarzosa1
 
Revista estudiantil, trabajo final Materia ingeniería de Proyectos
Revista estudiantil, trabajo final Materia ingeniería de ProyectosRevista estudiantil, trabajo final Materia ingeniería de Proyectos
Revista estudiantil, trabajo final Materia ingeniería de ProyectosJeanCarlosLorenzo1
 
NOM-002-STPS-2010, combate contra incendio.pptx
NOM-002-STPS-2010, combate contra incendio.pptxNOM-002-STPS-2010, combate contra incendio.pptx
NOM-002-STPS-2010, combate contra incendio.pptxJairReyna1
 
Conservatorio de danza Kina Jiménez de Almería
Conservatorio de danza Kina Jiménez de AlmeríaConservatorio de danza Kina Jiménez de Almería
Conservatorio de danza Kina Jiménez de AlmeríaANDECE
 

Último (20)

Diagrama de flujo metalurgia del cobre..pptx
Diagrama de flujo metalurgia del cobre..pptxDiagrama de flujo metalurgia del cobre..pptx
Diagrama de flujo metalurgia del cobre..pptx
 
produccion de cerdos. 2024 abril 20..pptx
produccion de cerdos. 2024 abril 20..pptxproduccion de cerdos. 2024 abril 20..pptx
produccion de cerdos. 2024 abril 20..pptx
 
Fe_C_Tratamientos termicos_uap _3_.ppt
Fe_C_Tratamientos termicos_uap   _3_.pptFe_C_Tratamientos termicos_uap   _3_.ppt
Fe_C_Tratamientos termicos_uap _3_.ppt
 
Espontaneidad de las reacciones y procesos espontáneos
Espontaneidad de las reacciones y procesos espontáneosEspontaneidad de las reacciones y procesos espontáneos
Espontaneidad de las reacciones y procesos espontáneos
 
Tarea de UTP matematices y soluciones ingenieria
Tarea de UTP matematices y soluciones ingenieriaTarea de UTP matematices y soluciones ingenieria
Tarea de UTP matematices y soluciones ingenieria
 
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
 
Simbología de Soldadura, interpretacion y aplicacion en dibujo tecnico indus...
Simbología de Soldadura,  interpretacion y aplicacion en dibujo tecnico indus...Simbología de Soldadura,  interpretacion y aplicacion en dibujo tecnico indus...
Simbología de Soldadura, interpretacion y aplicacion en dibujo tecnico indus...
 
trabajos en altura 2024, sistemas de contencion anticaidas
trabajos en altura 2024, sistemas de contencion anticaidastrabajos en altura 2024, sistemas de contencion anticaidas
trabajos en altura 2024, sistemas de contencion anticaidas
 
Historia de la Arquitectura II, 1era actividad..pdf
Historia de la Arquitectura II, 1era actividad..pdfHistoria de la Arquitectura II, 1era actividad..pdf
Historia de la Arquitectura II, 1era actividad..pdf
 
Sistema de Base de Datos (Rubén Alberto)
Sistema de Base de Datos (Rubén Alberto)Sistema de Base de Datos (Rubén Alberto)
Sistema de Base de Datos (Rubén Alberto)
 
3.3 Tipos de conexiones en los transformadores trifasicos.pdf
3.3 Tipos de conexiones en los transformadores trifasicos.pdf3.3 Tipos de conexiones en los transformadores trifasicos.pdf
3.3 Tipos de conexiones en los transformadores trifasicos.pdf
 
CFRD simplified sequence for Mazar Hydroelectric Project
CFRD simplified sequence for Mazar Hydroelectric ProjectCFRD simplified sequence for Mazar Hydroelectric Project
CFRD simplified sequence for Mazar Hydroelectric Project
 
QUIMICA ORGANICA I ENOLES Y ENAMINAS LIBR
QUIMICA ORGANICA I ENOLES Y ENAMINAS LIBRQUIMICA ORGANICA I ENOLES Y ENAMINAS LIBR
QUIMICA ORGANICA I ENOLES Y ENAMINAS LIBR
 
S454444444444444444_CONTROL_SET_A_GEOMN1204.pdf
S454444444444444444_CONTROL_SET_A_GEOMN1204.pdfS454444444444444444_CONTROL_SET_A_GEOMN1204.pdf
S454444444444444444_CONTROL_SET_A_GEOMN1204.pdf
 
Sistema de Gestión de Freelancers (Base de Datos)
Sistema de Gestión de Freelancers (Base de Datos)Sistema de Gestión de Freelancers (Base de Datos)
Sistema de Gestión de Freelancers (Base de Datos)
 
MEC. FLUIDOS - Análisis Diferencial del Movimiento de un Fluido -GRUPO5 sergi...
MEC. FLUIDOS - Análisis Diferencial del Movimiento de un Fluido -GRUPO5 sergi...MEC. FLUIDOS - Análisis Diferencial del Movimiento de un Fluido -GRUPO5 sergi...
MEC. FLUIDOS - Análisis Diferencial del Movimiento de un Fluido -GRUPO5 sergi...
 
5.1 MATERIAL COMPLEMENTARIO Sesión 02.pptx
5.1 MATERIAL COMPLEMENTARIO Sesión 02.pptx5.1 MATERIAL COMPLEMENTARIO Sesión 02.pptx
5.1 MATERIAL COMPLEMENTARIO Sesión 02.pptx
 
Revista estudiantil, trabajo final Materia ingeniería de Proyectos
Revista estudiantil, trabajo final Materia ingeniería de ProyectosRevista estudiantil, trabajo final Materia ingeniería de Proyectos
Revista estudiantil, trabajo final Materia ingeniería de Proyectos
 
NOM-002-STPS-2010, combate contra incendio.pptx
NOM-002-STPS-2010, combate contra incendio.pptxNOM-002-STPS-2010, combate contra incendio.pptx
NOM-002-STPS-2010, combate contra incendio.pptx
 
Conservatorio de danza Kina Jiménez de Almería
Conservatorio de danza Kina Jiménez de AlmeríaConservatorio de danza Kina Jiménez de Almería
Conservatorio de danza Kina Jiménez de Almería
 

Practica9 bases de datos

  • 1. Conexión a la base de datos desde Visual Studio y la arquitectura Modelo Vista Controlador (MVC) En esta práctica, estudiaremos como realizar la conexión a la base de datos desde una aplicación en C#. Después usando lo aprendido, crearemos una pequeña aplicación que interactúe con la base de datos usando un patrón arquitectónico llamado Modelo Vista Controlador. Antes de todo: Primeramente, debemos tener una base de datos donde trabajar. Para esto, inicie el SQL Managment Studio. Abra el script proporcionado, y ejecútelo, al final debería tener una base de datos equivalente a esta:
  • 2. Conexión a la base de datos desde C# Ahora intentaremos realizar la conexión desde una aplicación en C# a la base de datos, para esto, usaremos una tecnología de la plataforma .NET, llamada ADO.NET, que significa ActiveX Data Object, para usar la tecnología y conectarse a la base de datos realice los siguientes pasos: 1. Ingrese a Visual Studio 2. Cree un proyecto en Consola para C# 3. Dentro del método Main introduzca el siguiente código: static void Main(string[] args) { string connectionString = "server=.SQLEXPRESS;" + 4. Antes de ejecutar el código, observe la cadena de conexión. La cadena de conexión es un equivalente a la URL. En esta cadena uno debe indicar donde esta el servidor de la base de datos, y el nombre de la base de datos a acceder. Dependiendo como es la instalación de su servidor, la cadena de conexión puede variar. En el campo “server”, puede venir los siguientes ejemplos a. .SLQEXPRESS "integrated security=SSPI;" + "database=Universidad"; string sql = "SELECT TOP 10 nombre, apellido FROM Alumno"; SqlConnection conn = new SqlConnection(connectionString); conn.Open(); SqlCommand command = new SqlCommand(sql, conn); SqlDataReader reader = command.ExecuteReader(); while (reader.Read()) { Console.WriteLine("{0}tt{1}", reader[0], reader[1]); } conn.Close(); }
  • 3. b. .MSSQLSERVER c. Nompre-PCSQLEXPRESS d. .NombreInstancia 5. En el campo database debe estar el nombre de la base de datos a acceder. 6. Edite la cadena de conexión dependiendo como se acopla a su caso. 7. Ejecute el programa. Responda las siguientes preguntas 1. Que hace el programa? 2. Que cree que hace el objeto SqlConnection? 3. Que cree que hace el objeto SqlCommand? 4. Que cree que hace el objeto SqlDataReader? Arquitectura Modelo Vista Controlador En el desarrollo de software existen los patrones arquitectónicos, modelos de diseño de software que permiten organizar mejor las clases y objetos de tal manera de crear programas con un buen diseño orientado a objetos. Uno de estos patrones se denomina el patrón Modelo Vista Controlador (MVC). Este patrón es usado bastante en el mundo del desarrollo de software. Muchos frameworks en varios lenguajes fueron desarrollados siguiendo esta arquitectura. Ejemplos de esto son: · ASP.NET MVC · Ruby on Rails · Java Server Faces La idea de esta arquitectura, es separar las responsabilidades de las clases y dividirlos en capas. Existe un objeto llamado el modelo. Que se ocupa de mantener la lógica de validación y que los objetos en el programa se mantengan en un estado consciente. Como parte del modelo, existe el manejo de los datos. Y como guardarlos por ejemplo en una base de datos, o en un archivo, dependiendo los requerimientos del sistema. Después del modelo. Tenemos las vistas. Estos objetos pertenecientes a la vista se ocupan de mostrar los datos de alguna manera al usuario. La idea de la arquitectura Modelo Vista Controlador es que fácilmente podamos cambiar las vistas. Por ejemplo de tener una vista que esta en Windows Forms, a una vista manejado como sistema web en ASP.NET o en consola. Al final existe una clase, llamada Controlador, que es la que se encarga de comunicar a la Vista con el Modelo. Este se encarga de mandar mensajes al modelo para que se actualice y los resultados mandarlos a la Vista, para que el usuario puede ver los resultados. En esa clase, se mostrara una implementación básica de la arquitectura Modelo Vista Controlador. Empecemos a implementar. Antes de todo, se supone que dentro de su servidor SQLServer ya ejecuto el script proporcionado y tiene una base de datos llamada Universidad.
  • 4. 1. Cree un proyecto de Windows Forms 2. Dentro de este proyecto cree las siguientes carpetas a. Model b. View c. Controller d. Database 3. Dentro de la carpeta Model cree una clase llamada Student, y una clase llamada ModelException 4. En la clase ModelException introduzca el siguiente código: public class ModelException : Exception { public ModelException(string msg) : base(msg) {} }
  • 5. 5. En la clase Student introduzca el siguiente código: public class Student { private int ci; private string firstName; private string lastName; private DateTime birthday; private int cellphone; public Student() { ci = 0; firstName = ""; lastName = ""; birthday = DateTime.Now; cellphone = 71234567; } public int CI { get { return ci; } set { if (value < 100000) throw new ModelException("El CI no es válido"); ci = value; } } public string FirstName { get { return firstName; } set {
  • 6. if (String.IsNullOrEmpty(value)) throw new ModelException("El nombre no puede estar vacio"); if (value.Length > 30) throw new ModelException("El nombre no puede tener mas de 30 carácteres"); firstName = value; } } public string LastName { get { return lastName; } set { if (String.IsNullOrEmpty(value)) throw new ModelException("El apellido no puede estar vacio"); if (value.Length > 30) throw new ModelException("El apellido no puede tener mas de 30 carácteres"); lastName = value; } } public DateTime Birthday { get { return birthday; } set { if (value > DateTime.Now) throw new ModelException("La fecha de nacimiento aun no pasó!!"); birthday = value; } } public int CellPhone { get { return cellphone; } set { if (value < 60000000 || value > 80000000) throw new ModelException("Celular no valido"); cellphone = value; } } }
  • 7. 6. Antes de seguir. Revise y estudie el código y responda las siguientes preguntas: a. Que representa la clase Student? b. Que se hace en las funciones set/get de la clase? c. Como se reporta errores en el modelo? 7. Dentro de la carpeta cree una clase llamada ConnectionManager. La responsabilidad de esta clase será la encargada de mantener la cadena de conexión, Conectarse a la base de datos y dar una manera de ejecutar comandos SQL a las otras clases. La clase es como sigue: public class ConnectionManager : IDisposable { private string connectionString = "server=.SQLEXPRESS;" + 8. Antes de continuar, responda, los objetos usados en esta clase le parecen familiar? 9. Cree una clase DatabaseException. El código de la clase sigue asi: public class DatabaseException : Exception { public DatabaseException(string message) : base(message) { } } 10. Cree una clase dentro de la carpeta Database llamada StudentsDatabase, el código de la clase es como sigue: "integrated security=SSPI;" + "database=Universidad"; private SqlConnection connection; public ConnectionManager() { connection = new SqlConnection(connectionString); connection.Open(); } public SqlCommand GetCommand(string sql) { return new SqlCommand(sql, connection); } public void Dispose() { connection.Close(); connection.Dispose(); }
  • 8. public class StudentsDatabase : IDisposable { private ConnectionManager connection; public StudentsDatabase() { connection = new ConnectionManager(); } public Student GetUserByCI(int CI) { try { String sql = "SELECT * FROM Alumno WHERE CI = @CI"; SqlCommand command = connection.GetCommand(sql); command.Parameters.AddWithValue("@CI", CI); SqlDataReader reader = command.ExecuteReader(); if (reader.HasRows) { reader.Read(); Student student = new Student { CI = Convert.ToInt32(reader[0]), FirstName = Convert.ToString(reader[1]), LastName = Convert.ToString(reader[2]), Birthday = Convert.ToDateTime(reader[3]), CellPhone = Convert.ToInt32(reader[4]) }; reader.Close(); return student; } reader.Close(); } catch (Exception exception) { throw new DatabaseException("Error en la base de datos: " + exception.Message); } return null; } public void CreateNewStudent(Student student) { try { String sql = "INSERT INTO Alumno (CI, nombre, apellido, fechanac, celular) " + "VALUES (@CI, @firstname, @lastname, @birthday, @cellphone)"; SqlCommand command = connection.GetCommand(sql); command.Parameters.AddWithValue("@CI", student.CI); command.Parameters.AddWithValue("@firstname", student.FirstName); command.Parameters.AddWithValue("@lastname", student.LastName); command.Parameters.AddWithValue("@birthday", student.Birthday); command.Parameters.AddWithValue("@cellphone", student.CellPhone);
  • 9. int rows = command.ExecuteNonQuery(); if (rows == 0) throw new DatabaseException("Error en la base de datos"); } catch (Exception exception) { throw new DatabaseException("Error en la base de datos: " + exception.Message); } } public void UpdateStudent(Student student) { try { String sql = "UPDATE Alumno SET" + "nombre = @firstname, " + "apellido = @lastname, " + "fechanac = @fechanac, " + "celular = @cellphone " + "WHERE CI = @CI"; SqlCommand command = connection.GetCommand(sql); command.Parameters.AddWithValue("@CI", student.CI); command.Parameters.AddWithValue("@firstname", student.FirstName); command.Parameters.AddWithValue("@lastname", student.LastName); command.Parameters.AddWithValue("@birthday", student.Birthday); command.Parameters.AddWithValue("@cellphone", student.CellPhone); int rows = command.ExecuteNonQuery(); if (rows == 0) throw new DatabaseException("Error en la base de datos"); } catch (Exception exception) { throw new DatabaseException("Error en la base de datos: " + exception.Message); } } public void DeleteStudentByCI(int CI) { try { String sql = "DELETE FROM Alumno " + "WHERE CI = @CI"; SqlCommand command = connection.GetCommand(sql); command.Parameters.AddWithValue("@CI", CI); int rows = command.ExecuteNonQuery(); if (rows == 0) throw new DatabaseException("Error en la base de datos"); } catch (Exception exception) { throw new DatabaseException("Error en la base de datos: " + exception.Message); } }
  • 10. public List<Student> GetAllStudents() { List<Student> students = new List<Student>(); try { String sql = "SELECT * FROM Alumno"; SqlCommand command = connection.GetCommand(sql); SqlDataReader reader = command.ExecuteReader(); while(reader.Read()) { 11. Deténgase en esta clase, analice el código y responda las siguientes preguntas: a. Que responsabilidades tiene esta clase? b. Que hace cada método de la clase? c. Como se ejecutan las sentencias SQL? d. Como se reportan errores de la base de datos al programa? e. Como se busca un objeto en la base de datos? f. Como se inserta un nuevo objeto en la base de datos? g. Como se elimina un objeto en la base de datos? h. Como se edita un objeto en la base de datos? i. Investigue un poco mas acerca de las sentencias SQL preparadas. Que ventajas tiene usar este tipo de sentencias? Ve alguna sentencia SQL Preparada en esta clase? 12. En la carpeta View cree una carpeta llamada Student, dentro de este cree los siguientes formularios: Student student = new Student { CI = Convert.ToInt32(reader[0]), FirstName = Convert.ToString(reader[1]), LastName = Convert.ToString(reader[2]), Birthday = Convert.ToDateTime(reader[3]), CellPhone = Convert.ToInt32(reader[4]) }; students.Add(student); } } catch (Exception exception) { throw new DatabaseException("Error en la base de datos: " + exception.Message); } return students; } public void Dispose() { connection.Dispose(); } }
  • 11. a. StudentMenu: b. RegisterStudentForm
  • 12. c. ShowStudentForm d. EditStudentForm 13. En los formularios de, Editar Alumno, Buscar Alumno y Registrar Alumno cree los siguientes métodos (Cambie el nombre de los objetos dependiendo como usted llamo a sus controles al crear los formularios):
  • 13. public (Nombre_Constructor)(StudentController theController) { InitializeComponent(); controller = theController; } public String CI { get { return ciTextBox.Text; } set { ciTextBox.Text = value; } } public String FirstName { get { return firstNameTextBox.Text; } set { firstNameTextBox.Text = value; } } public String LastName { get { return lastNameTextBox.Text; } set { lastNameTextBox.Text = value; } } public String BirthDay { get { return birthdayDate.Text; } set { birthdayDate.Text = value; } }
  • 14. public String Cellphone 14. Cree una clase dentro de la carpeta Controller una clase llamada StudentController, el código de la clase es como sigue: public class StudentController : IDisposable { private StudentMenu studentMenu; private StudentsDatabase model; public StudentController(StudentMenu menu) { studentMenu = menu; model = new StudentsDatabase(); } public void ShowRegisterStudent() { studentMenu.Hide(); RegisterStudentForm register = new RegisterStudentForm(this); register.Show(); } public void RegisterStudent(RegisterStudentForm registerForm) { try { Student student = new Student(); student.CI = Convert.ToInt32(registerForm.CI); student.FirstName = registerForm.FirstName; student.LastName = registerForm.LastName; student.Birthday = Convert.ToDateTime(registerForm.BirthDay); student.CellPhone = Convert.ToInt32(registerForm.Cellphone); if (model.GetUserByCI(student.CI) != null) { throw new Exception("El Estudiante ya ha sido registrado"); } { get { return cellphoneTextBox.Text; } set { cellphoneTextBox.Text = value; } } public void ShowError(String message) { MessageBox.Show(message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); }
  • 15. model.CreateNewStudent(student); registerForm.Hide(); registerForm.Dispose(); studentMenu.Show(); } catch (Exception ex) { registerForm.ShowError(ex.Message); } } public void Dispose() { model.Dispose(); } } 15. Dentro del formulario StudentMenu, edite el código e introduzca el siguiente código: private StudentController controller; private PrincipalMenu principal; public StudentMenu(PrincipalMenu principalMenu) { InitializeComponent(); controller = new StudentController(this); principal = principalMenu; } 16. Haga doble click en el botón Registrar Alumno, en el evento generado introduzca el siguiente código: controller.ShowRegisterStudent(); 17. En el formulario de Registrar Alumno, en el botón registrar, haga doble click, ejecute el siguiente código: controller.RegisterStudent(this);
  • 16. 18. En el formulario creado por defecto en el proyecto, renómbrelo por PrincipalMenu, coloque controles, este se tiene que ver de la siguiente manera: 19. Haga doble click en el botón Alumnos, introduzca el siguiente código: StudentMenu menu = new StudentMenu(this); menu.Show(); Hide(); 20. Haga doble click en el botón Salir, introduzca el siguiente código: Application.Exit(); 21. En el formulario StudentMenu, haga doble click en el botón Volver e introduzca el siguiente código: principal.Show(); Hide(); controller.Dispose(); Dispose(); 22. Ejecute el programa 23. Responda las siguientes preguntas: a. Que hace el controlador? b. Que hacen las vistas? c. Que ventajas ve usted al separar las responsabilidades en distintas clases? d. Que desventajas ve usted al separar las responsabilidades en distintas clases? e. Cual es el objetivo de crear métodos set/get en las vistas? f. Donde se muestran los errores reportados por todas las clases creadas? 24. Pruebe el programa 25. Intente completar el “modulo” de Alumnos, implementando el buscar, editar y eliminar. Las vistas ya están creadas, El modelo ya esta listo, complete el controlador y los eventos necesarios de las vistas. 26. Intente implementar el “modulo” Materias.
  • 17. Entrega La práctica debe ser entregada de la siguiente manera: El código completo de la practica, un archivo en Word con las respuestas de las preguntas de la practica, propiamente nombradas, en un archivo comprimido de la siguiente manera: PracticaV-(nombrecompleto).rar El archivo comprimido enviarlo al correo inf151ucb@gmail.com con el asunto PrácticaIX- (nombre completo). Entregar el trabajo hasta las 23:59 del día 4 de noviembre del año 2013. * Si se detecta copia, el trabajo será anulado para el que copió y el que hizo copiar. * Este trabajo será evaluado como parte de la evaluación continua