Utilizando la Biblioteca SqlHelper (2/n)

Ejecutar consulta y llenar un DataReader:

Para llevar a cabo la ejecución de una consulta y rellenar un DataReader, disponemos de los siguientes métodos:

Screen Shot 03-19-16 at 12.14 PM

En esta demostración, utilizaremos el método:

public static System.Data.SqlClient.SqlDataReader ExecuteReader(string connectionString, System.Data.CommandType commandType, string commandText)

Podemos observar, que se nos pide como primer parámetro una cadena de conexión, como segundo el tipo de comando (si es consulta normal o un stored procedure), y como tercer, la consulta como tal.

En primer lugar, definiremos en una variable la consulta que deseamos ejecutar:

var sqlQuery = "SELECT * FROM Customers";

En segundo lugar, llamaremos al método que nos interesa, pasándole como referencia la cadena de conexión que definimos en el post anterior, seguido por el tipo de enumeración que deseamos aplicar, y la consulta definida previamente. Cabe destacar, que utilizaremos un using para cerrar la conexión y eliminar la instancia una vez que la dejemos de utilizar:

 using (var newDataReader = SqlHelper.ExecuteReader(
                GlobalData.ConnectionString,
                CommandType.Text, sqlQuery))

Por último, haremos un recorrido por el datareader e imprimiremos la información deseada:

while (newDataReader.Read())
                {
                    var customerInfo = string.Format(
                        "Company Name: {0}, ContactName: {1}",
                        newDataReader.GetString(1),
                        newDataReader.GetString(2));
                    Debug.WriteLine(customerInfo);                    
                }

Quedando el código completo del método, de la siguiente manera:

 private void StartDataReaderDemo()
        {
            //Utilizando SqlHelper para llenar un DataReader
            var sqlQuery = "SELECT * FROM Customers";
            using (var newDataReader = SqlHelper.ExecuteReader(
                GlobalData.ConnectionString,
                CommandType.Text, sqlQuery))
            {
                while (newDataReader.Read())
                {
                    var customerInfo = string.Format(
                        "Company Name: {0}, ContactName: {1}",
                        newDataReader.GetString(1),
                        newDataReader.GetString(2));
                    Debug.WriteLine(customerInfo);                    
                }
            }


        }

Ejecutar consulta a un Stored Procedure y llenar un DataReader:

La forma para llevar a cabo una consulta a un procedimiento almacenado, conlleva básicamente los mismos pasos que anteriormente, con la diferencia, que debemos especificar el nombre del procedimiento almacenado en lugar de la consulta:

var sqlQuery = "Sales by Year";

En segundo lugar, debemos definir un arreglo de tipo SqlParameter, definiendo los parámetros que deseamos pasar:

            var param1 = new SqlParameter {ParameterName = "@Beginning_Date", Value = new DateTime(1995, 1, 1) };
            var param2 = new SqlParameter { ParameterName = "@Ending_Date", Value = new DateTime(1997, 1, 1)};
            SqlParameter[] parameters = new[] {param1, param2};

Lo demás, es prácticamente lo mismo, el código completo del método se encuentra a continuación:

        private void StartDataReaderDemo2()
        {
            //Utilizando SqlHelper para llenar un DataReader a través de un stored procedure
            var sqlQuery = "Sales by Year";
            var param1 = new SqlParameter {ParameterName = "@Beginning_Date", Value = new DateTime(1995, 1, 1)};
            var param2 = new SqlParameter {ParameterName = "@Ending_Date", Value = new DateTime(1997, 1, 1)};
            SqlParameter[] parameters = new[] {param1, param2};
            using (var newDataReader = SqlHelper.ExecuteReader(
                GlobalData.ConnectionString,
                CommandType.StoredProcedure, sqlQuery, parameters))
            {
                while (newDataReader.Read())
                {
                    var customerInfo = string.Format(
                        "Order ID: {0}, Subtotal{1}",
                        newDataReader.GetInt32(1),
                        newDataReader.GetDecimal(2));
                    Debug.WriteLine(customerInfo);
                }
            }
        }

¿Cómo comparar el esquema entre 2 bases de datos? (3/3) [Serie–Sincronizando Esquemas e Información entre bases de datos]

En la entrada anterior, veíamos la segunda herramienta para llevar a cabo comparaciones entre esquemas de bases de datos. Hoy toca el turno a mi última recomendación, que es Visual Studio Schema Compare for SQL Server Database Projects.

