Base de datos

65
M.C. Gerardo Beltrán Gutiérrez Diplomado de Especialización en .NET Modulo 2: Tecnologías de acceso a datos

Transcript of Base de datos

Page 1: Base de datos

M.C. Gerardo Beltrán Gutiérrez

Diplomado de Especialización en .NET

Modulo 2: Tecnologías de acceso a datos

Page 2: Base de datos

Introducción ADO .NET

Page 3: Base de datos

Definición

• ADO.NET provee un acceso consistente entre fuentes de datos, como MSSQL, OLEDB, XML, etc.

• ADO.NET provee mecanismos para ejecutar comandos y obtener los resultados.

• Cada vez es más común codificar información en XML para pasarla a trabes de conexiones de red. Este modelo es muy diferente al modelo de la era cliente/servidor donde se mantenía una conexión abierta durante la ejecución de un programa.

• ADO.NET fue diseñado para las solucionar las necesidades de este nuevo modelo, con una arquitectura desconectada, integración con XML, representación común de los datos y la posibilidad de combinar datos de varias fuentes de datos.

Page 4: Base de datos

Proveedores de datos

• Un proveedor de datos de .NET es usado para conectarse a una base de datos, ejecutar comandos y obtener los resultados.

• NET Provee los siguientes proveedores de datos:

– MSSQL Server 7.0 o superior. – OLEDB – ODBC – ORACLE

• Además de estos hay varios otros proveedores de datos para otros

manejadores de bases de datos, como: – Npgsql para PostgreSQL – IBM DB2 – SQL Lite – Sybase – Firebird e Interbase – MySQL – Db4objects – Etc.

Page 5: Base de datos

Proveedores de datos

• Es recomendable utilizar un proveedor de datos especifico para el manejador de base de datos a usar si esta está disponible, ya que este aprovecha completamente las características de este, mejorando el rendimiento y la funcionalidad ofrecida.

• La nomenclatura de las clases de ADO.NET es sencilla. Dependiendo de el proveedor de datos el nombre de las clases cambia, la nomenclatura usada es <Proveedor>Nombre de clase.

Page 6: Base de datos

ADO .NET Modelo Desconectado

Page 7: Base de datos

Definición

ADO.NET permite el acceso desconectado a datos. En este modelo se llena un DataSet a través de un DataAdapter.

Cada proveedor de datos debe de brindar su

DataAdapter, el cual debe de ser el encargado de llenar un DataSet y actualizar la base de datos según los cambios en el DataSet.

El DataSet es una colección de DataTable, cada

una de ellas contiene DataRow y DataColumn.

Page 8: Base de datos

DataSet

DataSet

DataTable

DataTable

DataRow

DataColumn

Relaciones

Restricciones Esquema XML

XML

Page 9: Base de datos

Clases del Modelo Desconectado

• DataSet

• DataTable

• DataColumn • DataRow

Page 10: Base de datos

Ejemplo

//Crea Dataset Datos = new DataSet("CuentaBancaria"); //Crea un DataTable DataTable tablaClientes = new DataTable("clientes"); DataColumn colNumcta = new DataColumn("numcta", typeof(int)); DataColumn colNombre = new DataColumn("nombre", typeof(string)); DataColumn colApellidos = new DataColumn(“apellidos", typeof(string)); / DataColumn colSaldo = new DataColumn("saldo", typeof(double)); // Crea las columnas para el DataTable tablaClientes.Columns.Add(colNumcta); tablaClientes.Columns.Add(colNombre); tablaClientes.Columns.Add(colApellidos); tablaClientes.Columns.Add(colSaldo); // Agrega la Tabla al DataSet Datos.Tables.Add(tablaClientes);

Page 11: Base de datos

Ejemplo…

// Crea nuevo Cliente DataRow nuevoCliente = Datos.Tables["clientes"].NewRow(); // Asigna datos al nuevo cliente nuevoCliente["numcta"] = 123; nuevoCliente["nombre"] = "Claudia"; nuevoCliente[“apellidos"] = "Lopez"; nuevoCliente["saldo"] = 1500.55; // Agrega nuevo cliente a tabla de clientes Datos.Tables["clientes"].Rows.Add(nuevoCliente);

