@chapter MySQL ODBC Suporte

@menu
* Quais ODBC OS::               Sistemas Operacionais são suportados por @strong{MyODBC}
* Problemas ODBC::              Como informar problemas com @strong{MySQL} ODBC
* Clientes MyODBC::             Programas que já foram testados com @strong{MyODBC}
* Administrador ODBC::          Como preencher os diversos campos com o programa Administrador
* ODBC e last_insert_id::       Como obter o valor de uma coluna @code{AUTO_INCREMENT} em ODBC
* Informando bug do MyODBC::    Informando problemas com MyODBC
@end menu

@strong{MySQL} fornece suporte para ODBC através do programa @strong{MyODBC}.


@node Quais ODBC OS, ODBC Problemas, ODBC, ODBC
@section Sistemas Operacionais suportados por MyODBC

@strong{MyODBC} é um driver 32-bit ODBC (2.50) nível 0 para Windows95
e Windows NT. Nós esperamos que alguém porte o mesmo para o Windows 3.x.

@node Problemas ODBC, clientes MyODBC, Quais ODBC OS, ODBC
@section Como informar problemas com MyODBC

@strong{MyODBC} tem sido testado com Access, Admndemo.exe, C++-Builder,
Centura Team Developer (formalmente Gupta SQL/Windows), ColdFusion (no
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 algum outro aplicativo que funcione com @strong{MyODBC}, por favor
nos escreva sobre isso através do email @email{myodbc@@lists.mysql.com}.

@node Clientes MyODBC, Administrador ODBC, Problemas com ODBC, ODBC
@section Programas testados que funcionam com MyODBC

A maioria dos programas que têm suporte para ODBC, funcionam com o @strong{MyODBC},
mas cada um dos listados abaixo, têm sido testados por nós ou por informações de
usuários que confirmaram o seu funcionamento.

@table @asis
@item @strong{Program}
@strong{Comment}
@item Access
Como fazer Accces funcionar:
@itemize @bullet
@item
Você deverá ter uma chave primária na tabela.
@item
Você deve ter um campo timestamp em todas as tabelas em que você quer controlar a
atualização.

@item
Somente use campos doubles float. Access falha quando faz comparações com campos float
simples.
@item
Configure a opção `Return matching rows' quando conectar com o @strong{MySQL}.
@item
O Access no NT acusará colunas @code{BLOB} como @code{OLE OBJECTS}.
Se ao invés disso você quer colunas @code{MEMO}, deve trocar a coluna para
@code{TEXT} usando @code{ALTER TABLE}.
@item
Access às vezes não lida adequadamente com colunas do tipo @code{DATE}.
Se você tiver problemas com essas colunas, mude as colunas para @code{DATETIME}.
@item
Em certas situações, o Access cria consultas SQL ilegais que o
@strong{MySQL} não pode processar. Você pode resolver isso selecionando o tipo de
consulta @code{"Query|SQLSpecific|Pass-Through"} no menu do Access.
@end itemize
@item DataJunction
Você tem que trocar para mandar @code{VARCHAR} ao invés de @code{ENUM}, porque
o mesmo exporta o último de uma maneira que causa fadiga ao @strong{MySQL}.
@item Excel
Funciona. Algumas dicas:
@itemize @bullet
@item
Se você tem problemas com datas, tente selecioná-las como strings usando a
função @code{CONCAT()}. Por exemplo:
@example
select CONCAT(rise_time), CONCAT(set_time)
    from sunrise_sunset;
@end example
Os dados de datas enviadas como string são corretamente reconhecidas pelo
Excel97 como dados do tipo time.

Neste exemplo o propósito de @code{CONCAT()} é enganar o ODBC, fazendo-o pensar
que a coluna é do 'tipo string'. Sem o @code{CONCAT()}, ODBC sabe que a coluna
é do tipo time e o Excel não entenderá isso.

Note que isso é um bug no Excel, porque o mesmo converte automaticamente a
string para time. Isto é muito bom quando o fonte é um arquivo
texto, mas não se pode dizer o mesmo quando o fonte é uma conexão
ODBC que informa o tipo exato para cada coluna.
@end itemize
@item odbcadmin
Programa Teste para ODBC.
@item Delphi
Você deverá usar DBE 3.2 ou mais atualizado. Configure o campo de opção
`Don't optimize column width' quando conectando com @strong{MySQL}.

Também, há aqui um código muito útil que configura tanto a
inserção ODBC e a inserção BDE para MyODBC (a inserção BDE requer um BDE
Alias Editor que pode ser obtido de graça numa Delphi Super Page
perto de você.):  (Obrigado a Bryan Brunton @email{bryan@@flesherfab.com} por isto)

@example
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);
@end example