Visual Studio Schema Compare for SQL Server Database Projects

Prerrequisitos:

  • Visual Studio 2013 Ultimate
  • Visual STudio 2013 Premium
  • Visual Studio Community 2013

Esta es una herramienta que viene incluida en las versiones enlistadas anteriormente. Para hacer uso de la misma, basta seleccionar la siguiente opción:

Screen Shot 03-04-15 at 09.10 PM

Posteriormente, nos saldrá una ventana en la cual, de nuevo, al igual que en las herramientas anteriores, debemos seleccionar una base de datos orígen, y una base de datos destino:

Screen Shot 03-04-15 at 09.12 PM

Si no nos aparece ninguna base de datos para seleccionar, debemos dar click sobre la opción “Select Source”, lo cual nos desplegará lo siguiente:

Screen Shot 03-04-15 at 09.13 PM

En esta ventana, te aparecerán las diferentes opciones de las cuales puedes hacer uso, en mi caso he seleccionado una conexión a una base de datos. Haremos lo mismo con la base de datos destino:

Screen Shot 03-04-15 at 09.14 PM

Por último, basta con dar click sobre el botón “Compare” para iniciar la comparación de esquemas:

Screen Shot 03-04-15 at 09.15 PM

Esto nos desplegará, los diferentes cambios encontrados entre ambas bases de datos, categorizados por el tipo de cambio que debe de hacerse:

Screen Shot 03-04-15 at 09.20 PM

En nuestro ejemplo, veremos que se debe realizar un cambio. Si nos posicionamos encima de la tabla, podremos visualizar cuál es la diferencia entre ambas tablas:

Screen Shot 03-04-15 at 09.22 PM

Veremos que existen 3 cambios que debemos aplicar si deseamos empatar el esquema de bases de datos.

  1. Cambiar el nombre a un largo de 200
  2. Cambiar el género de char(1) a entero
  3. Agregar la llave primaria [PK_Person]

En caso de que queramos que la actualización se lleve a cabo gestionada por Visual Studio, debemos seleccionar aquellas tablas u objetos que deseamos actualizar:

Screen Shot 03-04-15 at 09.25 PM

Una vez hecho esto, podremos ver el scrip que se generaría en caso de que se llevara a cabo la actualización, donde, en nuestro ejemplo, las líneas más relevantes serían las siguientes:

Screen Shot 03-04-15 at 09.27 PM

Si es lo que deseamos, simplemente debemos actualizar el esquema, dando click en el botón “Update”:

Screen Shot 03-04-15 at 09.28 PM

Con lo que obtendremos un error:

Screen Shot 03-04-15 at 09.31 PM

Esto sucede porque tenemos información en nuesta base de datos, la cual podríamos afectar. Para cuestiones de ejemplo, lo corregiremos eliminando esta sección del script:

Screen Shot 03-04-15 at 09.32 PM

Con esto, no tendremos más errores, y habremos sincronizado el esquema entre ambas bases de datos.

Screen Shot 03-04-15 at 09.33 PM

Conclusiones

En esta serie de entradas, hemos visto 3 herramientas que pueden ser de gran utilidad al momento de llevar a cabo sincronizaciones entre esquemas de bases de datos. Es tu turno decidir cuál te conviene más.

Saludos.

¿Cómo comparar el esquema entre 2 bases de datos? (2/3) [Serie–Sincronizando Esquemas e Información entre bases de datos]

En el artículo anterior, hablábamos acerca de DbComparer como herramienta para comparar esquemas entre 2 bases de datos. hoy toca el turno de OpenDbDiff.

OpenDbDiff

Hospedado en el sitio de CodePlex, este proyecto nos describe lo siguiente:

Open DBDiff es una herramienta de comparación esquema open source de bases de datos de SQL Server 2005/2008.

Se informa de las diferencias entre dos esquemas de base de datos y proporciona un script de sincronización para actualizar una base de datos de uno a otro.

Cuando ejecutamos la aplicación, veremos, al igual que DbComparer, 2 apartados para especificar una base de datos de orígen, y una base de datos destino, donde debemos especificar la información correspondiente a cada una de ellas, como en el siguiente ejemplo:

Screen Shot 03-02-15 at 07.33 PM

Una vez hecho esto, debemos dar click en el botón “Compare” para llevar a cabo la comparación:

Screen Shot 03-02-15 at 07.34 PM

lo cual nos generará un listado con las diferencias entre ambas bases de datos. Continuando con nuestra información de ejemplo, al abrir la pestaña de las tablas, veremos algo como lo siguiente:

Screen Shot 03-02-15 at 07.36 PM

donde, dependiendo el color del texto, significará alguna de las siguientes 3 opciones:

Screen Shot 03-02-15 at 07.37 PM

En nuestro ejemplo concreto, veremos debemos llevar a cabo una consulta del tipo Alter para poder dejar a la par ambas bases de datos. La aplicación nos ayudará, brindándonos el script para crear la( s ) tabla ( s ) correspondiente (s ).

Script de la tabla anterior:

Screen Shot 03-02-15 at 07.40 PM 001

Script de la tabla nueva:

Screen Shot 03-02-15 at 07.40 PM

Por último, si deseamos aplicar dichos cambios de forma automática, bastará con seleccionar el ó los ítems correspondientes, y dar click sobre “Update Item”:

Screen Shot 03-02-15 at 07.44 PM

Screen Shot 03-02-15 at 07.44 PM 001

con lo que nos saltará una advertencia:

Screen Shot 03-02-15 at 07.44 PM 002

Que básicamente nos dice, que no se podrán revertir los cambios. Al aplicar los cambios, si no hay mayor complicación, nos saldrá un mensaje diciendo que todos los cambios fueron satisfactorios:

Screen Shot 03-02-15 at 07.46 PM

Posterior a esto, se iniciará de nuevo el proceso de comparación, esta vez, mostrándonos los objetos sin ningún tipo de problema:

Screen Shot 03-02-15 at 07.47 PM

Con esto, tenemos una ayuda bastante poderosa para tener nuestras bases de datos sincronizadas.

Nos vemos en la siguiente entrada.

Saludos.

¿Cómo comparar el esquema entre 2 bases de datos? (1/3) [Serie–Sincronizando Esquemas e Información entre bases de datos]

La comparación entre esquemas de 2 bases de datos, puede ser una tarea titánica si se realiza de forma manual. Es por eso, que en esta serie de posts, indicaré cómo llevar a cabo comparaciones entre esquemas de bases de datos, comparaciones entre los datos de diferentes bases de datos, y finalmente, veremos paso a paso cómo realizar una aplicación para que podamos utilizarla en nuestros desarrollos sin depender de herramientas de terceros. Iniciemos entonces con esta serie que espero sea de su agrado, y a más de uno sirva como me ha servido a mí.

En la red existen múltiples aplicaciones, que nos prometen llevar a cabo la comparación entre bases de datos de una forma sencilla, a menudo, estas aplicaciones tienen un costo. Algunas de estas son:

Link del producto Precio
http://www.red-gate.com/products/sql-development/sql-compare/ $745.00 dólares americanos
https://www.devart.com/dbforge/sql/schemacompare/ $149.95 dólares americanos
http://www.adeptsql.com/ $240.00 dólares americanos

Es cierto que cada quien tiene el derecho de ponerle el precio a los productos que desarrolla, pero no creo conveniente comprar una licencia de alguno de estos productos, si sólo la utilizaremos una vez en un año. Es por ello, que en esta serie de posts, recomendaremos algunas herramientas que nos pueden ayudar a llevar a cabo dichas tareas de forma sencilla y sin pagar un sólo peso (Aunque si tienes oportunidad, te recomiendo realizar donaciones a este tipo de proyectos):

Requisitos previos:

Para poder reproducir lo que haremos en esta serie posts, debes ejecutar este script sobre tu servidor de bases de datos:

Script para pruebas

El contenido de dicho archivo, es el siguiente:

CREATE DATABASE BlogTestSource
GO
CREATE DATABASE BlogTestTarget
GO
USE [BlogTestSource]
GO

