Ir para conteúdo
  • Cadastre-se

dev botao

Runtime error 216 e 217


Ver Solução Respondido por marciomtk,
  • Este tópico foi criado há 2171 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Boa tarde Pessoal,

De alguns dias pra cá me deparei com um problema que até então não encontrei solução. Algumas vezes quando fecho minha aplicação é retornado Runtime error 216 ou 217.

Efetuei vários testes para afunilar e identificar qual seria o problema e consegui chegar no seguinte. O erro só ocorre quando minha aplicação não consegue conexão com o banco de dados Postgres que é acessado pelo ODBC utilizando DBExpress. Outro fator importante que compilando com o Delphi XE3 o erro não ocorre, agora com o XE7 e XE10 Seattle o erro se manifesta.

Então em comum temos dois pontos, a versão da IDE e o problema ao conectar na base de dados, que juntos ocasionam o erro. Se eu tiver sucesso na conexão do banco o erro também não ocorre.

Fiz um projeto de testes aonde que no FormActivate eu faço Connected := True; da base de dados, onde é possível simular o erro, o projeto esta em anexo.

Alguém já teve algum problema semelhante?

 

Desde já agradeço a ajuda da comunidade.

Projeto.zip

Link para o comentário
Compartilhar em outros sites

Cara, deixa eu te explicar uma situação que aconteceu comigo e quase me deixou doido, talvez esse seja o seu problema.

Usava o Delphi XE desde seu lançamento, não vi motivos para migrar, já que compilação 64bit pra quem usa o capcom ou openssll não roda. Me vi na obrigação de migrar porque estava ficando muito atrasado, já que a linguagem e bibliotecas estão passando por muitas mudanças.

Ao migrar toda a aplicação e compilar, nas estações de desenvolvimento onde está instalado o Delphi roda perfeitamente,  mas onde não estava instalado o delphi apresentava muitos problemas principalmente em relação a banco de dados. Depois de muito bater cabeça percebi que, como o Delphi passou por muitas mudanças você deve distribuir suas aplicações também com todas as bibliotecas necessárias que foram alteradas com o tempo. Isso vale, principalmente, para a DLL chamada de Midas. Se você usa o Delphi XE, XE2, XE3 e etc... Você deve distribuir sua aplicação com as respectivas dlls que foi compilado seu código. 

Se você está somente distribuindo o EXE e deixando as dlls antigas, você terá muitos problemas.

Pra você ter ideia, a Midas.dll do Delphi XE tem  289KB, agora a Midas.dll de 32bits do DELPHI Siatle tem 427KB, ou seja, tem mudanças pra ca*****. 

 

Espero ter ajudado, Boa sorte.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 15/09/2016 at 17:48, joaoelson disse:

Cara, deixa eu te explicar uma situação que aconteceu comigo e quase me deixou doido, talvez esse seja o seu problema.

Usava o Delphi XE desde seu lançamento, não vi motivos para migrar, já que compilação 64bit pra quem usa o capcom ou openssll não roda. Me vi na obrigação de migrar porque estava ficando muito atrasado, já que a linguagem e bibliotecas estão passando por muitas mudanças.

Ao migrar toda a aplicação e compilar, nas estações de desenvolvimento onde está instalado o Delphi roda perfeitamente,  mas onde não estava instalado o delphi apresentava muitos problemas principalmente em relação a banco de dados. Depois de muito bater cabeça percebi que, como o Delphi passou por muitas mudanças você deve distribuir suas aplicações também com todas as bibliotecas necessárias que foram alteradas com o tempo. Isso vale, principalmente, para a DLL chamada de Midas. Se você usa o Delphi XE, XE2, XE3 e etc... Você deve distribuir sua aplicação com as respectivas dlls que foi compilado seu código. 

Se você está somente distribuindo o EXE e deixando as dlls antigas, você terá muitos problemas.

Pra você ter ideia, a Midas.dll do Delphi XE tem  289KB, agora a Midas.dll de 32bits do DELPHI Siatle tem 427KB, ou seja, tem mudanças pra ca*****. 

 

Espero ter ajudado, Boa sorte.

 

Bom dia joaoelson,

  Na verdade ainda to peleando nesse problema. Tentei ver essa questão das dlls registrando e colocando no projeto as existentes da versão do Delphi que estou utilizando mais a principio ainda não resolveu. Provável que estou esquecendo algo, deixando passar algo despercebido. 

  Também segui as dicas de outro post no site http://www.activedelphi.com.br/forum/viewtopic.php?t=92390&sid=07dd1b1dc70c28984cc32b440d368603  que até se encaixava na minha situação já que eu tinha o Delphi XE3 e o XE10 Seattle na mesma maquina mais também não resolveu.

  Mais vamos lá, procurando a solução. Assim que conseguir posto ela aqui. Obrigado pela colaboração.

