Acceso A Datos en Visual Studio Part1
January 2, 2024 | Author: Anonymous | Category: N/A
Short Description
Download Acceso A Datos en Visual Studio Part1...
Description
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 COMUNICACIÓN
APLICACIÓ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
ESCENARIO DESCONECTADO SeSe realiza una Consulta a la Base dede Datos por realiza una Consulta a la Base Datos por parte dede la la Aplicación dede Usuario parte Aplicación 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. 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 private void Form1_Load(object sender, EventArgs e) {
PASANDOLES LAS CADENAS DE CONEXION
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 using using using using using
System; System.Collections.Generic; System.Linq; System.Text; System.Data; 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 using using using
System; System.Collections.Generic; System.Linq; 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 using using using using using using using
System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; 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 CONEXIÓN EN EL EVENTO QUE CARGA EL FORMULARIO
PASANDOLES LAS CADENAS DE
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");
el estado
// sobre escribiendo el evento con el evento creado por nosotros para determinar 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
View more...
Comments