Page 12: Base de datos

Ejemplo

//Crea Dataset Datos = new DataSet("CuentaBancaria"); //Crea un DataTable DataTable tablaClientes = new DataTable("clientes"); // Crea las columnas para el DataTable tablaClientes.Columns.Add(new DataColumn("numcta", typeof(int))); tablaClientes.Columns.Add(new DataColumn("nombre", typeof(string))); tablaClientes.Columns.Add(new DataColumn(“apellidos”, typeof(string))); tablaClientes.Columns.Add(new DataColumn("saldo", typeof(double))); // Agrega la Tabla al DataSet Datos.Tables.Add(tablaClientes); // Crea nuevo Cliente DataRow nuevoCliente = Datos.Tables["clientes"].NewRow(); // Asigna datos al nuevo cliente nuevoCliente["numcta"] = 123; nuevoCliente["nombre"] = "Claudia"; nuevoCliente[“apellidos"] = “Lopez"; nuevoCliente["saldo"] = 1500.55;

Page 13: Base de datos

Propiedades de Columna

• Datatype. Establece el tipo de dato a almacenar, el valor prestablecido es string

• Unique . Permite la existencia de valores repetidos, el valor prestablecido es false

• AllowDBNull. Permite que no tenga información la columna, el valor prestablecido es true.

• Caption. Es el nombre de la columna por default es el valor establecido en el constructor.

• AutoIncrement. Establece si el campo es de auto incremento, el valor prestablecido es n.

• AutoIncrementSeed. Establece el valor inicial de la columna, el valor prestablecido es 0.

• AutoIncrementStep. Establece el incremento para un campo incremental, el valor prestablecido es 1.

Page 14: Base de datos

Columna como llave primaria

• Generalmente, una tabla de base de datos tiene una columna o grupo de columnas que identifican de manera exclusiva cada fila de la tabla. Esta columna o grupo de columnas de identificación se denomina llave primaria.

• Al identificar una única DataColumn como la PrimaryKey para una DataTable, la tabla establece automáticamente la propiedad AllowDBNull de la columna como false y la propiedad Unique como true. Para las llaves primarias de varias columnas sólo se establece de forma automática la propiedad AllowDBNull en false.

• La propiedad PrimaryKey de una DataTable recibe como valor una matriz de uno o varios objetos DataColumn, como se muestra en los ejemplos siguientes. En el ejemplo se define una sola columna como llave primaria.

tablaClientes.PrimaryKey = new DataColumn[] { tablaClientes.Columns["numcta"] };

Page 15: Base de datos

Columnas Calculadas

• En ocasiones es necesario contar con columnas con información generada a partir de otras columnas.

tablaClientes.Columns["NombreCompleto"].Expression = "nombre + ‘ ’ + apellidos";

Page 16: Base de datos

Serialización XML

Archivo XML

Objeto DataSet

ReadXML

WriteXML

ArchivoXML

Page 17: Base de datos

Métodos para Serialización XML

• DataSet ofrece manejo directo de documentos y esquemas XML – ReadXml(string ArchXML)

– ReadXmlSchema(string ArchXML)

– WriteXml(string ArchXSD)

– WriteXmlSchema(string ArchXSD)

Page 18: Base de datos

Ejemplo

Datos = new DataSet(); … // Guarda el esquema del DataSet Datos.WriteXmlSchema(@"c:\users\gerardo\datos.xsd"); // Guarda ls Datos en formato xml Datos.WriteXml(@"c:\users\gerardo\datos.xml"); … // Recupera el esquema del DataSet Datos.ReadXmlSchema(@"c:\users\gerardo\datos.xsd"); // Recupera los Datos en formato xml Datos.ReadXml(@"c:\users\gerardo\datos.xml");

Page 19: Base de datos

Eliminación de DataRow

• Delete (). Elimina un DataRow

