Acceso a Datos en Visual Studio Part1

23
ACCESO A DATOS EN VISUAL STUDIO .NET SQL (Structured Query Language) Lenguaje de Acceso a Datos (No es un Lenguaje de Programación). Sirve para comunicarse con la base de datos a través del esquema de trasmitirle instrucciones tales como: Select ( Consultar Datos) Insert ( Agregar Registros) Update ( Actualizar o Modificar Registros) Delete ( Borrar Registros) PROVEEDORES DE BASES DE DATOS Para que alguien pueda hacer uso de la información de la BD es necesario la figura llamada PROVEEDOR situado entre el Data Consumer y la BD. EL Proveedor será capaz de interpretar las solicitudes que se le hagan desde la aplicación y trasmitirlas a la BD en su formato interno y de la misma forma cuando el proceso se ejecuta en viceversa. Siempre que se acceda a una BD se hará a través de un Proveedor. Este captara las instrucciones en formato SQL y lo trasmite según el lenguaje interno de la BD al motor interno de la BD para llevar a cabo las operaciones requeridas por parte de la aplicación. 1 COMUNICACIÓN APLICACIÓN: Es la que va a Consumir la Información de la DB

Transcript of Acceso a Datos en Visual Studio Part1

Page 1: Acceso a Datos en Visual Studio Part1

ACCESO A DATOS EN VISUAL STUDIO .NET

SQL (Structured Query Language)Lenguaje de Acceso a Datos (No es un Lenguaje de Programación). Sirve para comunicarse con la base de datos a través del esquema de trasmitirle instrucciones tales como:Select ( Consultar Datos)Insert ( Agregar Registros)Update ( Actualizar o Modificar Registros)Delete ( Borrar Registros)

PROVEEDORES DE BASES DE DATOS

Para que alguien pueda hacer uso de la información de la BD es necesario la figura llamada PROVEEDOR situado entre el Data Consumer y la BD.

EL Proveedor será capaz de interpretar las solicitudes que se le hagan desde la aplicación y trasmitirlas a la BD en su formato interno y de la misma forma cuando el proceso se ejecuta en viceversa.

Siempre que se acceda a una BD se hará a través de un Proveedor. Este captara las instrucciones en formato SQL y lo trasmite según el lenguaje interno de la BD al motor interno de la BD para llevar a cabo las operaciones requeridas por parte de la aplicación.

Existen dos tipos de proveedores para acceder a una BD. OleDB (Tecnología Microsoft) y ODBC (Tecnología Abierta).

1

COMUNICACIÓNAPLICACIÓN:

Es la que va a Consumir la Información de la DB

Page 2: Acceso a Datos en Visual Studio Part1

En Visual Studio la figura del Data Consumer (Aplicación Consumidora de la Información de la BD) es representada por ADO.NET

El ADO.NET es un conjunto de Clases definidas dentro de la Librería de Clases que incorpora el FrameWork .Net que sirven para acceder a la Información y es con ellas que podremos consumir o hacer uso de la información de la BD ya que facilitan la funcionalidad para lanzar ordenes a la BD, ordenes que forzosamente pasaran a través del Proveedor el cual como ya se dijo interpretara esas órdenes de un formato a otro. Asi también facilitan la obtención e interpretación de la información que la BD envía a través del Proveedor hacia la Aplicación de Usuario

Es dentro de ADO.NET en donde se encuentran los diferentes proveedores para las diferentes BD’s y dependerá del tipo de Proveedor que se implemente las clases que utilizaremos para consumir información de la BD.

Principales namespace que incluyen las clases de ADO.NET:System.DataSystem.Data.SqlClientSystem.Data.OdbcSystem.Data.OleBbSystem.Data.OracleClient

FORMAS DE ACCEDER A LA INFORMACION DE LA BD

Esencialmente existen los que se podría llamar 2 escenarios para acceder a la información : Escenario Conectado y Escenario Desconectado.

ESCENARIO CONECTADO

ESCENARIO DESCONECTADO

2

Se realiza una Consulta a la Base de Datos por parte de la Aplicación de Usuario

La BD resuelve la consulta y pone la información en la Memoria de Servidor de la BD desde ahí el Servidor ira ofreciendo la información a la Aplicación de Usuario, a

partir de ahora el código de la Aplicación de Usuario utilizando una clases concretas podrá acceder a la

información que hay en el cursor de la BD iterando a través de la información situada en el Servidor, para que esto se lleve a cabo es necesario que se establezca una

conexión entre la Aplicación de Usuario y la BD de manera permanente.Se realiza una Consulta a la Base de Datos por parte de la

Aplicación de Usuario

