Anexo2: Test de estrés

Documentos relacionados
6. Test de Rendimiento

Conexión SQL Server y C# (Consola)

Manejo de una Base de Datos Microsoft SQL Server. a través de Visual C #, vía instrucciones SQL.

Practica 7 Conexión a su base de datos. Optativa II

GUIA PRACTICA 1 VISUAL C#.Net SQL SERVER 2012 MANTENIMIENTO DE UNA TABLA

Creación de un sistema ABC

Bases de Datos Access y C#. Insert, select, update, delete. 1. Crea una base de Datos en Access

Conexión a Base de Datos.

Crear una interfaz gráfica con Visual C#.NET de manera básica Utilizar las sentencias de DML de base de datos en Visual C#.NET

Programació amb C#.NET

Tutorial : Hacer Combos Dependientes tipo Departamento Ciudad en ASP. Net

Entendiendo ADO.NET con C#,Mono y PostgreSQL

Insertar datos en una tabla MySQL en C# WPF

Objetivo: instanciar desde mi Panel de Control, la ventana de Registro de Clientes, la cual

Python desde Cero: Bases de Datos

GUÍA DE TRABAJO N 11 LENGUAJE C# Programación de Software Articulación SENA Grado 10 Ing. Néstor Raúl Suarez Perpiñan Página 2 de 11

EXAMEN PRACTICO UNIDAD 7 CONCURRENCIA DISEÑO DEL FORMULARIO

Creando CRUD en PHP: operaciones básicas para la gestión de bases de datos

Unidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos

Durante este tema se van a tratar de 2 tipos de errores: los de ejecución y los lógicos. Ignoramos los errores de compilación.

Guia#9: Punteros en C#.

Bases de Datos. Diseño y Programación Avanzada de Aplicaciones. Curso

Base de datos En este tutorial vamos a trabajar con la siguiente base de datos. Programación II Turno Mañana

Laboratorio de Programación III

Código de la Aplicación

GUÍA DE TRABAJO N 9 - LENGUAJES C# + SQL Educación Media Fortalecida Programación de Software GRADO 11 Ing. Néstor Raúl Suarez Perpiñan Página 1 de 8

Base de Datos SQL Server. create database CRUD; use CRUD;

UNIVERSIDAD DISTRITAL FRANCSICO JOSE DE CALDAS FACULTAD DE INGENIERIA INGENIERIA DE SISTEMAS PROGRAMACION AVANZADA TALLER DE CONEXIÓN A BASES DE DATOS

Como crear un servicio web con MVC, WCF por medio de capas conectando con una BD. (Paso a Paso)

Creación de proyectos usando Java/MySQL

Bases de Datos Ejercicio Número 2 Bogotá, Diciembre 5 de 2013

Programación de Consultas SQL ADO.Net LDP / DUOC-AV

Tema: Introducción al IDE de Microsoft Visual C#.

Gestión de la Información Práctica 1

Entendiendo LINQ (Language Integrated Query) con C# y Mono

Como conectar SQL Server con C#?

EVALUACIÓN. Programa de trabajador

Día 2: Utilizando controles de datos en Visual Studio 2008.

Taller: Introducción a Windows Communication Foundation

I.- Objetivo. II.- Introducción

GUÍA DE TRABAJO N 7 LENGUAJE C# Educación Media Fortalecida Programación de Software Grado 11 Ing. Néstor Raúl Suarez Perpiñan Página 1 de 8

ADO.NET con Base de datos SQL Server

Java y Access. 4. En nuestra pantalla aparecerá ahora la pestaña DSN usuario seleccionada. Para crear un nuevo perfil haremos click en Agregar...

Tema: Conexión a Base de Datos.

GUÍA DE TRABAJO GRADO 11 Programación de. Software Ing. Néstor Raúl Suarez Perpiñan Página 1 de 8

Entendiendo ADO.NET con Mono y PostgreSQL (III)

TEMA 7. PROVEEDORES Y CONEXIÓN A BASES DE DATOS

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS COORDINACION DE COMPUTACIÓN

GOBIERNO DEL PRINCIPADO DE ASTURIAS VICECONSEJERÍA DE PRESUPUESTOS Y ADMINISTRACIÓN PÚBLICA

Práctica sobre compartición de instancias remotas.

Guia#12: Tema: Archivos en C#.

Célula UABC-Live.net. Universidad Autónoma. de Baja California. Facultad de Ciencias Químicas. e Ingeniería.

GUÍA DE TRABAJO GRADO 11. Articulación SENA Programación de Software Ing. Néstor Raúl Suarez Perpiñan Página 1 de 6

GALA. ADO Modo Conectado. Modelo de Base de Datos Relacional. m018a Curso Manejo de Datos con Visual Basic 2010, 24 h

Trabajando con bases de datos. ClaseOracleBD

Tema: Métodos de Ordenamiento. Parte 1.

Un proyecto de IBM llamado Sistem/R construye un prototipo simple llamado SQUARE que después se transformó en SQL.