Anexei junto com o post um projeto que no FormActivate tenta conectar na BD pelo ODBC. Se vcs utilizam o Delphi XE 10, por exemplo, só compilam e executem o projeto e vejam se ao fechar o form ele vai retornar erro.

Projeto.zip

Link para o comentário
Compartilhar em outros sites

Amigo, o erro que apresenta é esse. Não existe nenhuma fonte de dados e também não existe drive específico para a conexão.

Da uma olhada nesse link, você verá como faz a conexão certinha via odbc com o DBExpress.

http://www.devmedia.com.br/acessado-drivers-odbc-com-dbexpress/5196

 

Só pra tirar uma dúvida, qual baco de dados você usa?

Amigo, esse DBExpress só está no delphi, ainda, por compatibilidade. Logo mais eles irão tirar. Nunca prestou, sempre com muitos problemas. A princípio eles criaram para o substituir o ADO e o BDE, mesmo assim nunca superou os antigos sempre foi uma porcaria. Sempre dependeu de dll de terceiros e com isso os problemas sempre existiram. Um exemplo disso é que de tanto baterem cabeça com os milhares de erros, resolveram comprar os componentes AnyDac que agora se chama FireDac. 

Já que você está usando o Delphi mais recente, te recomendo mudar para o FireDac. Esse é mais atualizado, não depende de DLL de terceiros e tem suporte a quase todos os banco de dados.

 

Erro.jpg

Editado por joaoelson
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

15 horas atrás, joaoelson disse:

Amigo, o erro que apresenta é esse. Não existe nenhuma fonte de dados e também não existe drive específico para a conexão.

Da uma olhada nesse link, você verá como faz a conexão certinha via odbc com o DBExpress.

http://www.devmedia.com.br/acessado-drivers-odbc-com-dbexpress/5196

 

Só pra tirar uma dúvida, qual baco de dados você usa?

Amigo, esse DBExpress só está no delphi, ainda, por compatibilidade. Logo mais eles irão tirar. Nunca prestou, sempre com muitos problemas. A princípio eles criaram para o substituir o ADO e o BDE, mesmo assim nunca superou os antigos sempre foi uma porcaria. Sempre dependeu de dll de terceiros e com isso os problemas sempre existiram. Um exemplo disso é que de tanto baterem cabeça com os milhares de erros, resolveram comprar os componentes AnyDac que agora se chama FireDac. 

Já que você está usando o Delphi mais recente, te recomendo mudar para o FireDac. Esse é mais atualizado, não depende de DLL de terceiros e tem suporte a quase todos os banco de dados.

 

Erro.jpg

Bom dia joaoelson,

  Obrigado mais uma vez pela ajuda, fico feliz por sempre ter alguém disposto a ajudar, agregando conhecimento ao fórum.

Esse erro ocorre pelo fato de na sua maquina não ter configurado uma conexão ODBC com o nome 'Supervisor' que é passado por parâmetro na conexão. Até ai tudo bem, não seria esse o problema, eu fiz esse programa de exemplo pra realmente dar erro ao tentar efetuar a conexão pelo ODBC.

Eu estou conseguindo trabalhar tranquilamente com o DBExpress conectando ODBC no Postgres, a questão é quando por alguma situação meu aplicativo não consegue conexão com o BD. Digamos que por algum fator caiu a rede, ou foi configurado incorretamente o ODBC, ou como no exemplo que vc executou na sua maquina nem exista a conexão criada. Nesse momento quando é efetuado o fechamento do aplicativo é retornado o seguinte erro ->

erro.jpg

Esse seria o problema, sempre que por algum motivo dar erro de conexão entre meu aplicativo utilizando DBExpress conectando no ODBC, ao fechar ele o erro acima é retornado. As vezes é Runtime error 217 também.

Se durante a execução do programa não ocorrer erro de conexão, ao fechar ele também não ocorre o runtime error.

 

Faz esse teste joaoelson, executa o programa e depois fecha ele, 1 ..2 vezes, veja se não vai retornar o runtime error.

 

Realmente já estamos estudando a troca entre o DBExpress e o FireDac, o problema agora é o tempo pra rever tudo que já esta funcionando.

 

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...
  • Solution

Oi 

sei que e provavelmente já tenha resolvido, mais eu estava com esse mesmo problema a muito tempo, e pesquisei muito mais não obtiver nenhum resultado.... ate agora ,faz 20 minutos que achei solução e quero postar aqui para que futuramente pessoas encontre a resposta para esse problema...

A solução e bem simples na verdade

Tutil.getConexao.Free; 

eu tenho um componente de conexão  dinâmico e o que fiz foi no form principal no evento Onclose foi simplesmente tirar da memoria com um free...

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2171 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.