Page 3: Acceso a Datos en Visual Studio Part1

Y es en la maquina del cliente en donde el usuario interactúa con la información para llevar a cabo sobre ella las operaciones que requiere aplicar sobre ella. Posteriormente se tendrá que establecer otra conexión para reflejar los datos en la BD nuevamente.

CONECTAR A UNA BASE DE DATOS

¿Qué es la cadena de conexión?Como conectar a una Base de Datos.Forma de usar una conexión.Como gestionar los eventos de conexión.

CADENA DE CONEXIÓN

Es una cadena de texto formada por parámetros separados por ( ; ) que aprta toda la información necesaria para establecer una conexión a una base de datos (¿Cual BD?,¿ Donde esta la BD?, Autentificación de la conexión).

Parámetros para una Cadena de Conexión: PROVIDER DATA SOURCE INITIAL CATALOG USER ID PASSWORD INTEGRATED SECURITY

3

El servidor genera los resultados de la Consulta

El servidor envía los resultados a través de la red a la ubicación (equipo cliente) donde se encuentra la

Aplicación de Usuario y una vez enviada la coneccion se da por concluida.

Se realiza una Consulta a la Base de Datos por parte de la Aplicación de Usuario

Page 4: Acceso a Datos en Visual Studio Part1

Parámetro Provider : Sirve para escoger el Proveedor de la BD. Para los casos de cadenas de conexión en los que se tenga que especificar entre tipos OleBD y ODBC diferentes de los que trae .net ya definidos para sql access u oracle.

Parámetro Data Source: Es el que indica la ruta del servidor o la base de datos a la que se tiene que conectar. Dependiendo de la base de datos a la que se conecte tendrá un valor u otro, por ejemplo:En el caso de Access será la ruta del archivo mdb.En el caso de Sql será el nombre del servidor sql server (instancia).En el caso de Oracle será el nombre del servicio de Oracle.

Parámetro Initial Catalog: Este solo tendrá uso en ciertas BD, concretamente en bd’s tipo sql y mySql, y será para indicar a que base de datos se tendrá que conectar en el servidor indicado.

Parámetro User Id y Password: Estos sirven para aportar las credenciales de conexión del usuario si es que tuviera que aportarla.

Parametro Integrated Security: Este parámetro solo es para el caso de las bd’s de sql server proporciona una identificación para acceder a la base de datos en el esquema basado en la identidad del usuario, no hace falta aportar credenciales sino que el usuario que está ejecutando la aplicación que se conecta a la base de datos ya tene permiso en el servidor SQL server, es decir se le dice en la cadena de conexión que la identidad del usuario es la misma que la identidad que está ejecutando en este momento la conexión a través de esta cadena.

Ejemplo de Cadena de Conexión para una BD de Access llamada Neptuno.mdb para el Proyecto WinGestionComercial en Visual Studio 2010

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\FACTORIADEPROYECTOS\WinGestionComercal\Neptuno.mdb

Ejemplo de Cadena de Conexión para la BD de SQL SERVER llamada Demo para el Proyecto WinGestionComercial en Visual Studio 2010

Data Source=.\SQLEXPRESS;Initial Catalog=Demo;Integrated Security=True;Pooling=False

4

Page 5: Acceso a Datos en Visual Studio Part1

COMO UTILIZAR LA CADENA DE CONEXION DESDE ADO .NET

LOS OBJETOS (xxx)Connection son los que van a permitir hacer la conexión con la DB según sea el caso. Para ello es necesario dar vida a un Objeto xxxConnection, sin embargo el hecho de definirlo e instanciarlo no significa que tenemos una conexión, para ello es necesario indicarle la cadena de conexión.

1er. Paso crear el Objeto xxxConecction.2do. Paso aportarle la cadena de conexión en su propiedad ConnectionString:

a) Después de creado el objeto o;b) En el momento de crearlo a través de su constructor.

3er. Paso Conectar a la Base de datos.Llamando al método Open(); del Objeto, este método es el que abre la conexión y a la vez es el que nos

informara el error en caso de algún fallo en la conexión.4er. Paso Utilizar la Conexión:

CreaciónEliminaciónActualización

5to. Cerrar la Conexión.Llamando al método Close(); del Objeto.

5

SQL ACCESS ODBC

OBOJETO XXXCONECCTION CREADOÚtil solo cuando se le aporta la cadena de

conexion

Page 6: Acceso a Datos en Visual Studio Part1

using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;// clases necesarias para Objetos Acces y Sqlusing System.Data;using System.Data.OleDb;using System.Data.SqlClient;