/****** Object:  Table [dbo].[Person]    Script Date: 25/02/2015 08:33:33 p. m. ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Person](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](100) NOT NULL,
    [Age] [int] NOT NULL,
    [Gender] [int] NOT NULL,
 CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

USE [BlogTestTarget]
GO

/****** Object:  Table [dbo].[Person]    Script Date: 25/02/2015 08:33:51 p. m. ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Person](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](200) NOT NULL,
    [Age] [int] NOT NULL,
    [Gender] [char](1) NOT NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

USE [BlogTestSource]
GO
SET IDENTITY_INSERT [dbo].[Person] ON 

INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (1, N'Rick', 31, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (2, N'Sasha', 22, 2)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (3, N'Daryl', 19, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (4, N'Glenn', 23, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (5, N'Maggie', 18, 2)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (6, N'Carl', 10, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (7, N'Carol', 40, 2)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (8, N'Michonne', 31, 2)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (9, N'Eugene', 27, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (10, N'Rosita', 18, 2)
SET IDENTITY_INSERT [dbo].[Person] OFF
GO

USE [BlogTestTarget]
GO
SET IDENTITY_INSERT [dbo].[Person] ON 

INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (1, N'Rick', 31, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (2, N'Sasha', 22, 2)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (3, N'Daryl', 19, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (4, N'Glenn', 23, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (5, N'Maggie', 18, 2)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (6, N'Carl', 10, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (7, N'Carol', 40, 2)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (8, N'Michonne', 31, 2)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (9, N'Eugene', 27, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (10, N'Rosita', 18, 2)
SET IDENTITY_INSERT [dbo].[Person] OFF
GO

DbComparer

Eso es lo que describe el sitio web:

DBComparer es una herramienta de comparación de base de datos profesional para el análisis de las estructuras de base de datos de diferencias en Microsoft SQL Server 2008 (y 2005). Es una excelente herramienta para cualquier equipo de desarrollo de proyecto o DBA gestión de múltiples copias de la misma base de datos en un servidor SQL. Esta herramienta de comparación de base de datos tiene una interfaz limpia y directa. Resultados se presentan claramente para que usted puede ver inmediatamente las diferencias en sus bases de datos. Hará que localizar y eliminar las diferencias en su base de datos rápida y fácil.

Al realizar la primer ejecución, se nos despliega el siguiente cuadro de diálogo, donde deberemos seleccionar la base de datos de la izquierda (origen) y la base de datos de la derecha (destino), de la siguiente manera (si es que has ejecutado el script que te he puesto al inicio del post):

Screen Shot 02-25-15 at 10.21 PM

Posteriormente daremos click al botón “Compare Now”, lo que iniciará una comparación entre las bases de datos seleccionadas, mostrándonos lo siguiente:

Screen Shot 02-25-15 at 10.24 PM

Podemos ver, de manera sencilla, dónde tenemos diferencias de esquema entre ambas bases de datos, ya que es mostrado con color rojo, en este caso, es en el folder de las tablas donde tenemos conflictos, expandamos para ver lo que ocurre:

Screen Shot 02-25-15 at 10.26 PM

Si seguimos expandiendo los nodos, veremos cuáles son los campos en los que tenemos conflictos:

Screen Shot 02-25-15 at 10.28 PM

Seleccionando sobre la tabla (En este caso, dando click sobre dbo.Person), veremos diferentes secciones con información diferente, describiremos una por una:

Ventana de propiedades:

Screen Shot 02-25-15 at 10.29 PM

Nos mostrará las propiedades de cada una de las tablas en cuanto a estructura de la tabla en sí se refiere.

Ventana de diferencias:

Screen Shot 02-25-15 at 10.32 PM

Aquí podremos ver, de forma muy rápida y sencilla, las diferencias entre ambas tablas, en este ejemplo, vemos 2 líneas que contienen diferencias entre ambas bases de datos. Las diferencias son:

Línea 3: existe una diferencia en la definición de nvarchar, nuestra tabla orígen define un largo de 100, mientras que nuestra tabla destino define un largo de 200.

Línea 5: El campo es int en la tabla orígen, mientras que es un tipo char(1) en nuestra tabla destino.

Venta de diferencias por línea:

Screen Shot 02-25-15 at 10.34 PM

 

Nos permite comparar línea por línea, de acuerdo a la línea que tengamos seleccionada en la venta de diferencias. para realizar un análisis más detallado sobre cada línea, bastante útil si la consulta contiene varias líneas de código.

Desventajas de esta herramienta:

La única desventaja que encontré con esta herramienta, es que no podemos llevar a cabo la ejecución de scripts para igualar ambas bases de datos, por lo que tendremos que realizar cada una de ellas de forma manual.

En la siguiente entrega analizaremos la siguiente herramienta para comparar bases de datos,

¡Hasta entonces colegas!