mirror of
https://github.com/MariaDB/server.git
synced 2025-01-24 07:44:22 +01:00
273 lines
10 KiB
Text
273 lines
10 KiB
Text
|
@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<61>s do programa @strong{MyODBC}.
|
|||
|
|
|||
|
|
|||
|
@node Quais ODBC OS, ODBC Problemas, ODBC, ODBC
|
|||
|
@section Sistemas Operacionais suportados por MyODBC
|
|||
|
|
|||
|
@strong{MyODBC} <20> um driver 32-bit ODBC (2.50) n<>vel 0 para Windows95
|
|||
|
e Windows NT. N<>s esperamos que algu<67>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<6F> souber de algum outro aplicativo que funcione com @strong{MyODBC}, por favor
|
|||
|
nos escreva sobre isso atrav<61>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<6D><61>es de
|
|||
|
usu<EFBFBD>rios que confirmaram o seu funcionamento.
|
|||
|
|
|||
|
@table @asis
|
|||
|
@item @strong{Program}
|
|||
|
@strong{Comment}
|
|||
|
@item Access
|
|||
|
Como fazer Accces funcionar:
|
|||
|
@itemize @bullet
|
|||
|
@item
|
|||
|
Voc<EFBFBD> dever<65> ter uma chave prim<69>ria na tabela.
|
|||
|
@item
|
|||
|
Voc<EFBFBD> deve ter um campo timestamp em todas as tabelas em que voc<6F> quer controlar a
|
|||
|
atualiza<EFBFBD><EFBFBD>o.
|
|||
|
|
|||
|
@item
|
|||
|
Somente use campos doubles float. Access falha quando faz compara<72><61>es com campos float
|
|||
|
simples.
|
|||
|
@item
|
|||
|
Configure a op<6F><70>o `Return matching rows' quando conectar com o @strong{MySQL}.
|
|||
|
@item
|
|||
|
O Access no NT acusar<61> colunas @code{BLOB} como @code{OLE OBJECTS}.
|
|||
|
Se ao inv<6E>s disso voc<6F> quer colunas @code{MEMO}, deve trocar a coluna para
|
|||
|
@code{TEXT} usando @code{ALTER TABLE}.
|
|||
|
@item
|
|||
|
Access <20>s vezes n<>o lida adequadamente com colunas do tipo @code{DATE}.
|
|||
|
Se voc<6F> tiver problemas com essas colunas, mude as colunas para @code{DATETIME}.
|
|||
|
@item
|
|||
|
Em certas situa<75><61>es, o Access cria consultas SQL ilegais que o
|
|||
|
@strong{MySQL} n<>o pode processar. Voc<6F> pode resolver isso selecionando o tipo de
|
|||
|
consulta @code{"Query|SQLSpecific|Pass-Through"} no menu do Access.
|
|||
|
@end itemize
|
|||
|
@item DataJunction
|
|||
|
Voc<EFBFBD> tem que trocar para mandar @code{VARCHAR} ao inv<6E>s de @code{ENUM}, porque
|
|||
|
o mesmo exporta o <20>ltimo de uma maneira que causa fadiga ao @strong{MySQL}.
|
|||
|
@item Excel
|
|||
|
Funciona. Algumas dicas:
|
|||
|
@itemize @bullet
|
|||
|
@item
|
|||
|
Se voc<6F> tem problemas com datas, tente selecion<6F>-las como strings usando a
|
|||
|
fun<EFBFBD><EFBFBD>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<6F>sito de @code{CONCAT()} <20> enganar o ODBC, fazendo-o pensar
|
|||
|
que a coluna <20> do 'tipo string'. Sem o @code{CONCAT()}, ODBC sabe que a coluna
|
|||
|
<EFBFBD> do tipo time e o Excel n<>o entender<65> isso.
|
|||
|
|
|||
|
Note que isso <20> um bug no Excel, porque o mesmo converte automaticamente a
|
|||
|
string para time. Isto <20> muito bom quando o fonte <20> um arquivo
|
|||
|
texto, mas n<>o se pode dizer o mesmo quando o fonte <20> uma conex<65>o
|
|||
|
ODBC que informa o tipo exato para cada coluna.
|
|||
|
@end itemize
|
|||
|
@item odbcadmin
|
|||
|
Programa Teste para ODBC.
|
|||
|
@item Delphi
|
|||
|
Voc<EFBFBD> dever<65> usar DBE 3.2 ou mais atualizado. Configure o campo de op<6F><70>o
|
|||
|
`Don't optimize column width' quando conectando com @strong{MySQL}.
|
|||
|
|
|||
|
Tamb<EFBFBD>m, h<> aqui um c<>digo muito <20>til que configura tanto a
|
|||
|
inser<EFBFBD><EFBFBD>o ODBC e a inser<65><72>o BDE para MyODBC (a inser<65><72>o BDE requer um BDE
|
|||
|
Alias Editor que pode ser obtido de gra<72>a numa Delphi Super Page
|
|||
|
perto de voc<6F>.): (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 <20>nico problema conhecido <20> que quando o esquema da tabela
|
|||
|
muda, os campos da consulta n<>o s<>o atualizados. BDE entretanto, parece n<>o
|
|||
|
reconhecer chaves prim<69>rias, somente <20>ndice PRIMARY, n<>o entanto isto n<>o
|
|||
|
tem sido um problema.
|
|||
|
|
|||
|
@item Visual basic
|
|||
|
Para atualizar uma tabela, voc<6F> dever<65> definir uma chave prim<69>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<74>s possibilidades para especificar o nome do servidor em
|
|||
|
Windows95:
|
|||
|
|
|||
|
@itemize @bullet
|
|||
|
@item
|
|||
|
Usando o endere<72>o IP do servidor.
|
|||
|
@item
|
|||
|
Adicionar um arquivo @file{lmhosts} com a seguinte informa<6D><61>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 <20> 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} <20> qualquer nome que seja <20>nico
|
|||
|
em seu Windows ODBC setup.
|
|||
|
|
|||
|
Voc<EFBFBD> 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<6F> o faz, esses valores devem ser usados como padr<64>o para fazer
|
|||
|
uma conex<65>o. Voc<6F> tem a op<6F><70>o de trocar os valores nesse instante.
|
|||
|
|
|||
|
Se o n<>mero da porta n<>o for especificado, o valor padr<64>o da porta (@value{default_port})
|
|||
|
<EFBFBD> usado.
|
|||
|
|
|||
|
Se voc<6F> especificar a op<6F><70>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<EFBFBD> pode usar todas as op<6F><70>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 <20> gerada automaticamente. Com ODBC, voc<6F> pode
|
|||
|
fazer uma coisa como esta (assumindo que @code{auto} <20> um campo @code{AUTO_INCREMENT}):
|
|||
|
|
|||
|
@example
|
|||
|
INSERT INTO foo (auto,text) VALUES(NULL,'text');
|
|||
|
SELECT LAST_INSERT_ID();
|
|||
|
@end example
|
|||
|
|
|||
|
Ou se voc<6F> somente quer adicionar o valor noutra tabela, fa<66>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<65>cio de algumas aplica<63><61>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<6F> encontra dificuldades com MyODBC, deve come<6D>ar por fazer
|
|||
|
um arquivo log no Administrador ODBC (o log voc<6F> tem quando
|
|||
|
solicita logs do ODBCADMIN) e um log @strong{MyODBC}. Para gerar um log @strong{MyODBC},
|
|||
|
clique a op<6F><70>o `Trace MyODBC' na tela de configura<72><61>o da conex<65>o
|
|||
|
@strong{MyODBC}.
|
|||
|
O log ser<65> escrito no arquivo @file{C:\myodbc.log}.
|
|||
|
Note que voc<6F> deve usar a @code{MYSQL.DLL} e n<>o a
|
|||
|
@code{MYSQL2.DLL} para que esta op<6F><70>o funcione!
|
|||
|
|
|||
|
Verifique as consultas que MyODBC envia para o servidor @strong{MySQL};
|
|||
|
Voc<EFBFBD> dever<65> ser capaz de encontrar isto atrav<61>s da pesquisa da
|
|||
|
string @code{>mysql_real_query} no arquivo @file{myodbc.log}.
|
|||
|
|
|||
|
Voc<EFBFBD> deve tamb<6D>m tentar duplicar as consultas no monitor @code{mysql}
|
|||
|
ou @code{admndemo} para encontrar se o erro <20> do MyODBC ou do @strong{MySQL}.
|
|||
|
|
|||
|
Se voc<6F> 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<6F> n<>o encontra o qu<71> est<73> errado, a <20>ltima op<6F><70>o
|
|||
|
<EFBFBD> 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<EFBFBD> o manda para @uref{ftp://www.mysql.com/pub/mysql/secret}. Somente n<>s da TCX
|
|||
|
devemos ter acesso a esses arquivos que voc<6F> manda e n<>s seremos muito discretos com
|
|||
|
os dados !
|
|||
|
|
|||
|
Se voc<6F> pode fazer um programa que tamb<6D>m mostre o mesmo problema, favor mand<6E>-lo
|
|||
|
tamb<EFBFBD>m!
|
|||
|
|
|||
|
Se o programa funciona com outro servidor SQL, voc<6F> pode fazer um
|
|||
|
arquivo log que fa<66>a exatamente a mesma coisa com o outro servidor
|
|||
|
SQL.
|
|||
|
|
|||
|
Lembre que quanto mais informa<6D><61>o voc<6F> nos fornece, o resultado <20>
|
|||
|
que n<>s podemos resolver o problema!
|