Archive

Archive for 31 octubre 2008

[SQL]Procedimientos almacenados paso a paso

octubre 31, 2008 35 comentarios

Un procedimiento almacenado (store procedure) no es más que una secuencia ordenada de instrucciones T-SQL, que pueden recibir y proporcionar parámetros provistos por el usuario y se pueden guardar en el servidor con un nombre, para posteriormente se invocados y ejecutados, por lo regular desde una aplicación (Escritorio o Web). Desde la versión 2005, se incorpora la posibilidad de utilizar procedimientos almacenados usando el CLR de .NET. Es decir tenemos dos tipos de procedimientos almacenados.

Un procedimiento almacendado CLR es una referencia a un método de un ensamble (dll) de .NET Framework que puede aceptar y devolver parámetros suministrados por el usuario.

Ventajas de usar SP

  • Compilación: La primera vez que se invoca un SP, el motor lo compila y a partir de ahí, se sigue usando la versión compilada del mismo, hasta que se modifique o se reinicie el servicio de SQL. Esto siginifica que se tendrá un mejor rendimiento que las consultas directas que usan cadenas con las instrucciones T-SQL, que se compilan cada vez que se invocan.
  • Automatización: si tenemos un conjunto de instrucciones T-SQL, las cuales queremos ejecutar de manera ordenada, un SP es la mejor manera de hacerlo.
  • Administración: cuando realizamos aplicaciones con un gran numero de lineas de código, y queremos hacer cambios, solo implica modificar un SP y no toda la aplicación, lo que significa solo cambiamos los SP en el servidor y no tenemos que actualizar la aplicación en todos los equipos cliente.
  • Seguridad: una parte importante es que a los usuarios de nuestra aplicación, solo les proporcionamos los permisos para ejecutar los procedimientos almacenados y no el acceso a todos los objetos de la base. Es decir, si en nuestra aplicación encuentran una vulnerabilidad como SLQ Injection no se podrá explotar ejecutando SQL directamente.
  • Programabilidad: Los SP admiten el uso de variables y estructuras de control como IF, Bucles,  Case, etc. además del manejo de transacción y permite controlar excepciones. Y cuando trabajamos con SP CLR podemos hacer uso de cualquier lenguaje .NET como lo son C# y VB.NET.
  • Trafico de Red:  Pueden reducir el trafico de la red, debido a que se trabaja sobre el motor (en el servidor), y si una operación incluye hacer un trabajo de lectura primero y en base a eso realizar algunas operaciones, esos datos que se obtienen no viajan por la red.

Creando un Procedimiento almacenado

Para crear un procedimiento almacenado solo basta con ir a la base de datos desplegar el árbol hasta la parte de programación y luego en procedimientos almacenados y damos clic derecho en nuevo procedimiento almacenado como se ve en la siguiente figura:

image

Lo cual genera el siguiente código:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date,,>
-- Description:    <Description,,>
-- =============================================
CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName>
    -- Add the parameters for the stored procedure here
    <@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>,
    <@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
END
GO

Es aquí en donde editamos nuestro procedimiento como mejor nos interese, en este caso usando la base de datos Northwind, crearemos un SP sencillo que queda más o menos así:

USE [Northwind]
GO

CREATE PROCEDURE [dbo].[GetAllEmployees]
    -- Add the parameters for the stored procedure here
    @LastName nvarchar(50),
    @FirstName nvarchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT  LastName, FirstName, Title
    FROM dbo.Employees
    WHERE FirstName = @FirstName AND LastName = @LastName
END

En este sencillo ejemplo, sólo devuelve el empleado especificado (nombre y apellidos), y el titulo a partir de una vista. Este procedimiento almacenado acepta coincidencias exactas de los parámetros pasados.

Para ejecutar el código debemos hacerlo de esta manera:

EXEC dbo.GetAllEmployees 'Davolio', 'Nancy'

Cómo lo consumimos desde una aplicación en .NET, pues de esta manera:

