Departamento de Engenharia Informática 2010/2011 Sistemas Empresariais Integrados Tutorial do Adaptador SQL 2º semestre Considere uma base de dados com uma tabela account que guarda o número de conta, o nome da agência, e o saldo. A figura seguinte mostra alguns exemplos de contas: Pretende-se construir uma orquestração que recebe um número de conta, realiza uma consulta à base de dados, e devolve os dados dessa conta. Por exemplo, dada a conta: <Account> <AccountNumber>A-101</AccountNumber> </Account> pretende-se que a orquestração produza como resultado final: <Account> <AccountNumber>A-101</AccountNumber> <BranchName>Downtown</BranchName> <Balance>500.00</Balance> </Account> Criação da base de dados 1. Abra o SQL Server Management Studio e verifique se existe a base de dados Bank. Se não existir, crie uma base de dados com esse nome. 2. Nos próximos passos confirme sempre que a base de dados seleccionada é Bank. IST/DEI Pág. 1 de 16
3. Verifique se a base de dados contém a tabela account. Se esta tabela não existir, execute as seguintes instruções para a criar: CREATE TABLE account( account_number varchar(255), branch_name varchar(255), balance decimal(20, 2), primary key (account_number) ); INSERT INTO account VALUES('A-101','Downtown',500.00); INSERT INTO account VALUES('A-102','Perryridge',400.00); INSERT INTO account VALUES('A-201','Perryridge',900.00); INSERT INTO account VALUES('A-215','Mianus',700.00); INSERT INTO account VALUES('A-217','Brighton',750.00); INSERT INTO account VALUES('A-222','Redwood',700.00); INSERT INTO account VALUES('A-305','Round Hill',350.00); INSERT INTO account VALUES('A-333','Central',850.00); INSERT INTO account VALUES('A-444','North Town',625.00); 4. Verifique que a tabela contém a conta A-101. Criação do stored procedure 5. Verifique se existe na base de dados o stored procedure GetAccountInfo. Se existir, apague-o. 6. Crie o stored procedure GetAccountInfo com as seguintes instruções: CREATE PROCEDURE GetAccountInfo(@account_number VARCHAR(255)) as SELECT branch_name, balance FROM account WHERE account_number = @account_number FOR XML AUTO, XMLDATA; 7. Teste o stored procedure com o comando: EXEC GetAccountInfo 'A-101'; 8. Verifique que o resultado contém o schema e os dados da conta em XML. IST/DEI Pág. 2 de 16
Criação da aplicação BizTalk 9. Abra o Visual Studio 2010 como administrador e crie um novo projecto BizTalk em C:\Tutorial\Lessons chamado DemoSQL. (Se o projecto já existir apague-o primeiro.) 10. No Solution Explorer, clique com o botão direito sobre o projecto e seleccione Add Generated Items. 11. Seleccione Add Adapter Metadata e clique Add. IST/DEI Pág. 3 de 16
12. Seleccione o adaptador SQL e clique Next. 13. Crie a connection string para se ligar à base de dados. Clique em Set, e depois especifique o nome da máquina local, seleccione integrated security, e escolha a base de dados Bank. IST/DEI Pág. 4 de 16
14. No ecrã seguinte, dê um namespace (http://demosql) e especifique que a porta é do tipo send. Escolha o nome para o nó raiz do pedido e da resposta (InAccount e OutAccount). 15. No ecrã seguinte escolha stored procedure. IST/DEI Pág. 5 de 16
16. No ecrã seguinte escolha o stored procedure e indique um valor de exemplo para o parâmetro (p.ex. A-101 isto será usado apenas para obter o schema da resposta). 17. Antes de prosseguir, clique em Generate e só depois em Next. 18. Clique em Finish. O Visual Studio fará uma chamada ao stored procedure com o valor de exemplo e serão gerados vários artefactos automaticamente. Nomeadamente, foi criado: um schema (SQLService.xsd) que contém dois nós raiz (InAccount para o pedido à BD e OutAccount para a resposta da BD) uma orquestração aparentemente vazia que contém (ver em Orchestration View): o um port type SQLServiceExec que é o tipo de porta que deve ser usado para comunicar com a BD; o dois Multi-part Message types (procedurerequest e procedureresponse) que são os tipos de mensagem que devem ser usados para interagir com a BD. Desenvolvimento da orquestração 19. A orquestração a ser desenvolvida terá de: receber do exterior um pedido inicial com número de conta; transformar o pedido inicial para pedido à BD; enviar pedido à BD; IST/DEI Pág. 6 de 16
receber resposta da BD; transformar resposta da BD para resultado final; enviar resultado final para o exterior. 20. Adicione as seguintes shapes à orquestração: Uma shape Receive para receber o pedido inicial; Uma shape Transform para criar o pedido à BD; Uma shape Send para enviar o pedido à BD; Uma shape Receive para receber a resposta da BD; Uma shape Transform para criar o resultado final; Uma shape Send para enviar o resultado final para o exterior. 21. Nas propriedades da shape Receive_1, coloque Activate = True. IST/DEI Pág. 7 de 16
Criação dos schemas para pedido inicial e resultado final 22. Crie um novo schema (Account.xsd) para o pedido inicial, com um único elemento: AccountNumber. 23. Crie um novo schema (AccountInfo.xsd) para o resultado final, com três elementos: AccountNumber, BranchName e Balance. Criação das mensagens da orquestração 24. No Orchestration View, crie quatro novas mensagens e nas propriedades indique o schema de cada uma delas: msgaccount pedido inicial (Account.xsd) msgaccountinfo resultado final (AccountInfo.xsd) msginforequest pedido à BD (Multi-part Message Type: procedurerequest) msginforesponse resposta da BD (Multi-part Message Type: procedureresponse) 25. Na orquestração, seleccione as shapes de send e receive, e nas propriedades indique as mensagens enviadas/recebidas por cada uma delas: Receive_1: msgaccount Send_1: msginforequest Receive_2: msginforesponse Send_2: msgaccountinfo Criação dos mapas de transformação 26. Faça duplo-clique no Transform_1 e indique: New Map IST/DEI Pág. 8 de 16
Nome do Mapa: DemoSQL.MapAccountToInfoRequest Source: msgaccount Destination: msginforequest.parameters 27. Ligue o elemento AccountNumber de msgaccount ao elemento account_number de InAccount (parâmetro do stored procedure) 28. Faça duplo-clique no Transform_2 e indique: New Map Nome do Mapa: DemoSQL.MapInfoResponseToAccountInfo Source: msgaccount Source: msginforesponse.parameters Destination: msgaccountinfo IST/DEI Pág. 9 de 16
29. Repare que este mapa tem duas mensagens de origem: msgaccount para ir buscar o número da conta ao pedido inicial; msginforesponse.parameters para ir buscar o nome da agência e o saldo da conta que vieram na resposta da BD. 30. Ligue Account_Number do pedido inicial a AccountNumber do resultado final. Ligue branch_name e balance que vieram na resposta da BD a BranchName e Balance no resultado final. IST/DEI Pág. 10 de 16
Criação das portas da orquestração 31. Crie uma porta na orquestração para receber o pedido inicial: Nome: PortReceiveAccount Create New Port Type: PortTypeReceiveAccount One-Way Internal Direction: I will always be receiving Binding: Specify later 32. Crie uma porta na orquestração para enviar o resultado final: Nome: PortSendAccountInfo Create New Port Type: PortTypeSendAccountInfo One-Way Internal Direction: I will always be sending Binding: Specify later 33. Crie uma porta na orquestração para interagir com a BD: Nome: PortSQLAdapter Use Existing Port Type: SQLServiceExec One-Way Internal Direction: I ll be sending a request and receiving a response Binding: Specify later 34. Ligue as shapes às portas conforme a figura seguinte: IST/DEI Pág. 11 de 16
Configurar a aplicação para deployment 35. Nas configurações do projecto, assine a assembly com um strong name. Pode usar o mesmo strong name que já utilizou nos outros tutoriais. 36. Nas propriedades de deployment, indique o nome da aplicação DemoSQL, indique a máquina (LOCAL), e coloque Redeploy a True, bem como Restart Host Instances. 37. Faça build e deploy da aplicação. IST/DEI Pág. 12 de 16
Configuração da aplicação na consola de administração 38. Na consola de administração do BizTalk, clique com o botão direito na aplicação DemoSQL e seleccione Configure. 39. Escolha BizTalkServerApplication para servir de host da orquestração. 40. Crie uma Receive Port e uma Receive Location para receber o pedido inicial. Esta porta deve ser do tipo FILE e deve usar a pipeline XMLReceive. Crie o directório onde o pedido inicial será colocado e configure a porta para usar esse directório. IST/DEI Pág. 13 de 16
41. Crie uma Send Port para enviar o resultado final. Esta porta deve ser do tipo FILE e deve usar a pipeline XMLTransmit. Crie o directório onde o resultado final será colocado e configure a porta para usar esse directório. 42. Crie uma send port para comunicar com a BD. Esta porta deve usar o adaptador SQL e as pipelines XMLReceive e XMLTransmit. IST/DEI Pág. 14 de 16
43. Configure a porta do adaptador SQL: Na Connection String, especifique o nome da máquina local, seleccione integrated security, e escolha a base de dados Bank, tal como fez no passo 13. No Document Target Namespace, indique http://demosql tal como fez no passo 14. No Response Document Root Element, indique OutAccount tal como fez no passo 14. 44. Depois de configuradas as portas, arranque a aplicação com Start. Remoção de XMLDATA do stored procedure No passo 6, foi incluída a instrução FOR XML AUTO, XMLDATA no stored procedure, que gera os dados em XML juntamente com o schema desses dados (XMLDATA). A opção XMLDATA foi necessária para obter o schema da resposta da BD no passo 16. Mas agora que está tudo configurado, já não é preciso o schema, só é preciso obter os dados. Sendo assim, é necessário remover a opção XMLDATA do stored procedure. 45. No SQL Server Management Studio, localize o stored procedure GetAccountInfo na base de dados Bank e apague-o. IST/DEI Pág. 15 de 16
46. Confirme que a base de dados seleccionada é Bank. 47. Crie novamente o stored procedure com as seguintes instruções: CREATE PROCEDURE GetAccountInfo(@account_number VARCHAR(255)) as SELECT branch_name, balance FROM account WHERE account_number = @account_number FOR XML AUTO; 48. Teste o stored procedure com o comando: EXEC GetAccountInfo 'A-101'; Teste da aplicação 49. No Visual Studio, clique com o botão direito no schema Account.xsd e seleccione Generate Instance. 50. Use esta instância para criar um pedido inicial com um valor de exemplo em AccountNumber, p.ex. A-101. 51. Coloque este pedido inicial na porta que dispara a orquestração. 52. Verifique que o resultado final produzido pela orquestração está correcto. IST/DEI Pág. 16 de 16