Blog Thinking Together

Microsoft. Biztalk Server 2006, .NET, WCF, WWF, WPF, Linq,...
Welcome to Blog Thinking Together Sign in | Join | Help
in Search

Blog

Blog donde escribré sobre Biztalk Server 2006, WWF, WCF, Arquitectura, ...

Ejecutar Stored Procedures mediante SQL Adapter

 

Debido a que creo que hay bastantes dudas y poca información sobre el SQL Adapter, me he decidido a escribir este post para intentar al menos sentar las bases del uso del adaptador.

Este ejemplo no pretende ser  código optimizado listo por ponerse en producción, sino más bien una prueba de concepto que facilite la tarea de aprendizaje de todas las personas que se empiecen a "pegar" con el SQL Adapter y solo encuentren documentación en inglés.

En el ejemplo usaremos el SQL Adapter para ejecutar un procedimiento almacenado el cual  insertará un registro en una tabla y obtendrá como resultado los datos del registro insertado anteriormente.

Crear  tabla y procedimiento almacenado

  • Crear la tabla de ejemplo
    CREATE TABLE [dbo].[tablaejemplo]
    (
     [ID] [int] NULL,
     [Descripcion] [varchar](50) COLLATE Modern_Spanish_CI_AS NULL
    ) ON [PRIMARY]

 


  • CREATE PROCEDURE [dbo].[insert_tablaejemplo]
     @id  int,
     @desc varchar(50)
    AS
    BEGIN
    SET NOCOUNT ON;
          insert into tablaejemplo(id,descripcion) values(@id,@desc)
          select id,descripcion from tablaejemplo where
    id=@id for xml auto,xmldata
    END


La clausula  xmldata causa que SQL Server devuelva como resultado de la consulta el esquema además de los datos.
Esta clausula la eliminaremos después de configurar los metadatos del adaptador.

Crear  un proyecto de Biztalk

  • Creamos un proyecto de Biztalk de tipo Empty Biztalk Server Project. Le llamaremos DemoSQLAdapter.