static void Main(string[] args)
        {
            //Creamos una nueva conexion.
            SqlConnection miConn = new SqlConnection("Data Source=NORTABLEPC\\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True");

            //Creamos un nuevo comando
            SqlCommand miComm = new SqlCommand();
            //Le asignamos la conexion.
            miComm.Connection = miConn;
            //especificamos que el comando es un stored procedure
            miComm.CommandType = System.Data.CommandType.StoredProcedure;
            //y escribimos el nombre del stored procedure a invocar
            miComm.CommandText = "dbo.GetAllEmployees";
            //Creamos un nuevo parametro
            SqlParameter paramLastName = new SqlParameter();
            paramLastName.ParameterName = "@LastName";
            paramLastName.SqlDbType = System.Data.SqlDbType.NVarChar;
            paramLastName.Value = "Davolio";

            miComm.Parameters.Add(paramLastName);

            SqlParameter paramFirstName = new SqlParameter();
            paramFirstName.ParameterName = "@FirstName";
            paramFirstName.SqlDbType = SqlDbType.NVarChar;
            paramFirstName.Value = "Nancy";
            miComm.Parameters.Add(paramFirstName);
            //Y los agregamos a la coleccion de parametros del comando myComm.Parameters.Add(myParam) 'Creamos un nuevo DataAdapter con nuestro comando.
            SqlDataAdapter miDA = new SqlDataAdapter(miComm);
            //Creamos un dataset para soportar los datos devueltos por el stored procedure
            DataSet EmpleadosDS = new DataSet();
            //Pedimos al Data Adapter que llene el dataset (Esto llama a nuestro comando)
            miDA.Fill(EmpleadosDS);
            //Y lo mostramos por pantalla

            foreach (DataRow row in EmpleadosDS.Tables[0].Rows)
            {
                Console.WriteLine(row["LastName"].ToString() + " " + row[1].ToString() + " " + row[2].ToString());
            }
        }

Procedimientos Almacenados con CLR

En Common Language Runtime (CLR), los procedimientos almacenados se implementan como métodos estáticos públicos en una clase de un ensamblado de Microsoft .NET Framework. El método estático se puede declarar como void o puede devolver un valor entero. Si devuelve un valor entero, éste se trata como el código devuelto desde el procedimiento. Los parámetros que se pasan a un procedimiento almacenado CLR pueden ser cualquiera de los tipos nativos de SQL Server que tengan un equivalente en código administrado. Para que la sintaxis Transact-SQL cree el procedimiento, estos tipos se deben especificar con el equivalente del tipo nativo de SQL más adecuado.

Ejemplo:

Para crear un SP con integración del CLR vamos a usar VS, y creamos un Proyecto de tipo SQL, al que llame StoreProcedure_Demo, lo primero que hace Visual Studio es preguntar el origen de datos, como se ve en la figura siguiente:

image En donde seleccionamos Microsoft SQL Server (SqlClient) y damos clic en continuar. Ahora toca el turno de elegir el Servidor

imageEn donde yo selecciono el servidor NORTABLEPC\SQLEXPRESS, y la base de datos Northwind, luego verifico la conexión y si todo va bien, por ultimo nos pedirá que si queremos habilitar la integración con el CLR, damos clic y listo. Luego damos clic derecho en nuestro proyecto Agregar->Procedimiento almacenado, como se ve en la figura:

image

Al procedimiento lo llamamos: GetEmpleado, damos y damos clic en Aceptar. Ahora vamos a escribir el siguiente código:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure (Name="GetEmpleado")]
    public static void GetEmpleado()
    {
        // Inserte el código aquí
        SqlContext.Pipe.Send("Hola Mundo! son las : " + System.DateTime.Now.ToString() + "\n");
        using (SqlConnection connection = new SqlConnection("context connection=true"))
        {
            connection.Open();
            SqlCommand command = new SqlCommand("SELECT LastName, FirstName FROM Employees", connection);
            SqlDataReader reader = command.ExecuteReader();
            SqlContext.Pipe.Send(reader);
        }

    }
};

En el código anterior solo mandamos un mensaje, y devolvemos un select sencillo de los empleados, Bien para que esto funcione, debemos generar una solución de nuestro proyecto y después una implementación del mismo, esto permite que automáticamente se envié la dll a nuestra base de datos con el nombre de nuestro proyecto, y al mismo tiempo agrega el procedimiento llamado GetEmpledo

image

Ahora solo nos resta ejecutar nuestro procedimiento con la siguiente instrucción:

EXEC dbo.GetEmpleado