@item C++Builder
Testado com BDE 3.0. O único problema conhecido é que quando o esquema da tabela
muda, os campos da consulta não são atualizados. BDE entretanto, parece não
reconhecer chaves primárias, somente Índice PRIMARY, não entanto isto não
tem sido um problema.

@item Visual basic
Para atualizar uma tabela, você deverá definir uma chave primária para a tabela.
@end table

@node Administrador ODBC, ODBC e last_insert_id, Clientes MyODBC, ODBC
@section Como preencher os diversos campos com o programa Administrador

Existem três possibilidades para especificar o nome do servidor em
Windows95:

@itemize @bullet
@item
Usando o endereço IP do servidor.
@item
Adicionar um arquivo @file{lmhosts} com a seguinte informação:

@example
ip nomeservidor
@end example

Por exemplo:

@example
194.216.84.21 my
@end example

@item
Configurar o PC para usar DNS.
@end itemize

Exemplo de como preencher o ``ODBC setup'':
@example
Windows DSN name:   teste
Description:        Este é o meu banco de dados teste
MySql Database:     teste
Server:             194.216.84.21
User:               monty
Password:           minha_senha
Port:
@end example

O valor para o campo @code{Windows DSN name} é qualquer nome que seja único
em seu Windows ODBC setup.

Você não precisa especificar os valores para os seguintes campos: @code{Server},
@code{User}, @code{Password} ou @code{Port} na hora de configurar o ODBC.
Entretanto, se você o faz, esses valores devem ser usados como padrão para fazer
uma conexão.  Você tem a opção de trocar os valores nesse instante.

Se o número da porta não for especificado, o valor padrão da porta (@value{default_port})
é usado.

Se você especificar a opção @code{Read options from C:\my.cnf}, os
grupos @code{client} e @code{odbc} devem ser lidos do arquivo @file{C:\my.cnf}.
Você pode usar todas as opções que são usadas por @code{mysql_options()}.
@xref{mysql_options, , @code{mysql_options}}.

@node ODBC e last_insert_id, Informando bug do MyODBC, Administrador ODBC, ODBC
@section Como obter o valor de uma coluna @code{AUTO_INCREMENT} no ODBC

Um problema muito usual consiste em como saber o valor de uma coluna do tipo
@code{INSERT} quando a mesma é gerada automaticamente. Com ODBC, você pode
fazer uma coisa como esta (assumindo que @code{auto} é um campo @code{AUTO_INCREMENT}):

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

Ou se você somente quer adicionar o valor noutra tabela, faça o
seguinte:

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

Para o benefício de algumas aplicações ODBC (pelo menos Delphi e Access),
a seguinte consulta pode ser usada para encontrar o valor do novo registro
adicionado:

@example
SELECT * FROM tbl_name WHERE auto IS NULL;
@end example

@node Informando bug do MyODBC,  , ODBC e last_insert_id, ODBC
@section Informando problemas com MyODBC

Se você encontra dificuldades com MyODBC, deve começar por fazer
um arquivo log no Administrador ODBC (o log você tem quando
solicita logs do ODBCADMIN) e um log @strong{MyODBC}. Para gerar um log @strong{MyODBC},
clique a opção `Trace MyODBC' na tela de configuração da conexão
@strong{MyODBC}.
O log será escrito no arquivo @file{C:\myodbc.log}.
Note que você deve usar a @code{MYSQL.DLL} e não a
@code{MYSQL2.DLL} para que esta opção funcione!

Verifique as consultas que MyODBC envia para o servidor @strong{MySQL};
Você deverá ser capaz de encontrar isto através da pesquisa da
string @code{>mysql_real_query} no arquivo @file{myodbc.log}.

Você deve também tentar duplicar as consultas no monitor @code{mysql}
ou @code{admndemo} para encontrar se o erro é do MyODBC ou do @strong{MySQL}.

Se você encontrar algo errado, por favor envie somente as linhas
relevantes (máximo 40 linhas) para o @email{myodbc@@lists.mysql.com}.  Favor nunca
enviar os arquivos log completos do MyODBC ou do ODBC !

Se você não encontra o quê está errado, a última opção
é fazer um arquivo (tar ou zip) que contenha um arquivo log do MyODBC,
o arquivo log ODBC e um arquivo README que explique o problema.
Você o manda para @uref{ftp://www.mysql.com/pub/mysql/secret}. Somente nós da TCX
devemos ter acesso a esses arquivos que você manda e nós seremos muito discretos com
os dados !

Se você pode fazer um programa que também mostre o mesmo problema, favor mandá-lo
também!

Se o programa funciona com outro servidor SQL, você pode fazer um
arquivo log que faça exatamente a mesma coisa com o outro servidor
SQL.

Lembre que quanto mais informação você nos fornece, o resultado é
que nós podemos resolver o problema!
