 |
Quais alterações serão necessárias no meu código fonte? |
| |
Programar com SQL LIB exige poucas alterações no seu código fonte e resume-se basicamente à três alterações:
• Inserir o comando REQUEST apropriado para linkagem correta da LIB.
• Inserir o comando para se conectar ao banco de dados.
• Alterar o RDD padrão para trabalhar com a SQL LIB.
Veja um exemplo simples de um programa tradicional em DBF e o mesmo com o uso da SQL LIB como fica: |
| |
FUNCTION MAIN
USE PRODUTOS.DBF ALIAS PROD
SET INDEX TO CODPROD, DESCPROD
DO WHILE !EOF()
? CODIGO, DESCRICAO, VALOR
SKIP
ENDDO
CLOSE PRODUTOS
RETURN
|
#include "sqllib.ch"
REQUEST SQLLIB
REQUEST MySQL
FUNCTION MAIN
SQL CONNECT ON "localhost";
PORT 3306 ;
DATABASE "teste" ;
USER "root" ;
PASSWORD '';
LIB 'MySQL'
RDDSETDEFAULT('MySQL')
USE PRODUTOS.DBF ALIAS PROD
SET INDEX TO CODPROD, DESCPROD
DO WHILE !EOF()
? CODIGO, DESCRICAO, VALOR
SKIP
ENDDO
CLOSE PRODUTOS
RETURN
|
|
| |
Apenas as alterações destacadas no código acima são suficientes para se trabalhar com qualquer banco SQL suportado com a SQL LIB. |
| |
|
 |
Ainda será necessário reindexar minhas tabelas? |
| |
Sim, ao trabalhar com base de dados SQL ainda será necessário indexar suas tabelas de dados e abri-los com SET INDEX para poder efetuar os SEEKs necessários.
A grande diferença reside no fato de que base de dados em SQL são muito mais estáveis e devido à isto elas não exigem reindexação constante. É muito comum inclusive, que em servidores SQL você reindexe sua base de dados apenas uma vez (geralmente no ato da instalação do sistema) e depois trabalhe normalmente sem preocupação de encontrar corrupção de índices ou dados. |
| |
|
 |
Será necessário distribuir algum arquivo adicional com meu programa? |
| |
Sim, será necessário apenas a DLL cliente para acessar o servidor SQL. Este arquivo é requerido pelo próprio servidor SQL e é obrigatório. Como exemplo podemos citar o fato de que todos os aplicativos clientes que acessam o servidor MySQL necessitam de ter o arquivo LibMySQL.DLL instalado em seu sistema. Este é o unico arquivo que vc terá que enviar junto com o seu sistema.
OBS: Recomendamos que sempre copie a DLL cliente para a mesma pasta de instalação de seu aplicativo. Isto evitará problemas com DLLs de versões diferentes instaladas na mesma máquina onde seu aplicativo será executado.
|
| |
|
 |
Posso trabalhar com tabelas em DBF e SQL no mesmo aplicativo? |
| |
Sim, você pode programar acessando dados de tabelas em SQL e de arquivos DBF. Inclusive você pode relacionar tabelas de origens diferentes, efetuar pesquisas e até filtros em tabelas usando diferentes RDDs.
Veja um exemplo completo mostrando os detalhes envolvidos: |
| |
#include "sqllib.ch"
REQUEST SQLLIB
REQUEST MySQL
FUNCTION MAIN
SQL CONNECT ON "localhost";
PORT 3306 ;
DATABASE "teste" ;
USER "root" ;
PASSWORD '';
LIB 'MySQL'
USE PEDIDOS.DBF VIA 'MySQL' INDEX ON NUMPED TO NUMPED
USE CLIENTES.DBF INDEX ON CODIGO TO CODCLI
SEEK 02101914
SELECT PEDIDOS SET ORDER TO 01 SEEK CLIENTES->CODIGO
DO WHILE !Eof()
? NUMPED, PEDVAL, CLIENTES->NOME
SKIP
ENDDO
CLOSE ALL
|
|
 |