Lo interesante de esto, es que una vez que ya hemos llamado al SP, cuando se ejecute de nuevo, ya no se compilara instrucción por instrucción solo se llama al dll y listo, el resultado de ejecutarlo es el siguiente, por un lado manda el resultado y por otro el mensaje de “hola mundo” con la hora de la maquina, como se ve en la figura:

image image

Hasta aquí dejamos este post, ya veremos en otro como ejecutar dichos procedimientos almacenados desde una aplicación. Espero que les sea de utilidad este post  y recuerden si lo creen conveniente tomen 5 min, para votar por este blog en la siguiente página : http://www.blogit.ms/ , voten por https://mspnor.wordpress.com

Saludos!!!

Etiquetas de Technorati: ,,

Video ‘Guitar Hero’ – World Tour

octubre 29, 2008 Deja un comentario
Etiquetas de Technorati: ,,,
Categorías:Games, General, Videos, Xbox, Xbox 360

Descarga Visual Studio 2010 y .NET Framework 4.0 CTP

octubre 28, 2008 1 comentario

Acaba de ser liberada el primer CTP del Visual Studio 2010 y .NET Framework 4.0 en una imagen de Virtual PC, para poder ejecutarlo es necesario contar con Virtual PC SP1, Windows XP o superior y 7.5GB disponible en el disco. 

f2b64570-4956-4687-b2d7-58842cabbbe8

Descargar Visual Studio 2010 y .NET Framework 4.0 CTP

 

El Futuro de C# – Conferencia

octubre 28, 2008 Deja un comentario

Si por extrañas razones ajenas a tu voluntad no pudiste asistir al PDC 2008 igual que yo :P, y quieres saber que es lo que te perdiste, gracias a channel 9 podemos ver las conferencias de lo que se va presentado día con día, y esta ves se trata de “The Future of C#” en la que Anders Hejlsberg Él es el jefe de diseño de  C # y participante clave en el desarrollo de la de Microsoft. NET Framework. Desde su lanzamiento inicial en 2000 nos habla de las nuevas características de la versión 4.0 de C#.

image

Aquí la URL para acceder a este vídeo.

http://channel9.msdn.com/pdc2008/TL16/

Etiquetas de Technorati: ,,
Categorías:C#, C# 4.0, PDC 2008

Servicios Live para el Consumidor – PDC 2008

octubre 28, 2008 Deja un comentario

Así es amigos, dentro del PDC 2008 (Professional Developers Conference) están dando mucho de que hablar y mucho de que postear, al igual que muchas ganas de probar nuevos productos, SO, Azule, etc. y claro desarrollar con estas nuevas tecnologías. En este evento claro que hay personas con las que puedo platicar y precisamente es nuestro amigo Rubén Mugártegui quien ha proporcionado información que se esta dando allá.

image

Esta vez, toca el turno para hablar de los Servicios Live, entre ellos lo que esta en versión Beta, que se trata de un servicio que permite sincronizar documentos, medios, archivos y datos de aplicaciones a través de múltiples PCs y dispositivos, y está disponible como una prueba piloto abierta en la página http://www.mesh.com para Windows XP, Windows Vista, Mac OS X y Windows Mobile.

diagram_top

A continuación un fragmento de lo que nos cuenta Rubén sobre los Servicios Live para el consumidor.

Durante PDC Microsoft demostró varias capacidades de la plataforma Live Services, incluyendo la forma en que los desarrolladores pueden crear aplicaciones y ofrecer experiencias integrales que se pueden extender a más de 400 millones de usuarios de los servicios Windows Live de la compañía, tales como Windows Live Hotmail y Windows Live Messenger. Microsoft también enfatizó que su plataforma Live Services es el medio por el cual productos como Windows Live, Office Live y Xbox LIVE brindan experiencias que abarcan más allá del nivel de una sola PC, dispositivo móvil o la Web, y que estas mismas capacidades ahora están disponibles para desarrolladores a través de su plataforma Live Services.

“Sin duda estamos en un gran momento de innovaciones tecnológicas para el futuro, software como Windows 7 y servicios Live para el consumidor representarán la nueva era digital, para la cual debemos prepararnos. Hoy tenemos Windows Vista, un sistema operativo mejorado que permite crear aplicaciones con una experiencia muy rica para el usuario y mejora la productividad tanto para el escritorio como para Internet y va preparando el camino para una futura adopción del sistema operativo, que está en etapa de desarrollo, ya que fue diseñado bajo la misma plataforma de Windows Vista, lo cual hará mucho más fácil la transición” comentó Lozada.

      La experiencia del usuario final es el principal foco en el desarrollo de aplicaciones altamente interactivas para Windows XP y Windows Vista y permite a los usuarios finales aprovechar estas aplicaciones en cualquier dispositivo que sea de uso común en su vida diaria. Falta ver que viene con Windows 7 (del que ya hablaremos en otro post).

