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