Posso armazenar os dados das minhas tabelas em um site? |
| |
Sim, pois a SQL LIB permite que você acesse os dados de um servidor SQL hospedado em qualquer lugar do mundo - seja na sua rede interna, em um data center ou até mesmo em um servidor de hospedagem.
Para isto, basta informar os dados para acesso externo fornecidos pelo administrador da rede (ou do seu site) no comando SQL CONNECT. É este comando que efetua a conexão entre o seu aplicativo e a base de dados - eis um exemplo: |
| |
SQL CONNECT ON "www.wbnet.com.br";
PORT 3306 ;
DATABASE "sql_teste" ;
USER "root" ;
PASSWORD ';
LIB 'MySQL'
|
| |
Realmente é um processo bem simples, porém se você pretende hospedar os seus dados em um local externo ao da sua rede, é importante que você saiba que a maioria dos provedores não aceitam este tipo de conexão e possuem bloqueio de IP ou bloqueio de portas - o que impede o acesso externo à suas base de dados por ferramentas de terceiros. |
| |
|
 |
Eu consigo armazenar um arquivo de foto ou documento dentro duma tabela? |
| |
Sim! Utilizando base de dados SQL é possível guardar qualquer tipo de dados dentro de um campo MEMO. Tradicionalmente em Clipper estes campos possuem o limite de 64KB, porém, em base de dados SQL existe a possibilidade de se armazenar até 4GB de informação em um único campo! |
| |
REPLACE CAMPO_MEMO WITH ANY2SQL( MemoRead( 'c:\arquivo.bmp' ))
MemoWrit( 'c:\arquivo2.bmp', FIELD->CAMPO_MEMO )
|
 |
Como substituir a função FILE()? |
| |
A função FILE() se torna obsoleta em ambiente SQL devido ao fato que os arquivos não se encontram fisicamente no mesmo computador onde o seu aplicativo reside e portanto, não há uma maneira tradicional de se determinar a existência de um arquivo ou de um índice dentro do banco de dados com o uso de FILE().
Devido à isto a SQL LIB traz consigo 2 novas funções: TABLE() e INDEX() que informam se uma determinada tabela ou índice existem no banco de dados atual. Veja um exemplo de como converter uma rotina usando estas 2 funções: |
| |
FUNCTION MAIN
IF !FILE( 'PRODUTOS.DBF' )
ALERT( 'ARQUIVO DE PRODUTOS'+; 'NAO EXISTE!')
QUIT
ENDIF
USE PRODUTOS.DBF
IF !FILE( 'CODPROD.NTX' )
INDEX ON CODIGO TO ;
CODPROD.NTX
ENDIF
IF !FILE( DESCPROD.NTX' )
INDEX ON DESCRICAO ;
TO DESCPROD.NTX
ENDIF
SET INDEX TO CODPROD, DESCPROD
....
|
#include "sqllib.ch"
REQUEST SQLLIB
REQUEST MySQL
FUNCTION MAIN
SQL CONNECT;
ON "localhost";
PORT 3306 ;
DATABASE "teste" ;
USER "root" ;
PASSWORD '';
LIB 'MySQL'
RDDSETDEFAULT('MySQL')
USE PRODUTOS.DBF
IF !INDEX( 'CODPROD.NTX' )
INDEX ON CODIGO ;
TO CODPROD.NTX
ENDIF
IF !INDEX( 'DESCPROD.NTX' )
INDEX ON DESCRICAO;
TO DESCPROD.NTX
ENDIF
SET INDEX ;
TO CODPROD, DESCPROD
...
|
|
| |
|
 |
Como ocultar a mensagem de erro, para um conexão não sucedida? |
| |
Sim, para isto basta utilizar o parâmetro SQL_NO_WARNING na opção OPTIONS do comando SQL CONNECT e testar o resultado com as funções SQL_ERRORNO() ou SQL_ERRORMSG().
Eis um exemplo logo abaixo demonstrando como utilizar estes recursos: |
SQL CONNECT ON "localhost" ;
PORT 3306 ;
DATABASE "teste" ;
USER "root" ;
PASSWORD ""_ ;
OPTIONS SQL_NO_WARNING ;
LIB "MySql"
IF SQL_ErrorNO() > 0
Alert( "Não foi possível conectar ao banco de dados !;"+;
"Informe esta mensagem ao suporte : ;"+;
SQL_ErrorMsg() )
Return( .F. )
ENDIF
|
|