6 maneiras de fazer a mesma coisa, o que é considerado boas práticas?

As vezes tem tantas maneiras diferentes de fazer o mesmo código que nós ficamos na dúvida quanto a qual maneira usar. O que seria considerado "boa prática" pela comunidade e o que sua equipe entenderia melhor. Suponhamos que você esteja trabalhando dentro de um método de um Domain Service chamado UmDomainServiceChique(objetoDoDominio) que será chamado por uma API. Você tem uma regra de negócio chique para ser verificada que por enquanto chamarei de VerificaMinhaRegraChiqueComplexa(). Você chama UmDomainServiceChique(objetoDoDominio) e caso VerificaMinhaRegraChiqueComplexa() retorne true você vai querer que UmDomainServiceChique faça o que tem que fazer e a api retornar Ok 200, caso contrário você quer que a API responda um erro qualquer, tipo BadRequest, e retornar uma mensagem dizendo que VerificaMinhaRegraChiqueComplexa deu ruim. Eu vejo 6 maneiras de fazer isso, gostaria de saber a opinião de outrs devs sobre qual seria a maneira menos gambiarr

erro "ora-12154: tns: não foi possível resolver o identificador de conexão especificado"

Para se conectar uma aplicação Delphi no Oracle é necessário editar o arquivo tsnames.ora, geralmente na pasta C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN caso seu oracle seja o XE.
Esse erro pode acontecer tanto em runtime como em design-time, com qualquer tipo de componente: DBX, ADO e assim por diante. É mais comum que aconteça em tempo de design em um windows de 64 bit. 
Em alguns casos onde essa mensagem de erro aparece é porque o arquivo não existe ou está em uma pasta que o Delphi ou o seu aplicativo não tem permissão de acesso. 
Na grande maioria dos casos o erro ocorre apenas em design-time e nunca em runtime. Se esse é o seu caso  então provavelmente a culpa é do windows de 64 bit, mais especificamente o fato de o Delphi estar instalado na pasta "Arquivos de Programas (x86)". Explicando, o driver de conexão ao oracle não suporta caminhos contendo parênteses "()", esses que tem no "(x86)". Ele não consegue encontrar nem o driver de conexão nem o arquivo tsnames.ora por causa desses parênteses. Instale o Delphi em uma pasta tipo "Arquivos de Programas" "normal" ou até mesmo em uma pasta direto na raiz, como c:\Delphi.
Se o Delphi já está instalado nesta pasta problemática ainda assim é possível copiar toda a pasta do RAD STUDIO (geralmente C:\Arquivos de programas (x86)\Embarcadero\RAD Studio) para uma pasta qualquer, tipo c:\rad studio, e execute o Delphi dali. (ele se encontra na pasta 7.0\bin se for o 2010 ou 8.0\bin se for o XE, é o arquivo bds.exe).
Ele vai executar normalmente, mesmo no local "errado", já que tudo que ele precisa em matéria de bibliotecas está no registro e ele consegue encontrar no diretório original, e isso não impedirá de que uma conexão DBX com o oracle funcione normalmente. Vai funcionar mesmo em design-time, e compilar sua aplicação normalmente.

Have fun ;)