• Datos.Tables["clientes"].Rows[0].Delete();

Page 20: Base de datos

Cambiar un DataRow

Datos.Tables["clientes"].Rows[0][“cuenta”]=890; Datos.Tables["clientes"].Rows[0][“nombre”]=“Jose”; Datos.Tables["clientes"].Rows[0][“apellidos”]=“Lopez”;

Page 21: Base de datos

Control de Cambios

• Mientras se están realizando cambios en un conjunto de datos mediante la actualización, inserción y eliminación de registros, el conjunto de datos mantiene las versiones original y actual de los registros.

• Se puede realiza el seguimiento de la propiedad RowState de cada fila para indicar si los registros están en su estado original o si se han modificado, agregado o eliminado.

Page 22: Base de datos

Control de Cambios

• Se puede confirmar los cambios llamando al método AcceptChanges de DataSet, DataTable o DataRow.

• Cada fila de datos contiene información sobre la propiedad RowState ( Added, Modified, Deleted, Unchanged).

• Al llamar a AcceptChanges, cualquier objeto DataRow que aún esté en el modo de edición finaliza correctamente el proceso de edición. La propiedad RowState de cada DataRow también cambia; las filas en estado Added y Modified se convierten en Unchanged, y se quitan las filas Deleted.

Page 23: Base de datos

Control de Cambios

• Al llamar a AcceptChanges, cualquier objeto DataRow que aún esté en el modo de edición finaliza correctamente el proceso de edición. La propiedad RowState de cada DataRow también cambia; las filas en estado Added y Modified se convierten en Unchanged, y se quitan las filas Deleted.

• Al invocar al método RejectChanges se cancelar cualquier edición, la fila vuelve a sus valores anteriores y la propiedad RowState permanece sin cambios.

Page 24: Base de datos

Busquedas en DataTable

• Select(). Obtiene una vector de todos los objetos DataRow

DataRow []info =null; info = Datos.Tables["clientes"].Select(); if (info != null) { for (int i = 0; i < info.Length;i++ ) Console.WriteLine("{0} {1}",info[i]["numcta"], info[i]["nombre"]); }

Page 25: Base de datos

Busquedas en DataTable

– Select (string criterio). Obtiene una vector de todos los objetos DataRow que coinciden con los criterios de filtro por orden de clave principal (o si ésta no existe, por orden de adición). info = Datos.Tables["clientes"].Select("nombre = 'claudia‘ ");

if (info != null) { for (int i = 0; i < info.Length; i++ ) Console.WriteLine("{0} {1}",info[i]["numcta"], info[i]["nombre"]); }

Page 26: Base de datos

Busquedas en DataTable

• Select(string criterio, string ordenar). Obtiene una matriz de todos los objetos DataRow que coinciden con los criterios de filtro, en el criterio de ordenación especificado.

info = Datos.Tables["clientes"]. Select("numcta< 10020", "nombre ASC"); if (info != null) { for (int i = 0; i < info.Length; i++ ) Console.WriteLine("{0} {1}",info[i]["numcta"], info[i]["nombre"]); }

Page 27: Base de datos

Buscar un DataRow

• Find(ClavePrincipal) Obtiene la fila especificada por el valor de clave principal. Obtiene la fila especificada por el valor de clave principal.

// Busca numcta (Numero de Cuenta ) DataRow reg = Datos.Tables["clientes"].Rows.Find(10038); if (reg != null) { Console.WriteLine("{0} {1}", reg["numcta"], reg["nombre"]); }

Page 28: Base de datos

Ejercicio

Desarrolle una aplicación para el control del acervo bibliográfico de una biblioteca, tome en cuenta que se tienen libros con préstamo a domicilio. El programa debe contar con lo siguiente: a) Adquirir nuevo libro. b) Adquirir mas libros de alguno registrado c) Prestar un libro (si es posible ya que siempre deberá quedar

uno en la biblioteca) d) Retornar un Libro. e) Mostar una lista de libros con la existencia disponible Agregue al programa la posibilidad de recuperar y guardar la información de los libros en algún archivo.