Añadir metadatos al proyecto

  • Pulsamos con el botón derecho sobre el proyecto que hemos creado previamente y seleccionamos Add --> Add Generated Items…
    En la siguiente pantalla seleccionamos la opción de Add Adapter Metadata y pulsamos el botón Add:

    img1.JPG

    • Deberemos seleccionar SQL en la lista de adaptadores registrados.
      En la misma pantalla indicamos el servidor y la base de datos donde se encuentra el procedimiento almacenado que vamos a invocar.

    Por ahora no seleccionaremos nada en la lista de puertos.
     

                      img2.JPG

    • En la pantalla Database Information definimos la cadena de conexión de la base de datos  que usaremos posteriormente.
    • En la pantalla Schema Information debemos definir la siguiente información:
      • Target namespace:  http://EjemploSQLAdapter
      • Seleccionar Send Port ya que vamos a enviar una petición  a SQL Server.
      • Debemos asignar un nombre al elemento raíz del documento de petición:  root_request
      • Debemos asignar un nombre al elemento raíz del documento de respuesta:  root_response

                    img3.JPG
     

    • En la pantalla Statement type information seleccionar Stored Procedure como tipo de sentencia.
      Por último en la pantalla Statement Information debemos seleccionar el procedimiento almacenado que vamos a ejecutar.
      Una vez seleccionado, pulsaremos el botón de Generate para generar el script de ejecución del procedimiento almacenado.

    Los valores de los parámetros son almacenados solamente para la generación del esquema.  En ejecución se usaran los parámetros pasados en el mensaje de petición.

    • El checkbox asigna el parámetro a NULL
    • Haciendo doble click sobre el parámetro podremos introducir los valores deseados.


     img4.JPG

    • Pulsar Finish.


    Una vez finalizado este proceso podemos comprobar que se han creado dos archivos: BizTalk Orchestration.odx y SQLService.xsd. El primero es una orquestación vacía con algunos tipos de puertos pre-configurados. El segundo archivo es el esquema que va a contener la estructura del mensaje de petición y de respuesta del adaptador.

    En este punto debemos modificar el procedimiento almacenado y eliminar la cláusula xmldata:


    select id,descripcion from tablaejemplo where
    id=@id for xml auto ,xmldata

    Crear los esquemas necesarios para el proyecto

    • Pulsamos con el botón derecho sobre el proyecto que hemos creado previamente y seleccionamos Add --> New Item --> Schema.
      Llamar EsquemaRequest.xsd al nuevo esquema.
    • Pulsar con el botón derecho en el nodo raíz (root) del nuevo esquema y seleccionar Insert Schema Node --> Child Field Element.
      Llamar a este elemento ID.
      Seleccionar este nodo y en la ventana de propiedades modificar el campo Data Type a xs:int.
    • Pulsar con el botón derecho en el nodo raíz (root) del nuevo esquema y seleccionar Insert Schema Node --> Child Field Element.
      Llamar a este elemento Descripcion.
      Una vez hayamos finalizado debemos tener un esquema igual al de la siguiente pantalla:

    img5.JPG

    Crear mapa

    Debemos crear un mapa que convierta el mensaje recibido por la orquestación al mensaje de petición del SQL Adapter.

    •  Pulsamos con el botón derecho sobre el proyecto que hemos creado previamente y seleccionamos Add --> New Item --> Map.
      Llama Mapa.btm al nuevo mapa.
    • Hacer click en el enlace Open Source Schema y seleccionar DemoSqlAdapter.EsquemaRequest.
    • Hacer click en el enlace Open Destination Schema y seleccionar DemoSqlAdapter.SQLService.
    • Seleccionar root_request.
    • Asociar los nodos ID de ambos esquemas.
    • Asociar el nodo Descripcion del esquema origen y el nodo desc del esquema destino.

    Añadir mensajes a la orquestación

    • Crear un mensaje llamado msgCallSQL y seleccionar como tipo de mensaje DemoSqlAdapter.SQLService.root_request.
    • Crear un mensaje llamado msgPeticion y seleccionar como tipo de mensaje DemoSqlAdapter.EsquemaRequest.
    • Crear un mensaje llamado msgResponse y seleccionar como tipo de mensaje DemoSqlAdapter.SQLService.root_response.


    Añadir componentes a la orquestación

    • Crear un shape de tipo Receive al que llamaremos ObtenerPeticion.
      Modificar la propiedad Activate de este shape a true.
      Seleccionar msgPeticion en la propiedad Message.
    • Crear un shape de tipo Transform inmediatamente debajo del anterior.
    • Seleccionar el shape de tipo Construct Message. Seleccionar el esquema msgCallSQL en la propiedad Messages Constructed.
    • Seleccionar el shape de tipo Transform y modificar la propiedad name con el valor Transform_ParametrosPA.
    • Configurar la transformación haciendo click en la propiedad Input Messages.
      • Hacer click en la opción Existing Map y posteriormente seleccionar DemoSqlAdapter.Mapa en el combo  Fully Quafiled Map Name.
      • Hacer click en Source y seleccionar posteriormente en el campo Variable Name msgPeticion.
      • Hacer click en Destination y seleccionar posteriormente en el campo Variable Name msgCallSQL.
    • Crear un shape de tipo Send inmediatamente debajo del anterior, al que llamaremos EjecutarPeticionSQL.
      Seleccionar msgCallSQL en la propiedad Message.
    • Crear un shape de tipo Receive inmediatamente debajo del anterior, al que llamaremos ObtenerResultado.
      Seleccionar msgResponse en la propiedad Message.
    • Crear un shape de tipo Send inmediatamente debajo del anterior, al que llamaremos EnviarRes.
      Seleccionar msgResponse en la propiedad Message.


    Añadir puertos a la orquestación

    • Crear un puerto y situarlo en el área  izquierda de puertos a la altura del shape ObtenerPeticion.
      Definir las siguientes propiedades del puerto:
      • Nombre: Port_ObtenerPeticion
      • Port Type: PortType_ObtenerPeticion
      • Communication Pattern: One-way
      • Port direction of communication: I’ll always be receiving messages on this port.
      • Port binding: Specify now
      • Transport: FILE
      • URI: escoger una ruta donde dejaremos el fichero xml que desencadene la orquestación. Ej.: c:\demo\in\*.xml
        Enlazamos el puerto Port_ObtenerPeticion con el shape ObtenerPeticion.
    • Crear un puerto y situarlo en el área derecha de puertos entre los shape EjecutarPeticionSQL y ObtenerResultado. Definir las siguientes propiedades del puerto:
      • Nombre: Port_CallSQL.
      • Port Type: PortType_CallSQL
      • Communication Pattern: Request-Response
      • Port direction of communication: I’ll be sending a request and receiving a response.
      • Port binding: Specify Later

             Enlazamos el shape EjecutarPeticionSQL con el mensaje de operación request del puerto Port_CallSQL.

             Enlazamos el shape EnviarRes con el mensaje de operación response del puerto Port_CallSQL.

    • Crear un puerto y situarlo en el área  izquierda de puertos a la altura del shape EnviarRes. Definir las siguientes propiedades del puerto:
      • Nombre: Port_Resultado
      • Port Type: PortType_Resultado
      • Communication Pattern: One-way
      • Port direction of communication: I’ll always be sending messages on this port.
      • Port binding: Specify now
      • Transport: FILE
      • URI: escoger una ruta donde dejaremos el fichero xml con el resultado de la operación. Ej.: c:\demo\out\res.xml

             Enlazamos el puerto Port_Resultado con el shape ObtenerResultado.

    • Anteriormente hemos creado un puerto llamado Port_CallSQL y hemos especificado que el binding lo haremos mas tarde. Ahora vamos a crear un puerto con el que haremos el binding.
      • En Biztalk Explorer hacemos click con el botón derecho en Send Ports y seleccionamos la opción Add Send Port.
      • En la lista seleccionamos Static Solicit-Response Port.
      • Definir las siguientes propiedades:
        • Transport type: SQL
        • Address (URI):
          • Connection String: Configuraremos la cadena de conexión
          • Document Target Namespace: tenemos que escribir el mismo namespace que el que definimos en los metadatos del esquema. En nuestro caso http://EjemploSQLAdapter.
          • Response Document Root Element: tenemos que escribir el mismo nombre, que el que definimos como elemento raíz del documento de respuesta cuando creamos los metadatos del esquema. En nuestro caso  root_response.
          • Send Pipeline:  Microsoft.BizTalk.DefaultPipelines.XMLTransmit
          • Solicit - Response:  Microsoft.BizTalk.DefaultPipelines.XMLTransmit
        • Renombrar el puerto de SendPort1 a  SendPortCall

    Finalmente deberemos tener una orquestación similar a la siguiente:

    img7.JPG

    Deploy de la aplicación


    Ya solo nos queda hacer el deploy de nuestra orquestación para poder probar el desarrollo.
    Para ello tenemos que firmar la orquestación con un strong name.
    Una vez distribuida la orquestación, tenemos que hacer el binding entre el puerto Port_CallSQL y el puerto  SendPortSQL. 
     

              img6.JPG

    Seleccionamos Host en Configurations y seleccionamos BizTalkServerApplication como host en el que enlistaremos la orquestación.

    Para probar la orquestación, solo tenemos que dejar un fichero xml que cumpla con el esquema de tipo EsquemaRequest en la ruta establecida en el puerto Port_ObtenerPeticion.

    Published Sunday, March 04, 2007 11:32 AM by admin
    Filed under:

    Comment Notification

    If you would like to receive an email when updates are made to this post, please register here

    Subscribe to this post's comments using RSS

    Comments

     

    Claudio said:

    muy bueno el artículo.... pero hay una parte que no me funciona... cuando ejecuto el generate y trato de pasar a la pestaña siguiente del biztalk adapter me sale un mensaje de error que dice: FOR XML AUTO IS REQUIRED.

    se supone que lo tiene el SP... ¿porque lo pide entonces?...

    yo trabajo con BTS 2002 y sql adapter lo utilizo para sacar datos de un BD, pero ademas quisiera que el mismo SP actualize un campo de esa BD para indicar que esa Fila/Filas ya fueron procesadas???

    Se puede??

    Saludos...y por si acaso y para compartir info mi correo es elquellonino@hotmail.com

    July 27, 2007 1:24 PM
     

    ana said:

    hola me gustaria que me explicaras como realizar un SP sencillo

    May 14, 2008 10:23 AM

    Leave a Comment

    (required) 
    (optional)
    (required) 
    Submit
    Powered by Community Server (Personal Edition), by Telligent Systems