XOOPS Brasil

 

Suporte ao ODBC do MySQL





O MySQL fornece suporte para ODBC através do programa MyODBC. Este capítulo lhe ensinará como instalar o MyODBC, e como usá-lo. Aqui, você também encontrará uma lista de programas comuns que são conhecidos por funcionar com MyODBC.

12.2.1. Como Instalar o MyODBC

MyODBC 2.50 é um driver de nível 0 (com recursos de nível 1 e 2) e especificação de ODBC 2.50 de 32 bits para conectar um programa ODBC ao MySQL. MyODBC funciona nos Windows 9x/Me/NT/2000/XP e na maioria da plataformas Unix. MyODBC 3.51 é uma versão melhorada com nível 1 (core API completo + recursos de nível 2) e especificação de ODBC 3.5x.

MyODBC é Open Source, e você pode encontrar a versão mais nova em https://xoops.net.br/docs/mysql/manual/mysql-connector-download-odbc.url.php. Note que a versão 2.50.x utiliza a licença LGPL, enquanto a versão 3.51.x utiliza a licença GPL.

Se vcê tiver problemas com o MyODBC e seu programa também funciona com OLEDB, você deve experimentar o driver OLEDB.

Normalmente você só precisa instalar o MyODBC em másquinas Windows. Você só precisará de MyODBC para Unix se tiver um programa como ColdFusion que roda em máquinas Unix e utilizam ODBC para conectar ao banco de dados.

Se você quiser instalar MyODBC em um Unix, você precisará de um gerenciador ODBC. MyODBC funciona com a maioria dos gerenciadores ODBC para Unix.

Para instalar MyODBC no Windows, você deve baixar o arquivo MyODBC .zip apropriado, descompactá-lo com WinZip ou algum programa parecido e executar o arquivo SETUP.EXE.

No Windows/NT/XP você pode obter o seguinte erro ao tentar instalar o MyODBC:

An error occurred while copying C:\WINDOWS\SYSTEM\MFC30.DLL. Restart
Windows and try installing again (before running any applications which
use ODBC)

O problema neste caso é que algum outro progrma está utilizando ODBC e pela forma que como o Windows é feito, você pode, neste caso, não estar apto a instalar um novo driver ODBC com programa de instação do ODBC da Microsoft. Neste caso você pode continuar selecionando Ignore para copiar o resto dos aerquivos ODBC e a instalação final deve funcionar. Se não funcionar, a solução é reinicializar seu computador em ``modo seguro'' (Escolhendo-o ao pressionar F8 assim que seu computador iniciar o Windows durante a reinicialização), instalar MyODBC, e reiniciar em modo normal.

  • Para conectar a uma máquina Unix de uma máquina Windows, com uma aplicação ODBC (uma que não tenha suporte nativo as MySQL), você deve primeiro instalar MyODBC em uma máquina Windows.

  • O utilizador é máquina Windows devem ter privilégios para acessar o servidor MySQL na máquina Unix. Isto pode ser feito om o comando GRANT. Veja mais informações sobre isto na Seção 4.4.1, “A Sintaxe de GRANT e REVOKE.

  • Você deve criar uma entrada ODBC DSN como a seguir:

  • Agora inicie a sua aplicação e selcione o driver ODBC com o DSN que você especificou no adminitrador ODBC.

Verifique se há outra opção de configuração na tela do MySQL (trace, não pergunta ao conectar, etc) que você possa tentar se ocorrerem problemas.

12.2.2. Como Preencher os Vários Campos no Programa de Administração do ODBC

Existem três maneiras possíveis de especificar o nome de servidor no Windows95:

  • Use o endereço IP no servidor.

  • Adicione um arquivo \Windows\lmhosts com a seguinte informação:

    ip nome_maquina
    

    Por exemplo:

    194.216.84.21 meu_nome_maquina
    
  • Configure o PC para utilizar DNS.

Exemplo de como preencher a configuração do ODBC.

Windows DSN name: test
Description: This is my test database
MySQL Database: test
Server: 194.216.84.21
User: monty
Password: my_password
Port:

O valor para o campo Windows DSN name é qualquer nome que seja único em sua configuração ODBC Windows.

