Inquiridor
SSIS Custom Connection Manager

Pergunta
-
Estou tentando criar um gerenciador de conexões customizado para SQL Server Integration Services 2019, este componente já funciona no SQL Server Integration Services 2012, mas, após converter para SQL Server 2019 e alterar DLLs da mesma versão, quando utilizo a conexão em Visual Studio, recebo um erro:
O tipo de conexão "XXX" especificado para o gerenciador de conexões "XXX" não foi reconhecido como um tipo de gerenciador de conexões válido. Este erro é retornado quando é feita uma tentativa de criar um gerenciador de conexões para um tipo de conexão desconhecido. Verifique a ortografia no nome do tipo de conexão
Meu código:
using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Text; using System.Xml; using Microsoft.SqlServer.Dts.Runtime;
namespace TesteCon { [DtsConnection( ConnectionType = "COMTest", DisplayName = "Test COM Connection", Description = "Connection Test COM Services", //IconResource = "TesteCon.TesteCon.ico", ConnectionContact = "Test", UITypeName = "TesteConUI.TesteConUI,TesteConUI,Version=1.0.0.0,Culture=neutral,PublicKeyToken=2ce2b8238f2c8ed7")] public class TesteCon : ConnectionManagerBase, IDTSComponentPersist { //Public Key : 2ce2b8238f2c8ed7 #region Get and Sets private const string CONNECTIONSTRING_TEMPLATE_RECEIVE = "MESSAGE=<message>;IDPEDIDO=<idpedido>;TYPE=<type>;"; private const string CONNECTIONSTRING_TEMPLATE_ENVIO = "MESSAGE=<message>;"; private string MessageTransaction = ""; private string IdPedidoTransaction = ""; private string TypeAction = ""; [CategoryAttribute("ICOM Connection")] [Description("Caminho do arquivo ICOM.ini")] public string PathICOMIn { get; set; } [Category("ICOM Connection"), Description("Persiste conexão ativa")] public bool PersistentConnection { get; set; } public override string ConnectionString { get; set; } #endregion #region Creator public TesteCon() { PersistentConnection = false; } #endregion #region Overrides Connections public override DTSExecResult Validate(IDTSInfoEvents infoEvents) { if (!Directory.Exists(PathICOMIn)) { infoEvents.FireError(0, "ICOM Connection", "Caminho informado para a conexão está inválido", string.Empty, 0); return DTSExecResult.Failure; } return DTSExecResult.Success; } public override void ReleaseConnection(object connection) { base.ReleaseConnection(connection); } public override object AcquireConnection(object txn) { try { ConnectionString = "CODIGORETORNO=000;"; return "OK"; } catch (Exception) { ConnectionString = "CODIGORETORNO=-999;"; return null; } finally { ConnectionString = "Finally"; } return base.AcquireConnection(txn); } public void SaveToXML(XmlDocument doc, IDTSInfoEvents infoEvents) { XmlElement rootElement = doc.CreateElement("TESCONMANAGER"); doc.AppendChild(rootElement); XmlAttribute connectionStringAttr = doc.CreateAttribute("ConnectionString"); connectionStringAttr.Value = ConnectionString; rootElement.Attributes.Append(connectionStringAttr); XmlAttribute userNameStringAttr = doc.CreateAttribute("PathICOMIn"); userNameStringAttr.Value = PathICOMIn; rootElement.Attributes.Append(userNameStringAttr); XmlAttribute urlStringAttr = doc.CreateAttribute("PersistentConnection"); urlStringAttr.Value = PersistentConnection == true ? "Sim" : "Nao"; rootElement.Attributes.Append(urlStringAttr); } public void LoadFromXML(XmlElement node, IDTSInfoEvents infoEvents) { // Checking if XML is correct. This might occur if the connection manager XML has been modified outside BIDS/SSDT if (node.Name != "TESCONMANAGER") { throw new Exception(string.Format("Unexpected connectionmanager element when loading task - {0}.", "TESCONMANAGER")); } else { // Fill properties with values from package XML this.PathICOMIn = node.Attributes.GetNamedItem("PathICOMIn").Value; this.PersistentConnection = node.Attributes.GetNamedItem("PersistentConnection").Value == "Sim" ? true : false; this.ConnectionString = node.Attributes.GetNamedItem("ConnectionString").Value; } } #endregion }
este código não faz nada, apenas retorna "OK" , apenas para testar.
DLL: Microsoft.SqlServer.ManagedDTS Versão: 15.0.0.0
Não sei o que pode causar esse erro e não consigo encontrar exemplos de gerenciadores de conexões personalizados para o SSIS 2019.
Todas as Respostas
-
Olá Josivan,
Obrigado por usar os fóruns do MSDN.
Recebemos o seu inquérito e juntamente com a comunidade esperamos encontrar uma solução para o seu problema e/ou dúvida.
Se você tiver informações adicionais que possam nos ajudar a resolver o problema, poderá adicioná-las para acelerar o tempo de resposta.
Pablo Garcia
____________________________
Por favor, lembre-se de "Marcar respostas" para respostas que resolveram seu problema, é uma maneira comum de reconhecer aqueles que ajudaram e torna mais fácil para outros visitantes encontrarem a solução mais tarde. -
O que descobri se executar o Visual Studio com Run64bitRuntime = True, funciona, mas, se executar Run64bitRuntime = False, recebo o mesmo erro:
O tipo de conexão "COMTest" especificado para o gerenciador de conexões "Test COM Connection" não é reconhecido como um tipo de gerenciador de conexões válido. Este erro é retornado quando é feita uma tentativa de criar um gerenciador de conexões para um tipo de conexão desconhecido. Verifique a ortografia no nome do tipo de conexão.
Minha DLL é copiada em ambos os lugares:
- C:\Arquivos de Programas (x86)\Microsoft SQL Server\150\DTS\Conexões
- C:\Arquivos de Programas\Microsoft SQL Server\150\DTS\Conexões
Para registrar uma DLL eu usei:
- c:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\gacutil.exe
Mas não consigo executar no modo 64 bits, preciso de 32 bits e não sei se existem outras maneiras diferentes de registrar 32 bits e 64 bits.
Tentei instalar outros componentes, como Kingswaysoft, e funciona todos os componentes customizados, menos meu componente -
Josivan,
Recentemente me deparei com um cenário similar ao seu!
Para tentar contornar reinstalamos todos o ambiente em 32bits, desde o sistema operacional, SQL Server, Visual Studio, BIDS, enfim....
Não sei dizer se esta solução palhativa que realizamos poderá resolver o seu problema.
E um detalhe importante, tenha os backups da versão 2012 atualizados, pois após migrar para a versão 2019 não é mais possível fazer o downgrade.
Pedro Antonio Galvão Junior [MSc. | MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
-
Josivan,
Que eu saiba não! Pois isso está diretamente relacionado com as propriedades do projeto.
Pedro Antonio Galvão Junior [MSc. | MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional | Data Warehouse | Data Mining | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.com.br]
-
O erro que você está recebendo pode ser causado por uma incompatibilidade entre as DLLs que você está usando e a versão do SQL Server Integration Services que você está usando.
Você mencionou que o componente estava funcionando no SQL Server Integration Services 2012, mas depois de converter para a versão 2019 e alterar as DLLs, o erro ocorreu. Isso sugere que as DLLs que você está usando podem ser desatualizadas ou não compatíveis com a versão 2019 do SQL Server Integration Services.
Outra possível causa do erro pode ser a falta de registro correto das DLLs no sistema. Você mencionou que está usando o gacutil.exe para registrar as DLLs, mas talvez seja necessário registrar as DLLs de forma diferente para versões de 32 bits e 64 bits. Certifique-se de que as DLLs estão registradas corretamente e que a versão correta da DLL está sendo usada.
Verifique também se existe alguma dependência necessária que não foi instalada, como outras dlls, frameworks ou pacotes.
Você poderia tentar registrar a DLL de 32 bits manualmente utilizando o comando regasm.exe (que está localizado em C:\Windows\Microsoft.NET\Framework\v4.0.30319) passando o parametro /codebase e /tlb, isso garantiria que a DLL estaria registrada no sistema corretamente.
-
Uma possível causa do problema é que a DLL não está sendo registrada corretamente em ambos os lugares (32 bits e 64 bits) onde é necessário. Ao usar o gacutil.exe, você estaria registrando a DLL apenas para a arquitetura de 64 bits. Para registrar a DLL para a arquitetura de 32 bits, você pode usar o regsvr32.exe, que é o utilitário de registro do Windows. Certifique-se de executar o regsvr32.exe como administrador e, quando estiver registrando a DLL, especifique o caminho completo da DLL para a versão de 32 bits.
Outra possível causa é que a DLL contém dependências que não foram incluídas na instalação. Certifique-se de que todas as dependências da DLL estão presentes e registradas.
Eu sugiro também verificar as configurações de compatibilidade do seu componente customizado no Visual Studio, para garantir que ele está sendo executado corretamente com as configurações corretas.
Verificar também se há alguma configuração de segurança ou firewall bloqueando a comunicação com DLL
Eu sugiro também tentar desinstalar e reinstalar o seu componente customizado, e verificar se os arquivos DLL estão sendo copiados para os locais corretos.
-
eallves obrigado pelas respostas.
Eu fiz o teste com tentativa de registro pelo regsvr32.exe, mas a DLL não é para esse tipo de registro:
O módulo "C:\Program Files (x86)\Microsoft SQL Server\150\DTS\Connections\NewTestCon.dll" foi carregado, mas o ponto de entrada DllRegisterServer não foi localizado.
Certifique-se de que "C:\Program Files (x86)\Microsoft SQL Server\150\DTS\Connections\NewTestCon.dll" é um arquivo DLL ou OCX válido e tente novamente.
já utilizando RegAsm.exe consegui fazer o registro:
C:\Windows\Microsoft.NET\Framework\v4.0.30319>RegAsm.exe "C:\Program Files (x86)\Microsoft SQL Server\150\DTS\Connections\NewTestCon.dll" /tlb /codebase
Então tenho o registro do RegAsm.exe e do gacutil.exe
Microsoft .NET Framework Assembly Registration Utility versão 4.8.4084.0
para Microsoft .NET Framework versão 4.8.4084.0
Copyright (C) Microsoft Corporation. Todos os direitos reservados.
O assembly foi exportado para 'C:\Program Files (x86)\Microsoft SQL Server\150\DTS\Connections\NewTestCon.tlb' e a biblioteca de tipos foi registrada com êxito
A versão do framework que estou compilando minha DLL é a 4.8 e a única referência adicionada é a DLL Microsoft.SQLServer.ManagedDTS versão 15.0.0.0, o que indica que faz parte das DLL da versão do SQL Server 2019
Após ambos os registros, regasm.exe e gacutil.exe continuo recebendo o mesmo erro.
Um detalhe é que peguei um instalador na sua versão de teste de componentes do SSIS, onde ele possuí a instalação de acordo com a versão do SQL Server existente na maquina, eu fiz a instalação sobre a versão 2019, e tentei copiar as DLLs da pasta do 2019: C:\Program Files (x86)\Microsoft SQL Server\150\DTS\Connections para a pasta do 2016: C:\Program Files (x86)\Microsoft SQL Server\130\DTS\Connections, modifiquei a versão do meu projeto SSIS para o TargetServerVersion = SQL Server 2016, e somente copiando as DLLs para a pasta correta, recebi o mesmo erro do meu caso, ou seja, estou confiante que o problema está na forma de registro, porém não sei como que o instalador faz esse registro das suas DLLs.
Link do instalador: Instalador
Não sei se existe mais alguma outra forma para registrar essa DLL.
- Editado Josivan Laskoski segunda-feira, 30 de janeiro de 2023 13:51
-
Josivan,
Sinceramente, a forma que você esta seguindo é a mais conhecida e oficialmente recomendada.
Pedro Antonio Galvão Junior [MSc. | MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional | Data Warehouse | Data Mining | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.com.br]
-
Olá Josivan,
Alguma novidade sobre a consulta feita?
A resposta fornecida foi útil?
Obrigado por usar os fóruns do MSDN.
Pablo Garcia
____________________________
Por favor, lembre-se de marcar "PROPOR COMO RESPOSTA" para respostas que resolveram seu problema, é uma maneira comum de reconhecer aqueles que ajudaram e torna mais fácil para outros visitantes encontrarem a solução mais tarde. -
Olá!
Não, nenhuma novidade, ainda tentando entender pq com o registro feito e a DLL nas pastas corretas, recebo a memsagem de erro.
Error: 0xC0014005 at Package1: The connection type "COMTest" specified for connection manager "COMTest Connection" is not recognized as a valid connection manager type. This error is returned when an attempt is made to create a connection manager for an unknown connection type. Check the spelling in the connection type name.
-
Josivan,
Você já tentou colocar estes arquivos .dll na mesma pasta do projeto?
Pedro Antonio Galvão Junior [MSc. | MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional | Data Warehouse | Data Mining | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.com.br]
-
Olá Josivan,
Tudo bem?
Alguma novidade sobre a consulta feita?
Conseguiu fazer o que o Junior pediou?
Obrigado por usar os fóruns do MSDN.
Pablo Garcia
____________________________
Por favor, lembre-se de marcar "PROPOR COMO RESPOSTA" para respostas que resolveram seu problema, é uma maneira comum de reconhecer aqueles que ajudaram e torna mais fácil para outros visitantes encontrarem a solução mais tarde.