Office 14 = Office Web Applications

octubre 28, 2008 1 comentario

Siguiendo con todas estas ola de nuevas tecnologías que se estás mostrando en estos momentos en el PDC 2008 en los Ángeles, toca el turno de Office, y si bien es un tema bastante interesante en lo personas, ya que últimamente (2 semanas más o menos), que me estoy peleando un objetos de Office (Word, Power Point, Excel), para manipulación de eventos, validaciones, etc.. Al momento de enterarme de lo que viene con Office 14, se me ha dibujado una sonrisa en el rostro :D, y esto por todo lo que les ofrecerá tanto a usuarios como a desarrolladores.

La idea principal de Microsoft Office Web Applications va más allá de un fácil manejo sobre los tipos de documentos Office (Word, Power Point, Excel y OneNote), sino que se trata de la visualización, edición y colaboración entre las 3 grandes plataformas con las que convivimos día a día que son, la PC, los móviles y la Internet.

Una característica importante de esto es que Web Applications tendrán características multiplataforma, de manera que podremos trabajar con nuestros documentos desde Internet Explorer, Firefox o Safari. Por supuesto, por debajo vamos a tener una plataforma de sincronización perfecta que nos permitirá trabajar con nuestros documentos en los tres entornos comentados, sin pérdida de datos y con actualización instantánea de datos.

Aquí unas imágenes de lo que al parecer es un archivo de Office que se muestra en los Exploradores IE y Firefox.

191-thumb192-thumb

Si bien esto lo podemos lograr hoy en día modificando algunos registros como para poder ver documentos de Office en el IE7 como se muestra a continuación:

image

Será fantástico ver como es el funcionamiento, y el rendimiento. Me intriga saber muchas cosas sobre lo que se podrá hacer. Por el momento a esperar que nuevas noticias nos tienen los señores que están presentando el PDC 2008.

Etiquetas de Technorati: ,,,,

[C#]Obtener los nombres de una Enumeración (enum)

octubre 28, 2008 2 comentarios

Muchas veces, por extrañas ideas, o requerimientos de algún cliente, o que se yo, tenemos la necesidad de obtener los nombres de una enumeración, o en algunos casos cuando trabajamos con los objetos de Office, necesitamos recorrer algunas de sus enumeraciones por ejemplo la de los Dialogos, tal vez para verificar que la que un usuario selecciono se  la de ayuda, no sé, se me vienen muchas ideas a la cabeza.

Pero hagamos caso del nombre del post, vamos a ver como recorrer u obtener los nombres de una enumeración, para esto hacemos uso de un método que pertenece a la Clase Enum, que se llama GetNames(). Enum.GetNames(Método) recupera una matriz con los nombres de las constantes de una enumeración especificada.

Pues bien basta de rollos y veamos un ejemplo:

1. primero creamos una enumeración de ejemplo, más o menos así:

public enum example
        {
            uno,
            dos,
            tres,
            cuatro,
            cinco
        }

(muy ilustrativo el ejemplo, verdad? jajaja.

2. luego pues nada solo hacemos uso de Foreach y lo recorremos de la siguiente manera:

foreach(string nombres in Enum.GetNames(typeof(example)))
           {
               Console.WriteLine(nombres);
           }
           

Listo!, así de fácil. esto nos arroja como salida en una aplicación de consola lo siguiente

image

Si alguien trabaja con objetos de Word, puede hacer lo siguiente:

static void Main(string[] args)
        {   
            foreach(string nombres in Enum.GetNames(typeof(Word.WdWordDialog)))
            {
                Console.WriteLine(nombres);
            }
        }

Etiquetas de Technorati: ,,,

Solo recuerden agregar la dll, y colocar lo siguiente:

using Word = Microsoft.Office.Interop.Word;

Bueno espero que les ayude este ejemplo. Saludos!!

Categorías:C#, Ejemplos, Tips