Los procedimientos almacenados son nuevas funcionalidades de la versión de MySQL 5.0. Un procedimiento

BENEMERITA UNIVERSIDADD AUTONOMA DE PUEBLA FACULTAD DE CIENCIAS DE LA COMPUTACIÓN LICENCIATURA EN CIENCIAS DE LA COMPUTACIÓN

Manejo de Bases de Datos Mysql en Lenguaje C

INSERCIÓN DE UN REGISTRO CON PHP Y MYSQL

Agenda..NET C# Laboratorio #1

Visual Basic.NET : Acceso a Datos

TUTORIAL CONEXIÓN SQLSERVER CON JAVA DESDE ECLIPSE

Acceso a Base de Datos

Aprender los conceptos, manejo, usos y aplicación de heaps a fin de utilizarlos para el desarrollo de aplicaciones

Fundamentos de Programación CAPÍTULO 3 EL LENGUAJE C# Ing. Bruno López Takeyas, M.C. 1

k. Son métodos de la clases y respectivamente, que analiza un para devolver un entero con

SEGURIDAD EN LAS BASES DE DATOS

Tema: DESARROLLO DE APLICACIONES CON VISUAL STUDIO-NET (PARTE I)

APÉNDICE A: ACCESO A UNA BASE DE DATOS CON JDBC

Tema: Estructuras de Selección en C#.

Mecanismos de acceso a datos usando ADO.NET

Práctica No. 3. Operaciones Básicas con Hibernate Actualizar y Eliminar

Vamos a definir ambos modos y después veremos, mediante sendos ejemplos, cómo trabajar en ellos con ADO.NET.

Ing Eddy Ruiz Largaespada

3.- Desarrollo e implementación del sistema.

Ingeniería en Desarrollo de software Cuatrimestre 07. Asignatura: Programación.NET 1. Clave:

HOJA DE EJERCICIOS 5 PROGRAMACIÓN CON EXCEPCIONES EN JAVA

Errores que rompen la Regla de integridad de las entidades y el DBMS reporta un error.

Acceso a BDs en Java: JDBC

Prácticas Ingeniería del Software 3º

Introducción a SQL (DDL)

Manual de Sentencias Básicas en SQL

PHP y Acceso a Datos

PHP Programming. Learn how PHP works Learn the basic syntax of PHP Learn to create dynamic interactive pages with PHP

VISUAL BASIC.NET. NIVEL COMPLETO

Unidad IV. Aplicaciones sobre Base de Datos

Consideremos el siguiente ejemplo que crea y se inserta en las tablas que definen la identidad basada en la clave principal como un índice agrupado:

PROGRAMACIÓN EN JAVA. { una línea para definir, crear o ejecutar ; }

c) Explicar qué es un BreakPoint en Netbeans y para qué sirve. 0,5 punto

Trabajos de Ampliación. Bases de datos NoSQL.

Automatización Industrial

1. Se usará la Base de Datos llamada. 2. Borrar la tabla CtasBanc anterior y crearla: 5.1 Procedimientos y Funciones Almacenados SQL Server

Tema 4. DML (Parte I)

Transcripción:

Anexo2: Test de estrés A continuación se ofrece el código utilizado para la realización del test de estrés al que se han sometido las bases de datos bajo estudio, y cuyos resultados se mostraron en el apartado 7: Test de Rendimiento. El código ha sido escrito en C# (C Sharp), y se ha utilizado Visual Studio C# 2010 Express de Microsoft para la depuración y prueba del código. Se han utilizado los drivers proporcionados por los proveedores de las bases de datos para poder programar en C#, y cuyos enlaces aparece indicados en las referencias. Se indica también el hardware utilizado en dicha prueba Hardware Software S.O Windows 7 Apache 2.2.8 Pentium Dual Core E-5300 4GB RAM 600GB disco duro PHP 5.2.6 MySQL 5.0.51b SQL Server 2012 MongoDB 2.0.3 MarkLogic 5 103

@testmysql.cs Autor: Sergio Bellido Sánchez Proyecto Final de Carrera using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using MySql.Data; using MySql.Data.Types; using MySql.Data.MySqlClient; Conjunto de operaciones que encaminada a testear el rendimiento de la base de datos MySQL para una comparación de resultados con otras bases de datos Mayo 2012 namespace BenchmarkingMYSQL Para la prueba se han definido dos agrupaciones de datos, que están relacionados entre sí y que han sido elegidos para cubrir las necesidades de recolección datos de los empleados de una empresa ficticia public class Afiliado tipo que sirve para la indexación de contenido public Guid _id get; set; public string Nombre get; set; public string Apellido get; set; public string Email get; set; lista de objetos fuertemente tipada public List<Puesto> Puestos get; set; public class Puesto public Guid AfiliadoId get; set; public string Centro get; set; public string Ciudad get; set; public string Cargo get; set; public string Estudios get; set; clase que contiene el código de entrada a la aplicación de testeo de rendimiento class Program static void Main(string[] args) "Comandos" es una clase que contiene varios métodos de interés. Se crearán varias instancias a medida que se deban probar las inserciones, selecciones y actualizaciones de cada base de datos Comandos uno = new Comandos(); creamos una lista de índices Guid[] guids = new Guid[500]; guids[i] = Guid.NewGuid(); Guid[] ids = guids; Clase que se utiliza para medir el tiempo transcurrido entre un "start" y un "stop" Stopwatch tiempo = new Stopwatch(); 104