Page 29: Base de datos

Ejercicio

• Desarrolle una programa que mantenga el control de los empleados de una empresa tomando en cuenta que se tienen los datos personales del empleado (código, nombre, apellidos), una relación de los nombres de los distintos departamentos, así como otra relación de los puestos existentes con su respectivo sueldo.

• No olvide que cada empleado pertenece a un departamento y cuenta con un puesto.

• El programa debe agregar nuevos empleados, departamentos o puestos, además de emitir un listado de los empleados registrados y aunado a de los reportes de los distintos departamentos y puestos.

• Es importante que los datos sean almacenados y recuperados de un archivo.

Page 30: Base de datos

Relaciones en DataSet

Tabla Hija

Tabla Padre

DataSet

padreCol

hijaCol

DataRelation

Page 31: Base de datos

Relaciones en DataSet

Crea una relación

dsRecursosHumanos.Relations.Add( "Departamento_Empleados", dtDepartamentos.Columns["depID"], dtEmpleados.Columns["empDepto"], true );

Page 32: Base de datos

Relaciones en DataSet

• Recuperación de datos padre de una relación

dsRecursosHumanos.Relations.Add( "Departamento_Empleados", dtDepartamentos.Columns["depID"], dtEmpleados.Columns["empDepto"] );

for (int i = 0; i < dtEmpleados.Rows.Count; i++) { // Recupera datos de la relacion DataRow drDepto = dtEmpleados.Rows[i].GetParentRow("Departamento_Empleados"); Console.WriteLine("{0} {1} {2} {3}", dtEmpleados.Rows[i]["empID"], dtEmpleados.Rows[i]["empNombre"], drDepto["depNombre"] ); }

Page 33: Base de datos

Relaciones en DataSet

• Recuperación de datos hijos de una relación

dsRecursosHumanos.Relations.Add( "Departamento_Empleados", dtDepartamentos.Columns["depID"], dtEmpleados.Columns["empDepto"] );

for (int i = 0; i < dtDepartamentos.Rows.Count; i++) { // Muestra los departamentos Console.WriteLine(" Departamento {0} {1} ", dtDepartamentos.Rows[i]["depID"], dtDepartamentos.Rows[i]["depNombre"]); // Recupera Datos de empleados del departamento DataRow[] drEmpleados = dtDepartamentos. Rows[i].GetChildRows("Departamento_Empleados"); // Muestra los empleados del departamento foreach (DataRow emp in drEmpleados ){ Console.WriteLine("{0} {1} {2}",emp["empID"], emp["empNombre"], emp["empApellidos"]); }

Page 34: Base de datos

Actualización y eliminación en cascada

• Al establecer una relación entre tablas se establece restricciones que al hacer actualizaciones o eliminaciones en la tabla padre se aplican en cascada a la tabla hija.

Page 35: Base de datos

Ejercicio

• Del Ejercicio anterior emita un reporte de los empleados por departamento y de los empleados por puesto, así como eliminar empleados, departamento o puesto.

Page 36: Base de datos

Restricciones en DataSet

• Se pueden utilizar restricciones con el fin de mantener la integridad de los datos. Una restricción es una regla automática que se aplica a una columna relacionada, que determina cómo proceder cuando se modifica de alguna manera el valor de una fila.

• Existen dos tipos de restricciones en ADO.NET: ForeignKeyConstraint y UniqueConstraint. De forma predeterminada, las dos restricciones se crean automáticamente al crear una relación entre dos o más tablas agregando DataRelation al DataSet. Sin embargo, se puede deshabilitar este comportamiento especificando false en el tercer parámetro al crear la relación.

Page 37: Base de datos

Restricciones en DataSet

ForeignKeyConstraint • Esta regla establece cómo se propagan las

actualizaciones y eliminaciones a las tablas relacionadas. Por ejemplo, si se actualiza o elimina el valor de una fila de una tabla y el mismo valor también se utiliza en una o varias tablas relacionadas, ForeignKeyConstraint determinará qué sucede en las tablas relacionadas.

• Las restricciones se aplican cuando la propiedad System.Data.DataSet.EnforceConstraints del DataSet es true

• Las propiedades DeleteRule y UpdateRule de ForeignKeyConstraint definen la acción que se ha de realizar cuando el usuario intente eliminar o actualizar una fila en una tabla relacionada.

Page 38: Base de datos

Restricciones en DataSet

Establecimiento de reglas Descripción

Cascade Elimina o actualiza las filas relacionadas.

SetNull Establece los valores de las filas relacionadas en DBNull.

SetDefault Establece los valores de las filas relacionadas en el valor predeterminado.

None No realiza ninguna acción en las filas relacionadas. Este es el valor predeterminado.

Estos valores se encuentran en la enumeración Rule

Page 39: Base de datos

Restricciones en DataSet

• Crear una Restricción

ForeignKeyConstraint fkEmpleadosDeparatamento = new ForeignKeyConstraint( “fkEmpleados_Departamentos", dtDepartamentos.Columns["depID"], dtEmpleados.Columns["empDepto"]); fkEmpleadosDeparatamento.DeleteRule = Rule.None; fkEmpleadosDeparatamento.UpdateRule = Rule.Cascade; dtEmpleados.Constraints.Add(fkEmpleadosDepartamento);

Page 40: Base de datos

Ejercicio

• Complemente el Ejercicio anterior permitiendo realizar actualizaciones a las claves y nombres de departamento así como a las claves, nombres de puesto y sueldo.

Page 41: Base de datos

Ejercicio

• Al ejercicio Biblioteca agregue la posibilidad de mantener un catalogo de usuarios, los cuales deberán esta relacionados con los prestamos realizados.

• Debiendo además contar con las opciones de suspender usuario, activar y eliminar usuario siempre y cuando no cuente con libros prestados.

Page 42: Base de datos

Fuentes de datos

Archivo XML

Objeto DataSet

ReadXML

WriteXML

ArchivoXML

Base de datos

DataAdapter

SQL Server MySQL

PostgreSQL Oracle Access

Page 43: Base de datos

Acceso base de datos de SQL Server

• Utilizar espacios de nombre

– System.Data.SqlClient – System.Data.SqlTypes

Page 44: Base de datos

Crear una conexión con SQL Server

• Uso de SqlConnection Establecer los parámetros de la cadena de conexión

– data source – initial catalog – uid – pwd

string strCon = @“Data Source = miservidor.net; Initial Catalog=inventario; UID=userdb; PWD=123;"; SqlConnection conexion = new SqlConnection(strCon); conexion.Open();

Page 45: Base de datos

Crear una conexión con SQL Server

• Otro uso de SqlConnection Establecer los parámetros de la cadena de conexión

– Server – DataBase – uid – pwd

string strCon = @“Server=miservidor.net; DataBase=clientes; UID=userdb; PWD=123;"; SqlConnection conexion = new SqlConnection(strCon); conexion.Open();

Page 46: Base de datos

Creación de Base de Datos y tablas en SQL Server

• CREATE DATABASE clientes;

• USE clientes;

• CREATE TABLE cuentas (numcta INT PRIMARY KEY IDENTITY(1,1), nombre VARCHAR(40), saldo DECIMAL);

Page 47: Base de datos

DataSet con inserción en SQL Server

// Define cadena de conexión string cadenaConexion = @"server=db.gerardobeltran.net; DataBase=clientes;uid=techsoft; pwd=12AB34cd"; // Establece Objeto de Conexión SqlConnection conexionSql = new SqlConnection(cadenaConexion); //Abre Conexión con el servidor conexionSql .Open(); // Crea objeto de Comando Select SqlCommand comandoSelect = conexionSql.CreateCommand(); //Define Tipo de Instruccion a ejecutar (SQL) comandoSelect.CommandType = CommandType.Text; // Define Cadena Sql de consulta string cadenaSql = @"SELECT * FROM cuentas"; // Establece cadena Sql para el comando Select comandoSelect.CommandText = cadenaSql;

Page 48: Base de datos

DataSet con inserción en SQL Server

// Crea objeto adaptador de datos SqlDataAdapter daClientes = new SqlDataAdapter(comandoSelect); // Crea Comando de construccion de intrucciones SQL SqlCommandBuilder cbClientes = new SqlCommandBuilder(daClientes); // Crea Data ser para contener los datos de la consulta DataSet dsClientes = new DataSet("Clientes"); // Obtiene el esquema de la tabla cuentas desde el servidor daClientes.FillSchema(dsClientes, SchemaType.Source, "Cuentas"); // Obtiene los datos de la tabla cuentas desde el servidor daClientes.Fill(dsClientes, "Cuentas"); // Crea una instancia de una nuevo registro DataRow drCliente = dsClientes.Tables["Cuentas"].NewRow(); // Captura los nuevos datos Console.Write("Nombre: "); drCliente["nombre"] = Console.ReadLine(); Console.Write("Saldo: ");drCliente["saldo"] = Convert.ToDouble(Console.ReadLine());

Page 49: Base de datos

DataSet insertando en SQL Server

// Agrega el nuevo registro la tabla del DataSet dsClientes.Tables["Cuentas"].Rows.Add(drCliente); Console.WriteLine("El numero de cuenta asignado es: {0}", drCliente["numcta"]); Envia los datos al servidor SQL daClientes.Update(dsClientes, "Cuentas"); // Libera el DataSet daClientes.Dispose(); //Libera el adaptador de datos daClientes.Dispose(); // Cierra la conexion con el servidor conexionSql.Close();

Page 50: Base de datos

DataSet seleccionando desde SQL Server

// Define cadena de conexión string cadenaConexion = @"server=db.gerardobeltran.net; DataBase=clientes;uid=techsoft; pwd=12AB34cd"; // Establece Objeto de Conexión SqlConnection conexionSql = new SqlConnection(cadenaConexion); //Abre Conexión con el servidor conexionSql .Open(); // Crea objeto de Comando Select SqlCommand comandoSelect = conexionSql.CreateCommand(); //Define Tipo de Instruccion a ejecutar (SQL) comandoSelect.CommandType = CommandType.Text; // Define Cadena Sql de consulta string cadenaSql = @"SELECT * FROM cuentas"; // Establece cadena Sql para el comando Select comandoSelect.CommandText = cadenaSql;= cadenaSql;

Page 51: Base de datos

DataSet seleccionando desde SQL Server

// Crea objeto adaptador de datos SqlDataAdapter daClientes = new SqlDataAdapter(comandoSelect); // Crea Comando de construccion de intrucciones SQL SqlCommandBuilder cbClientes= new SqlCommandBuilder(daClientes); // Crea Data ser para contener los datos de la consulta DataSet dsClientes = new DataSet("Clientes"); // Obtiene el esquema de la tabla cuentas desde el servidor daClientes.FillSchema(dsClientes, SchemaType.Source, "Cuentas"); // Obtiene los datos de la tabla cuentas desde el servidor daClientes.Fill(dsClientes, "Cuentas"); // Crea una instancia del DataTable Clientes DataTable dtClientes = dsClientes.Tables["Cuentas"]; for (int i=0; i<dtClientes.Rows.Count; i++){ Console.WriteLine("{0} {1} {2}", dtClientes.Rows[i]["numcta"], dtClientes.Rows[i]["nombre"], dtClientes.Rows[i]["saldo"]); }

Page 52: Base de datos

Acceso base de datos de MySql

• Instalar Proveedor de acceso a datos de Mysql. – Descargar de www.mysql.com

• Agregar referencia a biblioteca de MySql en

Visual Studio desde la pestaña .NET

• Utilizar espacios de nombre – MySql.Data.MySqlClient – MySql.Data.Types – MySql.Data.Common

Page 53: Base de datos

Crear una conexión con MySQL

• Uso de MySqlConnection Establecer los parámetros de la cadena de conexión

– Server – DataBase – uid – pwd

string strCon = @"server=miservidor.net; DataBase=clientes;uid=userdb; pwd=123;"; MySqlConnection conexion = new MySqlConnection(strCon); conexion.Open();

Page 54: Base de datos

Crear una conexión con MySQL

• Otro uso de MySqlConnection Establecer los parámetros de la cadena de conexión

– data source – initial catalog – uid – pwd

string strCon = @"data source = miservidor.net; initial catalog=inventario; uid=userdb; pwd=123;"; MySqlConnection conexion = new MySqlConnection(strCon); conexion.Open();

Page 55: Base de datos

Creación de Base de Datos y tablas en MySQL

• CREATE DATABASE clientes;

• USE clientes;

• CREATE TABLE cuentas (numcta INT PRIMARY KEY AUTO_INCREMENT, nombre VARCHAR(40), saldo DECIMAL);

Page 56: Base de datos

Acceso a Productos de Office

• Para el caso de acceso a productos (Access y Excel) de Office 2007 y 2010, se requiere de proveedores actualizados por lo que es necesario descargarlos gratuitos de http://www.microsoft.com/es-es/download/details.aspx?id=13255

• El espacio de nombres requerido son: – System.Data.OleDb;

Page 57: Base de datos

Crear una conexión con ACCESS

• Uso de OleDbConnection Establecer los parámetros de la cadena de conexión

– data source – Provider – Password

string strCon = @"Data Source= c:\users\gerardo\archdb.accdb; Provider=Microsoft.ACE.OLEDB.12.0; Jet OLEDB:Database Password=123;"; OleDbConnection conexion = new OleDbConnection(strCon); conexion.Open();

Page 58: Base de datos

Crear una conexión con EXCEL

• Uso de OleDbConnection Establecer los parámetros de la cadena de conexión

– data source – Provider – Extended Properties

string strCon = @"Data Source= c:\basededatos\archdb.xlsx; Provider=Microsoft.ACE.OLEDB.12.0; Extended Properties=Excel 12.0;"; OleDbConnection conexion = new OleDbConnection(strCon); conexion.Open();

Page 59: Base de datos

Relaciones entre tablas

En SQL Server create table cuentas ( numcta int IDENTITY(100,1) PRIMARY KEY, nombre varchar(40) );

create table movimientos ( nummov int identity(1000,1) PRIMARY KEY, tipo int, cantidad decimal , movcta int references cuentas(numcta) ) ;

Page 60: Base de datos

Relaciones entre tablas

string cadenaConexion = @"Data Source=servidordb.net; Initial catalog=clientes;uid=sa; pwd=12345678"; SqlConnection conexionSql = new SqlConnection(cadenaConexion); conexionSql.Open(); // Crea adaptador para cada tabla SqlDataAdapter daCuentas = new SqlDataAdapter(@"SELECT * FROM cuentas",conexionSql); SqlDataAdapter daMovimientos = new SqlDataAdapter(@"SELECT * FROM movimientos", conexionSql); // Crea DataSet DataSet dsClientes = new DataSet("Clientes"); // Recupera información de la tabla cuentas desde la base de datos daCuentas.FillSchema(dsClientes, SchemaType.Source, "Cuentas"); daCuentas.Fill(dsClientes, "Cuentas"); // Recupera información de la tabla movimientos desde la base de datos daMovimientos.FillSchema(dsClientes, SchemaType.Source, "Movimientos"); daMovimientos.Fill(dsClientes, "Movimientos");

Page 61: Base de datos

Relaciones entre tablas

// Agrega Una relacion Cliente-Movimientos dsClientes.Relations.Add("Cliente_Movimientos", dsClientes.Tables["cuentas"].Columns["numcta"], dsClientes.Tables["movimientos"].Columns["movcta"] false); // Crea una instancia para cada tabla DataTable dtClientes = dsClientes.Tables["Cuentas"]; DataTable dtMovimientos = dsClientes.Tables["Movimientos"]; // Muestra los clientes con sus movimientos for (int i = 0; i < dtClientes.Rows.Count; i++){ Console.WriteLine("{0} {1} {2}", dtClientes.Rows[i]["numcta"], dtClientes.Rows[i]["nombre"]); DataRow[] Movs = dtClientes.Rows[i].GetChildRows("Cliente_Movimientos"); foreach (DataRow reg in Movs){ Console.WriteLine("{0} {1} {2}", reg["nummov"], Convert.ToInt32(reg["tipo"]) == 1) ? "Deposito" : "Retiro", reg["cantidad"]); } }

Page 62: Base de datos

Creando Comandos insert, update y delete con ComandBuilder

string cadenaConexion = @"Data Source=servidordb.net; Initial catalog=clientes;uid=sa; pwd=12345678"; SqlConnection conexionSql = new SqlConnection(cadenaConexion); conexionSql.Open(); // Crea adaptador para tabla cuentas SqlDataAdapter daCuentas = new SqlDataAdapter(@"SELECT * FROM cuentas",conexionSql); // Crea comandos insert, update y delete SqlCommandBuilder cbClientes = new SqlCommandBuilder(daCuentas);

Page 63: Base de datos

Creando Comandos insert

string cadenaConexion = @"Data Source=servidordb.net; Initial catalog=clientes;uid=sa; pwd=12345678"; SqlConnection conexionSql = new SqlConnection(cadenaConexion); conexionSql.Open(); // Crea adaptador para tabla cuentas SqlDataAdapter daCuentas = new SqlDataAdapter(@"SELECT * FROM cuentas",conexionSql); // Crea comando insert daCuentas.InsertCommand = new SqlCommand(@"insert into cuentas (nombre, saldo) values (@nombre, @saldo)",conexionSql); // Define parametros con el nombre de la columnas daCuentas.InsertCommand.Parameters.Add( new SqlParameter("@nombre", SqlDbType.VarChar,40, "nombre")); daCuentas.InsertCommand.Parameters.Add( new SqlParameter("@saldo", SqlDbType.Decimal,10, "saldo"));

Page 64: Base de datos

Creando Comandos Update

string cadenaConexion = @"Data Source=servidordb.net; Initial catalog=clientes;uid=sa; pwd=12345678"; SqlConnection conexionSql = new SqlConnection(cadenaConexion); conexionSql.Open(); // Crea adaptador para tabla cuentas SqlDataAdapter daCuentas = new SqlDataAdapter(@"SELECT * FROM cuentas",conexionSql); // Crea comando update daCuentas.InsertCommand = new SqlCommand(@"update cuentas set nombre=@nombre, saldo=@saldo where numcta=@numcta", conexionSql); // Define parametros con el nombre de la columnas daCuentas.UpdateCommand = new SqlCommand(@"update cuentas set nombre=@nombre, saldo=@saldo where numcta=@numcta", conexionSql); daCuentas.UpdateCommand.Parameters.Add( new SqlParameter("@nombre", SqlDbType.VarChar, 40, "nombre")); daCuentas.UpdateCommand.Parameters.Add( new SqlParameter("@saldo", SqlDbType.Decimal, 10, "saldo")); daCuentas.UpdateCommand.Parameters.Add( new SqlParameter("@numcta", SqlDbType.Int, 10, "numcta"));

Page 65: Base de datos

Creando Comandos Delete

string cadenaConexion = @"Data Source=servidordb.net; Initial catalog=clientes;uid=sa; pwd=12345678"; SqlConnection conexionSql = new SqlConnection(cadenaConexion); conexionSql.Open(); // Crea adaptador para tabla cuentas SqlDataAdapter daCuentas = new SqlDataAdapter(@"SELECT * FROM cuentas",conexionSql); // Crea comando update daCuentas.InsertCommand = new SqlCommand( @"delete from cuentas where numcta=@numcta", conexionSql); // Define parametros con el nombre de la columnas daCuentas.DeleteCommand.Parameters.Add( new SqlParameter("@numcta", SqlDbType.Int, 10, "numcta"));