namespace ObjetosConnection{ public partial class Form1 : Form { public Form1()

{ InitializeComponent(); } // DEFINICION DE OBJETOS xxxConnection private OleDbConnection conexionAccess; private SqlConnection conexionSql;

// CREACION DE OBJETOS xxxConnection xxxConnection PASANDOLES LAS CADENAS DE CONEXION private void Form1_Load(object sender, EventArgs e) {

conexionAccess = new OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\FACTORIADEPROYECTOS\\WinGestionComercal\\Neptuno.mdb");

conexionSql = new SqlConnection("Data Source=.\\SQLEXPRESS;Initial Catalog=Demo;Integrated Security=sspi"); }

private void button1_Click(object sender, EventArgs e) { try { if(conexionAccess.State == ConnectionState.Open) { MessageBox.Show("La Conexion a Access ya esta Establecida"); } else { conexionAccess.Open(); // Establece la Conexion a Access MessageBox.Show("Conexion a Access establecida con exito !!!"); } } catch (Exception ex) { MessageBox.Show("Error - No se ha podido establecer la conexion a Access" + ex.ToString()); } }

6

Page 7: Acceso a Datos en Visual Studio Part1

private void button2_Click(object sender, EventArgs e) { try { if (conexionSql.State == ConnectionState.Open) { MessageBox.Show("La conexion a SQL Express ya esta establecida"); } else { conexionSql.Open(); // Establece la Conexion a SQL Express MessageBox.Show("Conexion a SQL Express establecida con Extio!!!"); } } catch (Exception ex) { MessageBox.Show("Error - No se ha podido establecer la conexion a SQL Express" + ex.Message); } }

private void button4_Click(object sender, EventArgs e) { try { if ( conexionAccess.State == ConnectionState.Closed) { MessageBox.Show("La Conexion ya habia sido cerrada anteriormente"); } else { conexionAccess.Close(); // Cierra la Conexion a Access MessageBox.Show("La conexion a Access se ha Cerrado con Exito !!!"); } } catch(Exception ex) { MessageBox.Show("Error al tratar de Cerrar la Conexion a SQL Express" + ex.Message); } }

private void button3_Click(object sender, EventArgs e) { try { if (conexionSql.State == ConnectionState.Closed) { MessageBox.Show("La Conexion ya habia sido cerrada anteriormente"); } else { conexionSql.Close(); // Cierra la Conexion a SQL Express MessageBox.Show("La conexion a Access se ha Cerrado con Exito !!!"); } } catch (Exception ex) { MessageBox.Show("Error al tratar de Cerrar la Conexion a SQL Express" + ex.Message); } } }}

7

Page 8: Acceso a Datos en Visual Studio Part1

FORMAS DE USAR LAS CONEXIONES

CONEXION PUNTUAL

Se trata de que a través de un objeto xxxConnection cada vez que se produce una solicitud por parte del usuario este hace una conexión a la base de datos, solicita la información y cierra la conexión, es decir un código donde cada vez que el usuario de la clase solicite una acción contra la BD, abriremos conexión, realizaremos la acción y cerraremos la conexión.

8

Una primera solicitud, establece la conexión, realiza la operación y cierra la conexión

Una segunda solicitud, establece la conexión, realiza la operación y cierra la conexión

Page 9: Acceso a Datos en Visual Studio Part1

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.OleDb;

namespace ObjetosConnection{ // Esqueleto de una clase que realiza una conexion puntual

class ConexionPuntual {

//unico metodo y solo hasta ke se invoca este metodo es cuando se crea el objeto xxxConnection

public string ObtenerNombreEmpleado(int pId) {

OleDbConnection conexionAccess = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\FACTORIADEPROYECTOS\\WinGestionComercal\\Neptuno.mdb");

try {

// SE ESTABLECE LA CONEXION A LA BASE DE DATOS

conexionAccess.Open();

// ACCCION QUE SE VA A LLEVAR ACABO A TRAVES DEL OleDbCommand

} catch (Exception ex) {

// MANEJO DE EXCEPCIONES

} finally { if ( conexionAccess.State != ConnectionState.Closed) {

// SE CIERRA LA CONEXION ENSEGUIDA DE EJECUTAR LA ACCION SOBRE LA BD. conexionAccess.Close();

} }

}

}}

9

Page 10: Acceso a Datos en Visual Studio Part1

CONEXION RETENIDA

Se trata de un objeto que en el momento de crearlo establece una conexión hacia la base de datos, es decir, abre conexión y mantiene esa conexión abierta, luego cada una de las solicitudes que le vayan llegando irán siendo atendidas a través de esta conexión sin necesidad de volver a abrir esta conexión, es decir cada solicitud utilizara la misma conexión; ahora bien al final de trabajar con el objeto debemos asegurarnos de alguna forma de cerrar la conexión.

10

El objeto xxxConnection establece la conexión

Una vez que se ejecutan las opresiones y el objeto ya no es útil hay que asegurarse que el objeto xxxConnection cierre

la conexión

Se ejecutan las operaciones con la conexión establecida

Page 11: Acceso a Datos en Visual Studio Part1

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.OleDb;

namespace ObjetosConnection{ // Esqueleto de una clase que realiza una conexion puntual implementando la interfaz IDisposable para poder hacer uso del método Dispose que usan los formularios por parte de la clase que hemos creado y agregándole el código que permite cerrar la conexion.

class ConexionRetenida :IDisposable { // declaracion del Objeto xxxConnection a nivel de clase para lograr un objeto que este

vijente entre operacion y operación

private OleDbConnection conexionAccess;

// constructor de la clase para abrir la coneccion (crear objeto xxxConnection) en el momento

que se crea (instancia) un objeto de la clase ConexionRetenida

public ConexionRetenida() { conexionAccess = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\FACTORIADEPROYECTOS\\WinGestionComercal\\Neptuno.mdb"); conexionAccess.Open(); }

// metodo para realizar una operacion sobre la BD

public string ObtenerNombreEmpleado(int pId) {

try {

// ACCCION QUE SE VA A LLEVAR ACABO A TRAVES DEL OleDbCommand

} catch (Exception ex) {

// MANEJO DE EXCEPCIONES

}

// resultado (valor) que devuelde el metodo de parte de la bd return; }

// Metodo que le proporciona al usuario la Herramienta para poder cerrar la conexion despues de

realizar las operaciones necesarias implementando el método Dispose de los Frm

public void Dispose() { if (conexionAccess.State != ConnectionState.Closed) { conexionAccess.Close();

11

Page 12: Acceso a Datos en Visual Studio Part1

} } }}

Formulario que utiliza los dos tipos de conexiones implementando las 2 clases vistas anteriormente

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;

namespace ObjetosConnection{ public partial class FrmConexiones : Form { public FrmConexiones() { InitializeComponent(); }

private void btnBuscar_Click(object sender, EventArgs e) { //Conexion Puntual

ConexionPuntual conPuntual = new ConexionPuntual(); txtbNombre.Text = conPuntual.ObtenerNombreEmpleado(int.Parse(txtbIdCliente.Text));

/* //Conexion Retenida

ConexionRetenida conRetenida = new ConexionRetenida(); txtbNombre.Text = conRetenida.ObtenerNombreEmpleado(int.Parse(txtbIdCliente.Text)); conRetenida.Dispose(); //Método para concluir la conexión */ } }}

12

Page 13: Acceso a Datos en Visual Studio Part1

EVENTOS DE UNA CONEXIÓN

InfoMessage: Ocurre cuando una base de datos devuelve un mensaje de informacion. No es un error.StateChange: Ocurre cuando una conexión pasa de Abierta a Cerrada o viceversa.

Manipulando evento StateChange de un xxxConnection

Lo que se pretende es una especie de sobecarga del evento StateChange del xxxConnction agregando una función al código pasándole los mismos parámetros que utiliza el evento StateChange y utilizando el parámetro e dentro de la función al final solo se le suma la función al evento StateChange del objeto xxxConnection al momento de invocar el evento, entendiendo que el evento se lleva acabo de manera implícita sin necesidad de invocarlo, solo que necesitamos invocarlo por medio de código para poder sumarle la función que lo sobrecargara.

Para hacer esto necesitamos saber que tipo de handler se necesita para gestionar el evento. Y esto los podemos ver atraves del examinador de objetos localizando la clase DbConnection en su evento StateChange

13

Page 14: Acceso a Datos en Visual Studio Part1

14

CLICK AQUI

EVENTO

CLASE

Page 15: Acceso a Datos en Visual Studio Part1

using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;// clases necesarias para Objetos Acces y Sqlusing System.Data;using System.Data.OleDb;using System.Data.SqlClient;

namespace ObjetosConnection { public partial class Form1 : Form { public Form1() { InitializeComponent(); } // DEFINICION DE OBJETOS xxxConnection private OleDbConnection conexionAccess; private SqlConnection conexionSql;

// CREACION DE OBJETOS xxxConnection xxxConnection PASANDOLES LAS CADENAS DE CONEXIÓN EN EL

EVENTO QUE CARGA EL FORMULARIO

private void Form1_Load(object sender, EventArgs e) {

conexionAccess = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\FACTORIADEPROYECTOS\\WinGestionComercal\\Neptuno.mdb"); conexionSql = new SqlConnection("Data Source=.\\SQLEXPRESS;Initial Catalog=Demo;Integrated Security=sspi");

// sobre escribiendo el evento con el evento creado por nosotros para determinar el estado

e informarlo

conexionAccess.StateChange += estadoConecction; conexionSql.StateChange += estadoConecction; }

// funcion a manera de evento con el mismos manejador para sobre escribir el evento del objeto

XxxConecction

private void estadoConecction(object sender, System.Data.StateChangeEventArgs e) {

if (sender.Equals(conexionAccess)) { MessageBox.Show("Base de Datos Access :" + e.CurrentState.ToString()); } else {

15

COPIAR ESTOS PARAMETROS A LA FUNCION QUE SE VA A CREAR

Page 16: Acceso a Datos en Visual Studio Part1

MessageBox.Show("Base de Datos SQL Expess :" + e.CurrentState.ToString()); } }

// evento del boton para establecer conexion a Access private void button1_Click(object sender, EventArgs e) ... // evento del boton para establecer conexion a SQL Express private void button2_Click(object sender, EventArgs e) ... // evento del boton para cerrar conexion a Access private void button4_Click(object sender, EventArgs e) ... // evento del boton para cerrar conexion a SQL Express private void button3_Click(object sender, EventArgs e) ... }}

COMO ENVIAR U N COMANDO A LA BASE DE DATOS

OBJETO XxxCommand (sql, Access, orace, mysql, odbc)

Es el objeto que se utiliza para emitir instrucciones hacia la Base de Datos

Una vez establecida una conexión a la base de datos.

16

Page 17: Acceso a Datos en Visual Studio Part1

El siguiente paso es crear (instancia) de un objeto XxxCommand

A este objeto hay que establecerle claramente dos propiedades escenciales:

1 ro. La instrucción: Es decir el comando, en este caso la instrucción SQL que queremos enviar a la base de datos (select, update, delete, etc) para llevar a cabo la operación sobre la BD que deseamos hacer.

2 do. La Conexión: Que conexión va a utilizar este comando. Una vez especificada la conexión que debe utilizar el objeto XxxCommand este puede enviar la instrucción hacia el servidor.

Propiedades del Objeto XxxCommand.

CommandType: Esta es la que sirve para especificar qué tipo de instrucción se está enviando a la BD.

Valores que acepta:

Text: Instrucciones SQL. StoredProcedure: Llamando a un programa almacenado en la BD. TableDirect: Para especificar que lo que se quiere hacer es una consulta de todos los datos que

hay en una tabla.

CommanText: Propiedad que funciona en función del valor asignado a la propiedad CommandType.

Valor Text: Instrucción SQL (select, insert, update, delete).Valor StoredProcedure: El nombre del Programa almacenado de la BDValor TableDirect: El nombre de la Tabla que queremos que se devuelvan todas las tablas.

17

Page 18: Acceso a Datos en Visual Studio Part1

Connection: Propiedad que se utiliza para indicar al XxxCommand el tipo de conexión que deberá utilizar para conectarse a lña BD, es decir el objeto XxxConnection que hayamos creado para establecer la conexión a la BD.

Ejecución del Objeto XxxCommand.

La forma en que se ejecuta el XxxComnand es decir cómo se le ordena que lleve a cabo la acción (instrucción ) contra la BD, depende de lo que esperemos obtener como respuesta de la BD.

Tipos de Respuesta de un BD.

a) CONSULTA ESCALAR ( El valor que hay en un campo de una fila en concreto, ejemplo: el nombre de un cliente, precio de un producto, el promedio de una seria de productos)

b) CONSULTA NO ESCALAR ( Conjunto de valores que hay en una tabla)

18

SE ENVIA LA INTRUCCION A LA BD EN SQL

LA BD DEVUALVE COMO RESPUESTAUN UNICO VALOR DE TIPO OBJECT

SE ENVIA LA INTRUCCION A LA BD EN SQL

LA BD DEVUALVE COMO RESPUESTAUN CONJUNTO DE RESULTADOS

ATRAVES DE UN BOJETO DATAREADER

Page 19: Acceso a Datos en Visual Studio Part1

c) MODIFICACION (No se espera que la BD devuelve campos de la tabla con información porque lo que se hace es una inserción una actualización o una eliminación, etc)

19

SE ENVIA LA INTRUCCION A LA BD EN SQL

LA BD DEVUALVE COMO RESPUESTAUN BOJETO DE TIPO INT INDICANDO

EL NUMERO DE FILAS AFECTADAS POR LA INSTRUCCION