--------------------------- Inserción de datos en MySQL --------------------------- Comandos dos = new Comandos(); Se va a realizar una simple iteración que va a crear 500 veces los mismos datos y va a insertarlos posteriormente en la base de datos. Dado el propósito de este test, es suficiente con crear los mismos datos un determinado número de veces, no necesitando campos diferentes a cada ocasión El método CrearFicha va a dar valores a las clases declaradas para servir de modelo de datos Afiliado compasql = dos.crearficha(ids[i],"sergio","bellido", "sergio(arroba)", "Dos Hermanas", "Sevilla", "Refuerzo", "Ingeniero"); Se proporciona un email incorrecto para que pueda ser actualizado posteriormente a una forma correcta Insertamos las fichas creadas anteriormente en MySQL Usamos char ante los problemas que presentan los ids únicos en Mysql. Un char(36) es el equivalente Char j = dos.insertarafiliadosql(compasql); Obtenemos las estadísticas temporales de la inserción de datos Console.WriteLine("Inserción de datos en MySQL: Tiempo empleado en ms = " + --------------------------- Selección de datos en MySQL --------------------------- Comandos tres = new Comandos(); Se realiza una iteración en la que se va a seleccionar cada vez los campos de las clases que sirven de modelo de datos a partir de la id única que previamente se creó y asignó método que permite la selección de datos a raíz de una ID única Afiliado seleccion = tres.selectsql(ids[i]); Console.WriteLine("Selección de datos en MySQL: Tiempo empleado en ms = " + 105

------------------------------- Actualización de datos en MySQL ------------------------------- Comandos cuatro = new Comandos(); Se realiza una iteración que para cada una de las IDs individuales actualiza el campo que se haya visto modificado de aquellos que se les pasa. En este caso, será el campo email el que sea diferente, y por tanto, el que debe ser actualizado en la base de datos Afiliado actualizado = cuatro.crearficha(ids[i], "Sergio", "Bellido", "sergio@micorreo.com", "Dos Hermanas", "Sevilla", "Refuerzo", "Ingeniero"); El método ActualizarSql va a modificar el valor de aquellos campos que hayan sido cambiados. El email cuatro.actualizarsql(actualizado); Console.WriteLine("Actualización de datos en MySQL: Tiempo empleado en ms = " + 106

@testmongodb.cs Autor: Sergio Bellido Sánchez Proyecto Final de Carrera using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; using MongoDB.Bson.Serialization.IdGenerators; using MongoDB.Driver; using MongoDB.Driver.Builders; Conjunto de operaciones que encaminada a testear el rendimiento de la base de datos MongoDB para una comparación de resultados con otras bases de datos Mayo 2012 namespace BenchmarkingMongoDB Para la prueba se han definido dos agrupaciones de datos, que están relacionados entre sí y que han sido elegidos para cubrir las necesidades de recolección datos de los empleados de una empresa ficticia public class Afiliado tipo que sirve para la indexación de contenido public Guid _id get; set; public string Nombre get; set; public string Apellido get; set; public string Email get; set; lista de objetos fuertemente tipada public List<Puesto> Puestos get; set; public class Puesto public Guid AfiliadoId get; set; public string Centro get; set; public string Ciudad get; set; public string Cargo get; set; public string Estudios get; set; clase que contiene el código de entrada a la aplicación de testeo de rendimiento class Program static void Main(string[] args) ----------------------------- Inserción de datos en MongoDB ----------------------------- Comandos indice = new Comandos(); IndiceMongo es un método potente que permite indexar los datos, lo cual va a acelerar mucho el proceso en una basede datos de tipo NoSQL indice.indicemongo(); Comandos cinco = new Comandos(); 107

Afiliado compamongo = cinco.crearficha(ids[i], "Sergio", "Bellido", "sergio(arroba)", "Dos Hermanas", "Sevilla", "Refuerzo", "Ingeniero"); Se insertarán las fichas creadas en la base de datos MongoDB Guid j = cinco.insertarmongodb(compamongo); Console.Write("Inserción de datos en MongoDb: Tiempo empleado en ms = " + ----------------------------- Selección de datos en MongoDB ----------------------------- Comandos seis = new Comandos(); llamamos a la función seleccionarmongodb para hacer una consulta en base al id indicado Afiliado selectmongo = seis.seleccionarmongodb(ids[i]); Console.WriteLine("Selección de datos en MongoDb: Tiempo empleado en ms =" + --------------------------------- Actualización de datos en MongoDB --------------------------------- Comandos siete = new Comandos(); Afiliado actualizamongo = siete.crearficha(ids[i], "Sergio", "Bellido", "sergio@micorreo.com", "Dos Hermanas","Sevilla", "Refuerzo", "Ingeniero"); se actualiza el campo modificado, email. En este caso para MongoDB siete.actualizarmongodb(actualizamongo); Console.WriteLine("Actualización de datos en MongoDb: Tiempo empleado en ms = " + 108

@testsqlserver.cs Autor: Sergio Bellido Sánchez Proyecto Final de Carrera using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Data; using System.Data.SqlTypes; using System.Data.SqlClient; Conjunto de operaciones que encaminada a testear el rendimiento de la base de datos SQLServer para una comparación de resultados con otras bases de datos Mayo 2012 namespace BenchmarkingSqlServer Para la prueba se han definido dos agrupaciones de datos, que están relacionados entre sí y que han sido elegidos para cubrir las necesidades de recolección datos de los empleados de una empresa ficticia public class Afiliado tipo que sirve para la indexación de contenido public Guid _id get; set; public string Nombre get; set; public string Apellido get; set; public string Email get; set; lista de objetos fuertemente tipada public List<Puesto> Puestos get; set; public class Puesto public Guid AfiliadoId get; set; public string Centro get; set; public string Ciudad get; set; public string Cargo get; set; public string Estudios get; set; clase que contiene el código de entrada a la aplicación de testeo de rendimiento class Program static void Main(string[] args) -------------------------------- Inserción de datos en SQL Server -------------------------------- Comandos ocho = new Comandos(); llamamos a la función CrearFicha con todos los atributos para pasar los valores a las clases declaradas 109

Afiliado compasqlserver = ocho.crearficha(ids[i], "Sergio", "Bellido", "sergio(arroba)", "Dos Hermanas", "Sevilla", "Refuerzo", "Ingeniero"); Insertamos las fichas de afiliados creadas anteriormente, esta vez en SQLServer Guid k = ocho.insertarsqlserver(compasqlserver); Console.WriteLine("Inserción de datos en SQL Server: Tiempo en ms = " + -------------------------------- Selección de datos en SQL Server -------------------------------- Comandos nueve = new Comandos(); Afiliado seleccionserver = nueve.selectsqlserver(ids[i]); Console.WriteLine("Selección de datos en SQL Server: Tiempo en ms = " + ------------------------------------ Actualización de datos en SQL Server ------------------------------------ Comandos diez = new Comandos(); Afiliado actualizadoserver = diez.crearficha(ids[i], "Sergio", "Bellido", "sergio@micorreo.com", "Dos Hermanas","Sevilla", "Refuerzo", "Ingeniero"); Se actualizan los valores de las fichas. En este caso se ha modificado únicamente el valor del correo electrónico cuatro.actualizarsqlserver(actualizadoserver); Console.WriteLine("Actualización de datos en SQL Server: Tiempo en ms = " + Console.WriteLine("Hay " + totalcellfin.tostring() + " filas en base de datos MySQL y " + totaldocsfin.tostring() + " documentos en base de datos MongoDB y" + totalcellfinserver.tostring() + "filas en la base de datos SQL Server"); 110

@testmarklogic.cs Autor: Sergio Bellido Sánchez Proyecto Final de Carrera using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using Marklogic.Xcc; using Marklogic.Xcc.Session; using Marklogic.Xcc.Request; using Marklogic.Xcc.ContentSource; using Marklogic.Xcc.ContentSourceFactory; using Marklogic.Xcc.ResultSequence; Conjunto de operaciones que encaminada a testear el rendimiento de la base de datos MarkLogic para una comparación de resultados con otras bases de datos Mayo 2012 namespace BenchmarkingMarklogic Para la prueba se han definido dos agrupaciones de datos, que están relacionados entre sí y que han sido elegidos para cubrir las necesidades de recolección datos de los empleados de una empresa ficticia public class Afiliado tipo que sirve para la indexación de contenido public Guid _id get; set; public string Nombre get; set; public string Apellido get; set; public string Email get; set; lista de objetos fuertemente tipada public List<Puesto> Puestos get; set; public class Puesto public Guid AfiliadoId get; set; public string Centro get; set; public string Ciudad get; set; public string Cargo get; set; public string Estudios get; set; clase que contiene el código de entrada a la aplicación de testeo de rendimiento class Program static void Main(string[] args) -------------------------------- Inserción de datos en MARKLOGIC -------------------------------- ContentCreateOptions options = ContentCreateOptions.NewTextInstance(); RequestOptions options1 = new RequestOptions(); Comandos xmluno = new Comandos(); XmlTextWriter compaxml = null; 111

llamamos a la función CrearFicha con todos los atributos para pasar los valores a las clases declaradas compaxml = xmluno.crearficha(ids, "Sergio", "Bellido", "sergio(arroba)", "Dos Hermanas","Sevilla", "Refuerzo", "Ingeniero"); Insertamos las fichas de afiliados creadas anteriormente, esta vez en MARKLOGIC Guid k = xmluno.insertarmarklogic(compaxml, options); Console.WriteLine("Inserción de datos en MARKLOGIC Server: Tiempo en ms = " + -------------------------------- Selección de datos en MARKLOGIC -------------------------------- Comandos xmldos = new Comandos(); Afiliado seleccionxml = xmldos.selectmarklogic(ids[i], options1, i, options); Console.WriteLine("Selección de datos en MARKLOGIC Server: Tiempo en ms = " + ------------------------------------ Actualización de datos en MARKLOGIC ------------------------------------ Comandos xmltres = new Comandos(); Se actualizan los valores de las fichas. En este caso se ha modificado únicamente el valor del correo electrónico xmltres.actualizarmarklogic(ids, "Sergio", "Bellido", "sergio@micorreo.com", "Dos Hermanas","Sevilla", "Refuerzo", "Ingeniero", options); Console.WriteLine("Actualización de datos en MARKLOGIC Server: Tiempo en ms = " + 112

@testcomandos.cs Autor: Sergio Bellido Sánchez Proyecto Final de Carrera using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Data; using System.Data.SqlTypes; using System.Data.SqlClient; using MySql.Data; using MySql.Data.Types; using MySql.Data.MySqlClient; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; using MongoDB.Bson.Serialization.IdGenerators; using MongoDB.Driver; using MongoDB.Driver.Builders; using Marklogic.Xcc; using Marklogic.Xcc.Session; using Marklogic.Xcc.Request; using Marklogic.Xcc.ContentSource; using Marklogic.Xcc.ContentSourceFactory; using Marklogic.Xcc.ResultSequence; Clase que contiene todos los métodos necesarios para insertar, seleccionar y actualizar los datos public class Comandos Método genérico válido para las 3 bases de datos, que crea una ficha con los valores pasados public Afiliado CrearFicha(Guid afiliadoid, string nombre, string apellidos, string correo, string centro, string ciudad, string cargo, string estudios) Afiliado nuevo = new Afiliado(); Puesto newpuesto = new Puesto(); nuevo._id = afiliadoid; nuevo.nombre = nombre; nuevo.apellido = apellidos; nuevo.email = correo; newpuesto.afiliadoid = afiliadoid; newpuesto.centro = centro; newpuesto.ciudad = ciudad; newpuesto.cargo = cargo; newpuesto.estudios = estudios; Se crea un lista fuertemente tipada List<Puesto> lista = new List<Puesto>(); Se añade la clase inicializada lista.add(newpuesto); Se injerta en la lista Puestos de Afiliado nuevo.puestos = lista; Devuelve la ficha creada, que es una instancia de Afiliado return nuevo; 113

/Tomamos una instancia de Afiliado, y lo insertamos en MySQL public Char InsertarAfiliadoSQL(Afiliado ejemplo) Se crea una conexión con MySQL que será la misma para inserciones, selecciones y actualizaciones string conex = "server=localhost; user id=root; password=passw; database=test; pooling=false;"; MySqlConnection consql = new MySqlConnection(conex); Se van a crear 3 contextos para poder trabajar independientemente con los datos cmd1 insertará los datos pasados como argumentos en la clase Afiliado cmd2 insertará los datos pasados como argumentos en la clase Puesto cmd3 consultará la ID del elemento para devolver dicho valor string cadena1 = "INSERT INTO afiliado(id, Nombre, Apellido, Email) VALUES ('" + ejemplo._id + "','" + ejemplo.nombre + "','" + ejemplo.apellido + "','" + ejemplo.email + "')"; MySqlCommand cmd1 = new MySqlCommand(cadena1, consql); string cadena2 = "INSERT INTO puesto(afiliadoid, Centro, Ciudad, Cargo, Estudios) VALUES ('" + ejemplo._id + "','" + ejemplo.puestos[0].centro + "','" + ejemplo.puestos[0].ciudad + "','" + ejemplo.puestos[0].cargo + "','" + ejemplo.puestos[0].estudios + "')"; MySqlCommand cmd2 = new MySqlCommand(cadena2, consql); string cadena3 = "SELECT ID='" + ejemplo._id + "' FROM Afiliado"; MySqlCommand cmd3 = new MySqlCommand(cadena3, consql); Char id = '0'; try abrimos la conexión con la base de datos consql.open(); ejecuta la inserción de datos en Afiliado cmd1.executenonquery(); ejecuta la inserción de datos en Puesto cmd2.executenonquery(); Por la naturaleza de MySQL convertimos la ID en un tipo char ExecuteScalar proporciona el valor de la primera columna de la tabla id = Convert.ToChar(cmd3.ExecuteScalar()); catch (Exception ex) Console.WriteLine(ex.ToString()); consql.close(); return id; tomamos un id de un afiliado, abrimos las conexiones, le damos el valor de id, y recogemos el resto de campos. Devolvemos el afiliado complete public Afiliado SelectSql(Guid afiliadoid) string conex = "server=localhost; user id=root; password=passw; database=test; pooling=false;"; MySqlConnection consql = new MySqlConnection(conex); le pasamos una cadena al contexto para que pueda seleccionar los datos string cadena = "SELECT c.nombre, c.apellido, c.email, a.centro, a.ciudad, a.cargo, a.estudios FROM afiliado c INNER JOIN puesto a ON a.afiliadoid=c.id WHERE c.id=afiliadoid"; 114

MySqlCommand cmd = new MySqlCommand(cadena, consql); Afiliado nuevo = new Afiliado(); Puesto newpuesto = new Puesto(); try consql.open(); MySqlDataReader lee = cmd.executereader(); vamos a leer los datos de la consulta realizada y se van a tomar los datos columna a columna while (lee.read()) nuevo.nombre = lee.getstring(0); nuevo.apellido = lee.getstring(1); nuevo.email = lee.getstring(2); newpuesto.centro = lee.getstring(3); newpuesto.ciudad = lee.getstring(4); newpuesto.cargo = lee.getstring(5); newpuesto.estudios = lee.getstring(6); break; lee.close(); catch (Exception ex) Console.WriteLine(ex.ToString()); consql.close(); cmd.dispose(); nuevo.puestos = new List<Puesto>(); Obligamos a que Puestos sea una lista tipada, y añadimos los valores del objeto newpuesto nuevo.puestos.add(newpuesto); return nuevo; Método que actualiza aquellos campos que hayan sido modificados respecto al que ya esté en la base de datos public void ActualizarSql(Afiliado ejemplo) string conex = "server=localhost; user id=root; password=passw; database=test; pooling=false;"; MySqlConnection consql = new MySqlConnection(conex); Establecemos dos contextos, uno para actualizar la clase Afiliado, y otro para Puesto string cadena = "Update afiliado SET Nombre='" + ejemplo.nombre + "', Apellido='" + ejemplo.apellido + "', Email='" + ejemplo.email + "' WHERE ID='" + ejemplo._id + "'"; MySqlCommand cmd = new MySqlCommand(cadena, consql); string cadena1 = "Update puesto SET Centro='" + ejemplo.puestos[0].centro + "', Ciudad='" + ejemplo.puestos[0].ciudad + "', Cargo='" + ejemplo.puestos[0].cargo + "', Estudios='" + ejemplo.puestos[0].estudios + "'"; MySqlCommand cmd1 = new MySqlCommand(cadena1, consql); 115

try consql.open(); cmd.executenonquery(); /ejecutamos las actualizaciones pertinentes en el primer contexto cmd1.executenonquery(); ejecutamos las actualizaciones pertinentes en el segundo contexto catch (Exception ex) Console.WriteLine(ex.ToString()); consql.close(); cmd.dispose(); Método que va a permitir la indexación del ID pasado, lo que va a acelerar mucho los distintos procesos que llevemos a cabo en MongoDB, y que además, no es algo común en el resto de bases de datos NoSQL public void IndiceMongo() Se establece una conexión con MongoDB a través de la dirección local string connectionstring = "mongodb://127.0.0.1"; MongoServer server = MongoServer.Create(connectionString); MongoDatabase test = server.getdatabase("test"); Asociamos el índice con el campo _ID de la clase Afiliado MongoCollection<Afiliado> afiliados = test.getcollection<afiliado>("afiliado"); afiliados.createindex("_id"); Insertamos los datos pasados de la clase Afiliado en MongoDB, lo que nos va a permitir trabajar con la ficha public Guid InsertarMongoDb(Afiliado user) string connectionstring = "mongodb://127.0.0.1"; MongoServer server = MongoServer.Create(connectionString); MongoDatabase test = server.getdatabase("test"); devuelve un objeto que representa la colección en la BD MongoCollection<Afiliado> afiliados = test.getcollection<afiliado>("afiliado"); insertamos los datos en la base de datos afiliados.insert(user); return user._id; Método que selecciona un documento a raíz del ID único que le corresponda public Afiliado SeleccionarMongoDb(Guid afiliadoid) Afiliado user = null; string connectionstring = "mongodb://127.0.0.1"; var query = new QueryDocument("_Id", "" + afiliadoid + ""); MongoServer server = MongoServer.Create(connectionString); MongoDatabase test = server.getdatabase("test"); MongoCollection<Afiliado> afiliados = test.getcollection<afiliado>("afiliado"); FindOneByIdAS permite consultar un elemento en base a una ID proporcionada user = afiliados.findonebyidas<afiliado>(afiliadoid); return user; 116

Método que actualiza aquellos valores que hayan sido modificados respecto a los originales public void ActualizarMongoDb(Afiliado user) string connectionstring = "mongodb://127.0.0.1"; MongoServer server = MongoServer.Create(connectionString); MongoDatabase test = server.getdatabase("test"); MongoCollection<Afiliado> afiliados = test.getcollection<afiliado>("afiliado"); Save() permite insertar y actualizar en dos tiempos los datos que hayan sido modificados afiliados.save<afiliado>(user); Método para insertar los datos de las fichas en SQL Server public Guid InsertarSQLserver(Afiliado ejemplo) Se crea una conexión con SQL Server, LocalDB, de la gama de productos SQL Server string conex = @"Server=(localdb)\v11.0; Initial Catalog=test;Integrated Security=True;"; SqlConnection consql = new SqlConnection(conex); Se van a crear 3 contextos para poder trabajar independientemente con los datos cmd1 insertará los datos pasados como argumentos en la clase Afiliado cmd2 insertará los datos pasados como argumentos en la clase Puesto cmd3 consultará la ID del elemento para devolver dicho valor string cadena1 = "INSERT INTO afiliado(id, Nombre, Apellido, Email) VALUES ('" + ejemplo._id + "','" + ejemplo.nombre + "','" + ejemplo.apellido + "','" + ejemplo.email + "')"; SqlCommand cmd1 = new SqlCommand(cadena1, consql); string cadena2 = "INSERT INTO puesto(afiliadoid, Centro, Ciudad, Cargo, Estudios) VALUES ('" + ejemplo._id + "','" + ejemplo.puestos[0].centro + "','" + ejemplo.puestos[0].ciudad + "','" + ejemplo.puestos[0].cargo + "','" + ejemplo.puestos[0].estudios + "')"; SqlCommand cmd2 = new SqlCommand(cadena2, consql); string cadena3 = "SELECT ID='" + ejemplo._id + "' FROM afiliado"; SqlCommand cmd3 = new SqlCommand(cadena3, consql); Guid id2 = Guid.Empty; try Abrimos conexión con el servidor consql.open(); cmd1.executenonquery(); Ejecutamos las inserciones de los dos primeros contextos cmd2.executenonquery(); id2 = new Guid(cmd3.ExecuteScalar().ToString()); Tomamos el ID correspondiente para devolverlo catch (Exception ex) Console.WriteLine(ex.ToString()); consql.close(); return id2; 117

Tomamos un id de un afiliado, abrimos las conexiones, le damos el valor de id, y recogemos el resto de campos. Devolvemos el afiliado completo public Afiliado SelectSqlserver(Guid afiliadoid) string conex = @"Server=(localdb)\v11.0; Initial Catalog=test;Integrated Security=True;"; SqlConnection consql = new SqlConnection(conex); string cadena = "SELECT c.nombre, c.apellido, c.email, a.centro, a.ciudad, a.cargo, a.estudios FROM afiliado c INNER JOIN puesto a ON a.afiliadoid=c.id WHERE c.id=afiliadoid"; SqlCommand cmd = new SqlCommand(cadena, consql); Afiliado nuevo = new Afiliado(); se crean ambas instancias para poder trabajar con todos los datos de la consulta Puesto newpuesto = new Puesto(); try consql.open(); SqlDataReader lee = cmd.executereader(); while (lee.read()) nuevo.nombre = lee.getstring(0); nuevo.apellido = lee.getstring(1); nuevo.email = lee.getstring(2); newpuesto.centro = lee.getstring(3); newpuesto.ciudad = lee.getstring(4); newpuesto.cargo = lee.getstring(5); newpuesto.estudios = lee.getstring(6); break; lee.close(); catch (Exception ex) Console.WriteLine(ex.ToString()); consql.close(); cmd.dispose(); nuevo.puestos = new List<Puesto>(); Obligamos a que Puestos sea una lista tipada, y añadimos los valores del objeto newpuesto nuevo.puestos.add(newpuesto); return nuevo; Método para actualizar los datos que se vean modificados de las clases implicadas respecto a los valores originales public void ActualizarSqlserver(Afiliado ejemplo) string conex = @"Server=(localdb)\v11.0; Initial Catalog=test;Integrated Security=True;"; SqlConnection consql = new SqlConnection(conex); Establecemos dos contextos, uno para actualizar la clase Afiliado, y otro Puesto string cadena = "Update afiliado SET Nombre='" + ejemplo.nombre + "', Apellido='" + ejemplo.apellido + "', Email='" + ejemplo.email + "' WHERE ID='" + ejemplo._id + "'"; 118

SqlCommand cmd = new SqlCommand(cadena, consql); string cadena1 = "Update puesto SET Centro='" + ejemplo.puestos[0].centro + "', Ciudad='" + ejemplo.puestos[0].ciudad + "', Cargo='" + ejemplo.puestos[0].cargo + "', Estudios='" + ejemplo.puestos[0].estudios + "'"; SqlCommand cmd1 = new SqlCommand(cadena1, consql); try consql.open(); cmd.executenonquery(); cmd1.executenonquery(); catch (Exception ex) Console.WriteLine(ex.ToString()); consql.close(); cmd.dispose(); Método que va a permitir trabajar con las clases Afiliado y Puesto mediante etiquetas XML para dar apoyo a la base de datos Marklogic public XmlTextWriter CrearFicha(Guid[] afiliadoid, string nombre, string apellidos, string correo, string centro, string ciudad, string cargo, string estudios) XmlTextWriter writer = new XmlTextWriter("benchmarking.xml", System.Text.Encoding.UTF8); Usa indentación por legibilidad writer.formatting = Formatting.Indented; Escribe la declaración del XML writer.writestartdocument(); Escribe el elemento raíz writer.writestartelement("benchmark"); writer.writestartelement("afiliado"); Escribe los elementos dentro de sus etiquetas writer.writeattributestring("xmlns", "bk", null, "urn:samples"); writer.writeattributestring("id", "" + afiliadoid[i] + ""); writer.writeelementstring("nombre", "" + nombre + ""); writer.writeelementstring("apellido", "" + apellidos + ""); writer.writeelementstring("email", "" + correo + ""); writer.writeendelement(); writer.writestartelement("puesto"); writer.writeelementstring("afiliadoid", "" + afiliadoid[i] + ""); writer.writeelementstring("centro", "" + centro + ""); writer.writeelementstring("ciudad", "" + ciudad + ""); writer.writeelementstring("cargo", "" + cargo + ""); writer.writeelementstring("estudios", "" + estudios + ""); writer.writeendelement(); writer.writeendelement(); writer.writeenddocument(); writer.flush(); writer.close(); 119

Devuelve la ficha creada, que es una instancia de Afiliado return writer; Método que permite la inserción de documentos XML en la base de datos Marklogic Public Guid InsertarMarklogic(XmlTextWriter ejemplo, ContentCreateOptions options) Establecemos conexión con la base de datos Marklogic Uri uri = new Uri("xcc://user:pass@localhost:8888/Documents"); ContentSource contentsource = ContentSourceFactory.NewContentSource(uri); Session session = contentsource.newsession(); FileInfo file = new FileInfo("benchmarking.xml"); Content content = ContentFactory.NewContent("benchmarking.xml", file, options); session.insertcontent(content); session.dispose(); session.close(); Guid id2 = Guid.Empty; //Se deja limpio el elemento return id2; Función en la que tomamos un id de un afiliado, abrimos las conexiones, le damos el valor de id, y recogemos el resto de campos. Devolvemos el afiliado complete public Afiliado SelectMarklogic(Guid afiliadoid, RequestOptions options, int i, ContentCreateOptions options1) Afiliado nuevo = new Afiliado(); Indicamos la localización de la base de datos mediante su Uri Uri uri = new Uri("xcc://user:pass@localhost:8888/Documents"); ContentSource contentsource = ContentSourceFactory.NewContentSource(uri); Session session = contentsource.newsession(); Se especifica el nombre del documento que debe buscarse, así como los atributos que se quieren seleccionar, indicados con /Benchmark/Afiliado[@id=afiliadoID] Request request = session.newadhocquery( "doc('xcc://user:pass@localhost:8888/documents/benchmarking.xml') /Benchmark/Afiliado[@id='" + afiliadoid + "']"); ResultSequence rs = session.submitrequest(request); return nuevo; Método para actualizar los datos que se vean modificados de las clases implicadas respecto a los valores originales public void ActualizarMarklogic(Guid[] afiliadoid, string nombre, string apellidos, string correo, string centro, string ciudad, string cargo, string estudios, ContentCreateOptions options) Esta declaración nos va a permitir recorrer el documento XML DataSet elemento = new DataSet(); elemento.readxml("benchmarking.xml"); string campo; Se buscará en cada registro aquel que coincida con el ID, y se actualizarán sus campos string afiliadoidstring; for(int i = 0; i<500; i++) afiliadoidstring = "" + afiliadoid[i] + ""; 120

for(int j=0; j<=elemento.tables["afiliado"].rows.count;j++) campo = elemento.tables["afiliado"].rows[j]["id"].tostring(); if (campo == afiliadoidstring) elemento.tables["afiliado"].rows[j]["nombre"] = nombre; elemento.tables["afiliado"].rows[j]["apellido"] = apellidos; elemento.tables["afiliado"].rows[j]["email"] = correo; elemento.tables["puesto"].rows[j]["centro"] = centro; elemento.tables["puesto"].rows[j]["ciudad"] = ciudad; elemento.tables["puesto"].rows[j]["cargo"] = cargo; elemento.tables["puesto"].rows[j]["estudios"] = estudios; elemento.writexml("benchmarking.xml"); elemento.dispose(); Insertamos de nuevo el contenido en la base de datos Uri uri = new Uri("xcc://user:pass@localhost:8888/Documents"); ContentSource contentsource=contentsourcefactory.newcontentsource(uri); Session session = contentsource.newsession(); FileInfo file = new FileInfo("benchmarking.xml"); Content content=contentfactory.newcontent("benchmarking.xml", file, options); session.insertcontent(content); session.close(); 121