sexta-feira, 17 de dezembro de 2010

Tutorial: MySQL no Autoit utilizando conector ODBC e UDF MySQL

Entre as UDF´s disponíveis para o Autoit, apenas uma nos permite conectar a um banco de dados, que é o SQLite. Felizmente ele disponibiliza meios de trabalharmos com COM Objects, o que torna possível o desenvolvimento de UDF´s para atender soluções específicas.

No Fórum oficial do Autoit temos um caso destes, no post MySQL UDFs o usuário cdkid disponibiliza uma UDF para trabalharmos com bancos de dados MySQL, apesar de ser antiga (última atualização em 2007) e um pouco limitada, ela funciona e entrega um resultado satisfatório.

No tópico é explicado como fazer a conexão e começar a trabalhar, porém, como é um pouco antigo, algumas coisas podem não funcionar (como aconteceu comigo) e pode ser preciso conferir alguns detalhes a mais, não explanados no fórum, por isso vamos a partir de agora, conferir como fazer para conectar o Autoit com o MySQL em detalhes.

Arquivos para conectar o Autoit e o MySQL

Antes de mais nada precisamos baixar a biblioteca (que você encontra no link logo abaixo) e também o driver ODBC, que fará o papel de intermediar a conexão entre as duas tecnologias:

Download 1: mysql.au3
Download 2: Driver ODBC

No link para baixar o driver ODBC, você deve escolher um dos arquivos em formato zip, apenas atente para optar pelo arquivo correto de acordo com a plataforma de seu computador ou servidor (32-bit ou 64-bit), para este exemplo nós baixamos o arquivo Windows (x86, 64-bit), ZIP Archive Connector-ODBC.

Instalando o Driver ODBC

Descompacte o arquivo na máquina em que você irá rodar sua aplicação, abra um prompt do DOS e digite o caminho completo até a pasta onde encontram-se os arquivos descompactados, seguido de /install.bat 0, conforme mostrado na figura abaixo:

Console ODBC Instalação

Após instalado o driver, clique em:

  1. Iniciar "Start"
  2. Ferramentas Administrativas "Administrative Tools"
  3. Fontes de dados(ODBC) "Data Sources(ODBC)"
  4. Clique em Adicionar "Add"
  5. Escolha MySQL ODBC Driver 3.51 e então clique em Finalizar "Finish"

Uma nova janela irá solicitar algumas informações sobre a nova conexão ODBC, preencha com os dados (alguns são opcionais) do banco que você deseja se conectar e por fim clique no botão Test. Se ele retornar uma mensagem positiva sua conexão já esta funcionando, caso contrário precisaremos trabalhar um pouco mais.

ODBC MySQL x Autoit configuração

Janela de configuração do ODBC

O teste deu ok! | O teste falhou, e agora?

Configurando o servidor MySQL para aceitar conexões externas

Se sua conexão ODBC não deu certo, pode ser que você precisa garantir o acesso da sua máquina de aplicação para o servidor do banco. Para fazer isso você vai ter que executar uma query no seu servidor MySQL atribuindo este acesso. Abaixo um exemplo:

GRANT ALL PRIVILEGIES ON database.table TO 'usuario'@'host' IDENTIFIED BY 'password'

Na query mostrada acima, nós temos algumas palavras destacadas em itálico, são elas que você deverá alterar, veja um exemplo de como deverá ficar no final:

GRANT ALL PRIVILEGIES ON *.* TO 'root'@'172.167.100.90' IDENTIFIED BY 'root@123'

Neste exemplo, foi definido acesso total para todos os bancos e todas as tabelas de nosso servidor MySQL, para o usuário root vindo do servidor 172.167.100.90 utilizando a senha root@123.

Você pode aplicar esta query via o prompt do mysql, no seu servidor de banco de dados ou por meio de um aplicativo terceiro, como o MySQL Administration ou PHPMyAdmin, caso tenha instalado. Fazendo isso, volte para a máquina onde você instalou o ODBC e teste novamente a conexão. Caso as falhas ainda persistam, tente recomeçar o tutorial desde o início novamente.

Criando uma aplicação Autoit/MySQL

Agora que você já garantiu a conexão basta você começar a desenvolver seu aplicativo, basta incluir a UDF do MySQL no início da seu script. Como um primeiro teste você pode apenas ler alguns registros de uma tabela qualquer e mostrar em tela, para fazer isso siga o exemplo abaixo, apenas adaptando para um banco e tabela existente no seu servidor de banco de dados:

;Conectar em uma base
$o_sql = _MySQLConnect('root', 'root@123', 'ambiente', '172.167.100.90')

;Realiza uma query
$o_query = _Query('SELECT hostname FROM servidores')

With $o_query

While NOT .EOF

;Mostra os resultados em tela
MsgBox(0, 'Hostnames', .Fields('hostname').value)

WEnd

EndWith

;Tenta encerrar a conexão com o banco
_MySQLEnd($o_sql)

Uma pequena contribuição

Durante o desenvolvimento de aplicações MySQL/Autoit eu tive uma grande necessidade que era conseguir descobrir se uma determinada query SELECT iria retornar algum resultado, pois se você tentar acessar os valores de um atributo retornado de uma query e esta não te retorne nada, você terá um erro de execução. Portanto criei essa pequena função que faz o trabalho de contar quantas linhas uma query retornará, tornando seu aplicativo menos suscetível a falhas.

;Conta quantas linhas uma query SELECT irá retornar
Func _CountRows($o_sql, $s_query)

;Customiza a query para retornar um COUNT, ao invés dos campos
$s_res = StringRegExpReplace ($s_query, '(SELECT [\w]{1,255})((, | )[\w]{1,255}(,|)){0,10} FROM', 'SELECT COUNT(*) as ct FROM')

;Se conseguir criar a nova query, testa o resultado
If $s_res <> $s_query Then

$o_query = _Query($o_sql, $s_res)

Return $o_query.Fields('ct').value

Else

Return 0

EndIf

EndFunc

Finalizando

Espero que tenham apreciado o post, dúvidas deixem um comentário que retornarei assim que possível. Para finalziar vou deixar um apelo: Se alguém tiver acesso aos atributos e métodos do MySQL COM Object, por favor compartilhe, seria muito interessante implementar mais algumas funções a esta biblioteca.

Antes de finalizar, não posso deixar de agradecer ao meu amigo Padilha, por insistir em descobrir como conectar o Autoit com MySQL, sem sua ajuda minha vida seria bem mais penosa. Obrigado!

Abraço!

3 comentários:

  1. Poxa man muito obrigado, eu adorei seu post, uma recomendação, no "_MySQLConnect" informe aos leitores de que se trata os valores "root","root@123" pra ficar mais claro o post, claro que se o cara abrir a include verá mais é bom colocar né rsr e em "_Query" faltou inserir o parametro "$o_sql" no demais tah tudo certo. Oemu aqui an hora de exibir o dado do banco ele ficou num loop infinito pegando apenas o 1o dado não quis pular de linha. No demais muito obrigado, apesar de estudar atualmente JSP adoro autoit já fiz um app pra cadastro de produtos nele só que os dados são salvos num txt rsrs Arcaico né? rsr

    ResponderExcluir
  2. em relação ao loop infinito achei o que tava faltando pra pular as linhas. É só adcionar um ".MoveNext", neste caso, depois da msgBox. :D

    ResponderExcluir