Você não precisa especificar valores para os campos Server, User, Password, ou Port ina tela de configuração do ODBC. No entanto, se você o fizer, os valores serão utilizados como padrão posteriormente ao se tentar fazer uma nova conexão. Você tem a opção de alterar os valores neste momento.

Se o número da porta não é dado, a porta padrão (3306) é utilizada.

Se você especificar a opção Read options from C:\my.cnf, os grupos client e odbc serão lidos do arquivo C:\my.cnf. Você pode utilizar todas as opções que são úteis a mysql_options(). Veja mais informações sobre isto na Seção 12.1.3.40, “mysql_options().

12.2.3. Parâmetros de Conexão do MyODBC

Pode-se especificar os seguintes parâmetros para MyODBC na seção [Servername] de um arquivo ODBC.INI ou através do argumento InConnectionString na chamada SQLDriverConnect().

ParâmetroValor padrãoComentário
userODBC (on Windows)O nome do utilizador usado para se conectar ao MySQL.
serverlocalhostO nme de máquina do servidor MySQL.
database O banco de dados padrão.
option0Um inteiro com o qual você pode especificar como o MyODBC deve tarbalhar. Veja abaixo.
port3306A porta TCP/IP usada se o servidor (server) não for localhost.
stmt Uma instrução que será executada ao conectar ao MySQL.
password A senha para a combinação servidor(server)-utilizador(user).
socket O socket ou pipe Windows para se conectar.

O argumento option é usado para dizer ao MyODBC que o cliente não é 100% compatível com ODBC. No Windows, o parâmetro option normalmente é definido mudando as diferentes opções na tela de conexão mas também podem ser definidas no argumento option. As seguintes opções estão listadas na mesma ordem em que aparecem na tela de conexão do MyODBC:

BitDescrição
1O cliente não pode aceitar que MyODBC retorne a largura real de uma coluna.
2O clinete nã pode aceitr que MySQL retorne o valor real de colunas afetadas. Se este parâmetro for definido o MySQL retornará 'registros encontrados'. É necessáriop o MySQL 3.21.14 ou posterior para funcionar.
4Faz um log de depuração em c:\myodbc.log. É o mesmo que colocar MYSQL_DEBUG=d:t:O,c::\myodbc.log no AUTOEXEC.BAT
8Não define nenhum limite de pacote para resultados e parâmetros.
16Não faz perguntas mesmo se o driver quisesse.
32Simula um driver ODBC 1.0 em alguns contextos.
64Ignora o uso do nome de banco de dados 'bancodedados.tabela.coluna'
128Força o usa de cursores de gerenciadores ODBC (experimental).
256Disabilita o uso de busca estendida (experimental).
512Completa campos CHAR para tamanho de coluna cheias.
1024SQLDescribeCol() retrnará nome de colunas totalmente qualificados.
2048Usa o protocolo cliente/servidor comprimido.
4096Diz ao seridor para ignorar espaços após nome de funções e antes de '(' (necessário para PowerBuilder). Torna todos os nomes de funções palavras-chaves!
8192Conecta com named pipes ao servidor mysqld executando no NT.
16384Altera colunas LONGLONG para colunas INT (algumas aplicações não podem tratar LONGLONG).
32768Retorna 'user' como Table_qualifier e Table_owner para SQLTables (experimental)
65536Lê paraâmetros dos grupos client e odbc no my.cnf
131072Adiciona algumas verificações extras de segurança (não deve ser necessário, mas...)

Se você quiser ter muitas opções, você deve somar os parâmetros acima! Por exemplo, definir a opção como 12 (4+8) lhe permite debugar sem limite de pacotes.

O MYODBC.DLL padrão é compilado para um rendimento otimizado. Se você quiser depurar o MyODBC (por exemplo, habiliatr o trace), você deve utilizar MYODBCD.DLL. Para instalar este arquivo copie MYODBCD.DLL sobre o arquivo MYODBC.DLL instalado.

12.2.4. Como Relatar Problemas com o MyODBC

MyODBC tem sido testado com Access, Admndemo.exe, C++-Builder, Borland Builder 4, Equipe de Desenvovimento Centura (formalmente Gupta SQL/Windows), ColdFusion (em Solaris e NT com svc pack 5), Crystal Reports, DataJunction, Delphi, ERwin, Excel, iHTML, FileMaker Pro, FoxPro, Notes 4.5/4.6, SBSS, Perl DBD-ODBC, Paradox, Powerbuilder, Powerdesigner 32 bit, VC++, e Visual Basic.