Comentários

  1. Bom dia,

    Você pode resolver este problema criando em variáveis de ambiente no windows a variável de nome TNS_ADMIN apontando para o diretório onde encontra-se o tnsnames.ora.

    TNS_ADMIN = C:\caminho dos arquivos

    AdilsonD

    ResponderExcluir
    Respostas
    1. Tentei criar a variável aqui e não funcionou.
      Estou usando Delphi 1.2 Tokyo e Windows 10

      Excluir
    2. Pra mim não funcionou... Criei a variável de ambiente no Windows 10 e ainda continuo não conseguindo conectar de dentro da pasta (x86)

      Excluir
  2. Também dá o mesmo problema se sua aplicação estiver localizada em uma pasta com ( ou )... Não necessariamente estre problema acontece na IDE do delphi

    ResponderExcluir
  3. Bom dia Adilson, não sabia desse esquema da variavel de ambiente, bom saber. Só alterava o tnsnames.ora mesmo.

    Adriano, bom dia. É interessante essa observação. Qualquer aplicação que acesse o oracle e que estiver em um caminho ou pasta com parênteses dá esse problema então, tipo na Program Files (x86).

    Mas quando você vê esse erro acontecendo no Delphi, na IDE, que está no Program Files (x86) e não acontece no seu executavel rodando sozinho simplesmente porque você colocou ele numa pasta com nome "normal" é uma situação bem bizarra e bem difícil de descobrir onde está o problema: você vê o erro acontecendo no Delphi em design-time e não acontecendo na sua aplicação em runtime, quando na verdade a maioria das vezes agente espera o contrário.

    Eu quis resolver a situação no Delphi, acredito que assim (e compilando seu EXE numa pasta sem () ) você resolve o problema.

    ResponderExcluir
  4. Vitor testei a solução de AdilsonD e funcionou perfeitamente, mesmo com o delphi no dir (x86), sem ser necessário a troca do dir do RAD.
    Minha instação eh: Oracle 11G, delphi 2010 e client do oracle.

    Apanhei ateh achar este post e resolver o problema!

    Parabéns a vocês por compartilharem conhecimento.
    Abraços.

    ResponderExcluir
  5. Pessoal, estou passando por esse problema. É a primeira vez que trabalho com Delphi e Oracle. Devo editar o arquivo tsnames.ora e colocar que informação ?

    Agradeço pela ajuda.
    Romagnoli

    ResponderExcluir
  6. Você pode abrir o arquivo no notepad e ver as informações. São aquelas configurações de sempre: host, porta, banco, login e senha. A maioria vai estar default, você só muda os textos relacionados ao seu banco, login e senha.

    ResponderExcluir
  7. Bom pessoal sou iniciante e estou querendo ajuda para vincular o data base Oracle 10g XE no Visual Basic 2010 sempre da erro, vou na opção ADD connection mais nao sei qual server name usar.

    ResponderExcluir
    Respostas
    1. Se você instalou e configurou o Oracle 10g corretamente então o servername é o nome ou IP do servidor (localhost se estiver na sua máquina) e o databasename é o nome da instância do Oracle, que no caso do XE só existe uma instância default (esqueci o nome agora).

      Excluir
  8. Não sei o que acontece, estou com windows xp instalado, oracle perfeito, uso o plsql para teste e funciona corretamente. Porém uso o zeos lib para conexão. E da o erro. Tudo está instalado na pasta sem (**) e o tsnames está correto, tando que consulto pelo proprio sql, fiz o ping o banco ta de pé normal. Tenho d7 instalado com mesmo componentes e mesma configuração, funciona perfeitamente. Agora não sei o que pode estar havendo....

    ResponderExcluir
  9. Olá amigo, eu consigo o primeiro acesso após a instalação faço o teste de conexão, tudo certo.
    Só que o problema vem depois,o seguinte erro apareçe...
    O aplicativo não pode ser iniciado corretamente (0xc000007b).
    Clique em OK para fechar o aplicativo.

    Você teria alguma dica?

    Fico no Aguardo...

    ResponderExcluir
  10. Essa dica foi excelente! Ajudou perfeitamente no meu caso!

    ResponderExcluir
  11. Valeu! Testada e aprovada no meu notebook. Dica ótima e q pode ser aproveitada por todos. :-)

    ResponderExcluir
  12. Agradecendo a grande ajuda do nosso amigo! valew pela dica, estava a 1 dia perdido com esse problema, até que li seu post e tudo se resolveu!

    Obrigado!

    ResponderExcluir
  13. Vitor,
    Tive o mesmo problema ao utilizar o DBACCESS da Totvs. Apenas segui a sua dica (instalei o DbAccess em um diretório sem parenteses) e funcionou!
    Valew

    Serjin

    ResponderExcluir
  14. Segui a dica do AdilsonD e deu certo. Grato.

    ResponderExcluir
  15. Pra mim não funcionou... Criei a variável de ambiente no Windows 10 e ainda continuo não conseguindo conectar de dentro da pasta (x86)

    ResponderExcluir
  16. Meu irmão Obrigado pela eu ja estava ficando doido com esse negocio. Valeu.

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Uso de memória no SQL Server

Busca de CEP com o Lazarus - Parte 1 - UrlEncode

Botão Add This para adicionar seu post em qualquer rede