You are on page 1of 19

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


APLICACIÓN:
COMUNICACIÓN Es la que va a Consumir la Información de la DB

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
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.Data
System.Data.SqlClient
System.Data.Odbc
System.Data.OleBb
System.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

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
ESCENARIO DESCONECTADO información situada en el Servidor, para que
esto se lleve a cabo es necesario que se
SeSe
realiza una
realiza Consulta
una Consulta a la Base
a la dede
Base Datos por
Datos por establezca una conexión entre la Aplicación de
parte dede
parte la la
Aplicación
Aplicacióndede
Usuario
Usuario Usuario y la BD de manera permanente.
2
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.

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
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.
3
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
COMO UTILIZAR LA CADENA DE CONEXION DESDE
ADO .NET

SQL ACCESS ODBC

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.

OBOJETO XXXCONECCTION CREADO


Útil solo cuando se le aporta la cadena de
conexion

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ón
Eliminación
Actualización
5to. Cerrar la Conexión.
Llamando al método Close(); del Objeto.

5
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 Sql
using 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
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
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.

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

8
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();

}
}

CONEXION RETENIDA

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

El objeto xxxConnection establece la


conexión

Se ejecutan las operaciones con la


conexión establecida

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

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

10
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
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
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
CLASE

EVENTO

CLICK
AQUI

COPIAR ESTOS
PARAMETROS A LA
FUNCION QUE SE VA A
CREAR

14
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 Sql
using 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 {
MessageBox.Show("Base de Datos SQL Expess :" + e.CurrentState.ToString());
}
}
15
// 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 UN 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.

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

16
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 BD
Valor TableDirect: El nombre de la Tabla que queremos que se devuelvan todas las
tablas.

17
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)

SE ENVIA LA INTRUCCION A LA BD
EN SQL

LA BD DEVUALVE COMO
RESPUESTA
UN UNICO VALOR DE TIPO

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

SE ENVIA LA INTRUCCION A LA BD
EN SQL

LA BD DEVUALVE COMO
RESPUESTA
UN CONJUNTO DE RESULTADOS
ATRAVES DE UN BOJETO
DATAREADER

18
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)

SE ENVIA LA INTRUCCION A LA BD
EN SQL

LA BD DEVUALVE COMO
RESPUESTA
UN BOJETO DE TIPO INT
INDICANDO EL NUMERO DE
FILAS AFECTADAS POR LA

19

You might also like