Se você souber de qualquer outra aplicação que funcione com MyODBC, envie-nos email para lista de email odbc do MySQL sobre isto! Veja mais informações sobre isto na Seção 1.7.1.1, “As Listas de Discussão do MySQL”.

Com alguns programas você pode obter um erro como este: Another user has modifies the record that you have modified. Na maioria dos casos ele pode ser resolvido fazendo o especificado abaixo:

  • Adicione um chave primária para a tabela se já não houver uma.

  • Adicione uma coluan timestamp se já não existir uma.

  • Só utilize campos double float. Alguns programa podem falhar quando comparam floats simples.

Se o exposto acima não ajudar, você deve fazer um arquivo de rastreamento do MyODBC e tentar encontrar o que está dando errado.

12.2.5. Programas que Funcionam com MyODBC

A maioria dos programas devem funcionar com MyODBC, mas para cada um dos listados aqui, nós mesmos testamos e recebemos confirmação de alguns utilizadores que eles funcionam:

  • Programa

    Comentário

  • Access

    Para fazer o Access funcionar:

    • Se você estiver usando Access 2000, você deve obter e instalar o Microsoft MDAC (Microsoft Data Access Components) mais recente (versão 2.6 ou acima) em http://www.microsoft.com/data/. Ele irá consertar o o seguinte bug no Access: quando você exporta dados para o MySQL, os nomes de tabelas e colunas não são especificados. Outro modo de contornar este bug é atualizar para MyODBC Versão 2.50.33 e MySQL Versão 3.23.x, que juntos fornecem um modo de contornar este erro!

      Você também deve obter e instalar Microsoft Jet 4.0 Service Pack 5 (SP5) que pode ser encontrado em http://support.microsoft.com/support/kb/articles/Q 239/1/14.ASP. Isto irá corrigir alguns casos onde colunas são marcadas como #deletadas# no Access.

      Note que se você estiver usando o MySQL Versão 3.22, você deve aplicar o patch MDAC e utilizar MyODBC 2.50.32 ou 2.50.34 e acima para contornar este problema.

    • Para todas as versões do Access, você deve habilitar a opção do MyODBC Return matching rows. Para Access 2.0, você também deve habilitar Simulate ODBC 1.0.

    • Você deve ter um timestamp em todas as tabelas que você deseja atualizar. Para maior portabilidade TIMESTAMP(14) ou apenas TIMESTAMP é recomendado no lugar de outras variações de TIMESTAMP(X).

    • Você deve ter uma chave primáia na tabela. Se não, registros novos ou atualizados podem aparecer como #DELETED#.

    • Só use campos DOUBLE float. O Access falaha ao comparar com campos single floats. Os sintomas normais são que registros novos ou atualizados podem aparecer como #DELETED# ou que você não possa encontarar ou atualizar registros.

    • Se você estiver ligando uma tabela com MyODBC, que tem BIGINT como uma de suas colunas, o resultado será mostrado como #DELETED. A solução para contornar este problema é:

      • Tenha um ou mais colunas modelos com TIMESTAMP como o tipo de dados, de preferência TIMESTAMP(14).

      • Verifique 'Change BIGINT columns to INT' na ciaxa diálogo de opções de conexão no Admiistrador DSN ODBC

      • Delete o link a tabela e o recrie.

      Ele ainda mostra o registro anterior como #DELETADO#, mas novos registros adicionados/atualizados serão mostrados apropriadamente.

    • Se você ainda obter o erro Another user has changed your data depois de adicionar uma coluna TIMESTAMP, o seguinte truque pode lhe ajudar:

      Nào utilize visualizar planilha de dados da tabela. Crie um formulario com os campos que você quer, e use visulizar planilha de dados de formulário. Você deve definir a propriedade DefaultValue para a coluna TIMESTAMP com NOW(). Esta pode ser uma boa idéia para oculta a coluna TIMESTAMP da visualização para que seus utilizadores não fiquem confusos.

    • Em alguns casos, o Access pode gerar consultas SQL inválidas que o MySQL não entende. Você pode arrumar isto selecionando "Query|SQLSpecific|Pass-Through" no menu do Access.

    • No NT o Access irá mostrar colunas BLOB como OLE OBJECTS. Se você quiser colunas MEMO, você deve alterar a coluna para TEXT com ALTER TABLE.

    • O Access não pode sempre tratar colunas DATE apropriadamente. Se você tiver um problema com isto, mude as colunas para DATETIME.

    • Se você tiver no Acces um coluna definida como BYTE, o Access tentará exportá-la como TINYINT em vez de TINYINT UNSIGNED. Isto lhe tará problemas se você tiver valores > 127 na coluna!

  • ADO

    Quando você está codificando com a API ADO e MyODBC você precisa ter atenção com algumas propriedades padrões que não são suportadas pelo servidor MySQL. Por exemplo, usando CursorLocation Property como adUseServer retornará de RecordCount Property um resultado de -1. Para ter o valor correto, você precisa definir esta propriedade a adUseClient, como mostrado no código VB abaixo:

    Dim myconn As New ADODB.Connection
    Dim myrs As New Recordset
    Dim mySQL As String
    Dim myrows As Long
    myconn.Open "DSN=MyODBCsample"
    mySQL = "SELECT * from user"
    myrs.Source = mySQL
    Set myrs.ActiveConnection = myconn
    myrs.CursorLocation = adUseClient
    myrs.Open
    myrows = myrs.RecordCount
    myrs.Close
    myconn.Close
    

    Outro modo de contornar o problea é utilizar uma instrução SELECT COUNT(*) para uma consulta parecida para obter a contagem de registros correta.

  • Active server pages (ASP)

    Você deve usar a opção Return matching rows.

  • Aplicações BDE

    Para faze-las funcionar, você deve definir os seguintes parâmetros: Don't optimize column widths e Return matching rows.

  • Borland Builder 4

    Qaundo você inicia uma consulta, você pode utilizar a propriedade Active ou utilizar o método Open. Note que Active irá iniciar automaticamente executando uma consulta SELECT * FROM ... que pode não ser algo bom se suas tabelas forem grandes.

  • ColdFusion (No Unix)

    A seguinte informações é tirada da documentação do ColdFusion:

    Utilize a seguinte informação para configurar o ColdFusion Server para Linux para utilizar o driver unixODBC driver com MyODBC para fonte de dados MySQL. Allaire verificou que o MyODBC Versão 2.50.26 funciona com MySQL Versão 3.22.27 e ColdFusion para Linux. (Quqlquer versão mais nova também deve funcionar.) Você pode fazer o download do MyODBC em https://xoops.net.br/docs/mysql/manual/mysql-connector-download-odbc.url.php

    ColdFusion Versão 4.5.1 lhe permite utilizar o Administrador ColdFusion para adicionar a fonte de dados MySQL. No entanto o driver não está incluído com o ColdFusion Versão 4.5.1. Antes que o driver MySQL aparecer na lista drop-down de fonte de dados ODBC, você deve construir e copiar o driver MyODBC para /opt/coldfusion/lib/libmyodbc.so.

    O diretório Contrib contém o programa mydsn-xxx.zip que lhe permite construir e remover o arquivo de registro DSN para o driver MyODBC em aplicações Coldfusion.

  • DataJunction

    Você tem que alterá-lo para uma saída VARCHAR em vez de ENUM, ja que ele exporta o último de uma maneira que cause um grief no MySQL.

  • Excel

    Funciona. Algumas dicas:

    • Se você tiver problema com datas, tente selecioná-las como strings utilizando a função CONCAT(). Por exemplo:

      select CONCAT(rise_time), CONCAT(set_time)
      from sunrise_sunset;
      

      Valores retornados deste modo como strings devem ser reconhecidos corretamente como valores time pelo Excel97.

      O propósito de CONCAT() neste exemplo é enganar o ODBC fazendo-o pensar que a coluna é do ``tipo string''. Sem o CONCAT(), ODBC sabe que a coluna é do tipo time e o Excel não entende isto.

      Note que este é um bug do Excel, pois ele converte automaticamente uma string para um time. Isto seria ótimo se a fonte fosse um arquivo texto, mas se torna um erro quando a fonte e uma conexão ODBC que relata tipos exatos para cada coluna.

  • Word

    Para recuperar os dados do MySQL para documentos Word/Excel, você precisa utilizar o driver MyODBC e a ajuda do Add-in Microsoft Query.

    Por exemplo, crie um bd com uma tabela contendo 2 colunas de texto:

    • Insira registros utilizando a ferramente cliente de linha de comando mysql.

    • Crie um arquivo DSN usando o gerenciador ODBC, my, por exemplo, para o bd acima.

    • Abra o aplicativo Word.

    • Crie um novo documento vazio.

    • Utilizando a barra de ferramentas chamada Banco de Dados, pressione o botão insira banco de dados.

    • Pressione o botão Obter Dados.

    • No moemnto certo, pressione o botão Ms Query na tela Obter Dados.

    • No Ms Query crie uma Nova Fonte de Dados utilizando o arquivo DSN my.

    • Selecione a nova consulta.

    • Selecione as colunas que você deseja.

    • Crie um filtro de desejar.

    • Faça um Ordenação se quiser.

    • Selecione Enviar Dados para o Microsoft Word.

    • Clique em Finalizar.

    • Clique em Inserir dados e selecione os registros.

    • Clique OK e você verá os registros no seu documento Word.

  • odbcadmin

    Pograma teste para ODBC.

  • Delphi

    Você deve utilizar o BDE Versão 3.2 ou mais atual. Veja a opção i Don't optimize column width ao conectar no MySQL.

    Aqui está um código de Delphi potencialmente útil que configura uma entrada ODBC e uma entrada BDE para para MyODBC (a entrada BDE exige de um Editor de Alias BDE que é gratuito em um site Delphi Super Page. (Obrigado a Bryan Brunton por isto):

    fReg:= TRegistry.Create;
    fReg.OpenKey('\Software\ODBC\ODBC.INI\DocumentsFab', True);
    fReg.WriteString('Database', 'Documents');
    fReg.WriteString('Description', ' ');
    fReg.WriteString('Driver', 'C:\WINNT\System32\myodbc.dll');
    fReg.WriteString('Flag', '1');
    fReg.WriteString('Password', '');
    fReg.WriteString('Port', ' ');
    fReg.WriteString('Server', 'xmark');
    fReg.WriteString('User', 'winuser');
    fReg.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources', True);
    fReg.WriteString('DocumentsFab', 'MySQL');
    fReg.CloseKey;
    fReg.Free;
    Memo1.Lines.Add('DATABASE NAME=');
    Memo1.Lines.Add('USER NAME=');
    Memo1.Lines.Add('ODBC DSN=DocumentsFab');
    Memo1.Lines.Add('OPEN MODE=READ/WRITE');
    Memo1.Lines.Add('BATCH COUNT=200');
    Memo1.Lines.Add('LANGDRIVER=');
    Memo1.Lines.Add('MAX ROWS=-1');
    Memo1.Lines.Add('SCHEMA CACHE DIR=');
    Memo1.Lines.Add('SCHEMA CACHE SIZE=8');
    Memo1.Lines.Add('SCHEMA CACHE TIME=-1');
    Memo1.Lines.Add('SQLPASSTHRU MODE=SHARED AUTOCOMMIT');
    Memo1.Lines.Add('SQLQRYMODE=');
    Memo1.Lines.Add('ENABLE SCHEMA CACHE=FALSE');
    Memo1.Lines.Add('ENABLE BCD=FALSE');
    Memo1.Lines.Add('ROWSET SIZE=20');
    Memo1.Lines.Add('BLOBS TO CACHE=64');
    Memo1.Lines.Add('BLOB SIZE=32');
    AliasEditor.Add('DocumentsFab','MySQL',Memo1.Lines);
    

  • C++ Builder

    Testado com BDE versão 3.0. O único problema conhecido é que quando o esquema de tabelas é alterado, os campos da consulta não são atualizados. O BDE, no entanto, parece não reconhecer chaves primárias, apenas o índice PRIMARY, mas isto será um problema.

  • Vision

    Você deve utilizar a opcão Return matching rows.

  • Visual Basic

    Para estar apto para habilitar uma tabela, você deve definir uma chave primária para a tabela.

    Visual Basic com ADO não pode manipular inteiros grandes. Isto significa que algumas consultas como SHOW PROCESSLIST não irão funcionar apropriadamente. A correção é deifinir a opção OPTION=16384 na string de conexão ODBC ou configurar a opção Change BIGINT columns to INT na tela de conexão do MyODBC. Você pode desejar definir a opção Return matching rows.

  • VisualInterDev

    Se você obtem o erro [Microsoft][ODBC Driver Manager] Driver does not support this parameter a razão pode ser que você tem um BIGINT em seu resultado. Tente definir a opção Change BIGINT columns to INT na tela de conexão do MyODBC.

  • Visual Objects

    Você deve utilizar a opção Don't optimize column widths.

12.2.6. Como Obter o Valor de uma Coluna AUTO_INCREMENT no ODBC

Um problema comum é como obter o valor de um ID gerado automaticamente em um INSERT. Com ODBC, você pode fazer algo assim (considerando que auto é um campo AUTO_INCREMENT):

INSERT INTO foo (auto,text) VALUES(NULL,'text');
SELECT LAST_INSERT_ID();

Ou, se você estiver prestes a insrir o ID em outra tabela, você pode fazer assim:

INSERT INTO foo (auto,text) VALUES(NULL,'text');
INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text');

Veja mais informações sobre isto na Seção 12.1.12.3, “Como Posso Obter a ID Única para a Última Linha Inserida?”.

Para o benefício de alguns aplicativos ODBC (pelo menos Delphi e Access), a seguinte consulta pode ser utilizada para encontrar um registro récem inserido:

SELECT * FROM nome_tabela WHERE auto IS NULL;

12.2.7. Relatando Problemas com MyODBC

Se você encontrar dificuldades com MyODBC, você deve iniciar fazendo um arquivo log pelo gerenciador ODBC (o log obtido ao requisitar logs do ODBCADMIN) e um log MyODBC.

Para obter um log MyODBC, você precisa fazer o seguinte:

  1. Esteja certo de que você está utilizando myodbcd.dll e não myodbc.dll. O modo mais fácil de se fazer isto é obter myodbcd.dll da distribuição MyODBC e copiá-la sobre o myodbc.dll, o qual estará, provavelmente, em seu diretório C:\Windows\system32 ou C:\winnt\system32.

    Note que você provavelmente deseja restaurar o myodbc.dll antigo ao finalizar o teste, já que ele é bem mais rpido que myodbcd.dll.

  2. Marque a opção `Trace MyODBC' na tela de conexão/configuração do MyODBC. O logo será escrito no arquivo C:\myodbc.log.

    Se a opção de ratreamento não for lembrada quando você retornar a tela acima, significa que você não está utilizando o driver myodbcd.dll (veja o item acima).

  3. Inicie sua aplicação e tente fazê-la falhar.

Verifique o arquivo de rastreamento do MyODBC, para saber o que pode estar errado. Viocê deve estar apto a encontrar as consultas executadas buscando após a string >mysql_real_query no arquivo myodbc.log.

Você também devev tentar duplicar as consultas no monitor mysql ou admndemo para descobrir se o erro é do MyODBC ou do MySQL.

Se você encontar algo errado, envie-nos somente os registros relevantes (max 40 registros) para a lista de email odbc do MySQL. Veja mais informações sobre isto na Seção 1.7.1.1, “As Listas de Discussão do MySQL”. Por favor, nunca envie todo o arquivo log do MyODBC ou ODBC!

Se você não puder encontrar o que está errado, a última opção é fazer um arquivo (tar ou zip) que contenha um arquivo de rastreamento do MyODBC, o arquivo log do ODBC, e um arquivo README que explique o problema. Você pode enviá-lo para ftp://support.mysql.com/pub/mysql/secret/. Somente nós da MySQL AB teremos acesso ao arquivo que você enviar, a seremos bem discretos com os dados!

Se você pode criar um programa que também mostre este problema, nos envie ele também.

Se o programa funciona com algum outro servidor MySQL, você deve fazer um arquivo de log do MyODBC onde você faz exatamente a mesma coisa no ouuto servidor SQL.

Lembre-se que quanto mais informações você nos fornecer, mais satisfatória será a solução encontrada para o problema!