Você está na página 1de 85

GUIA DE REFERÊNCIA E 

MANUAL DE INSTALAÇÃO 

Abrange a SQL LIB v1.5 de Abril de 2007. 

Reprodução total ou parcial proibida 
exceto com consentimento expresso e por escrito do autor 

Revisão 2.8 – Abril de 2007 
Vailton Renato ­ renato@sqllib.com
Índice Ger al 
Intr odução..............................................................................................................  I 
Legenda............................................................................................................  I­1 
Agradecimentos.................................................................................................  I­2 

Instalação e Pr imeir os Passos ...................................................................................................  II 


Como instalar a SQL LIB.......................................................................................................  II­1 
Quais bibliotecas (*.LIB) eu necessito utilizar em meu projeto?...........................................  II­2 
Problemas na conexão ao servidor SQL?...............................................................................  II­3 

Guia de Refer encia ..................................................................................................  III 


Comandos 
SQL CONNECT ON.................................................................................................  III­1 
SQL CONNECT (com Strings de Conexão)............................................................  III­2 
SQL DISCONNECT.................................................................................................  III­3 
SQL EXECUTE......................................................................................................  III­4 
SQL TRANSLATE PATH..........................................................................................  III­5 
SQL TRANSLATE CASE...........................................................................................  III­6 
SQL CUSTOM INDEXES...........................................................................................  III­7 
SQL PACKETSIZE.................................................................................................  III­8 
SQL CURRENT PACKETSIZE....................................................................................  III­9 
SQL FULLDELETE.................................................................................................  III­10 
SQL FILTER........................................................................................................  III­11 
COPY TABLE........................................................................................................  III­12 
DELETE TABLE.....................................................................................................  III­13 
DELETE INDEX.....................................................................................................  III­14 
RENAME TABLE.....................................................................................................  III­15 
RENAME INDEX.....................................................................................................  III­16 
START TRANSACTION............................................................................................  III­17 
END TRANSACTION................................................................................................  III­18 
COMMIT TRANSACTION...........................................................................................  III­19 
ROLLBACK TRANSACTION.......................................................................................  III­20 
CLEAR INDEXES...................................................................................................  III­21 
SELECT SCHEMA...................................................................................................  III­22 
USE....................................................................................................................  III­23 
USE SQL / USE AS..............................................................................................  III­24 

Funções..................................................................................................................  IV 
Tr adução de nomes de arquivos 
SQLParseStyle()................................................................................................  IV­1 
SQLParseCase().................................................................................................  IV­2 
SQLParse()........................................................................................................  IV­3 

Ger enciamento de conexões 
SQLConnect().....................................................................................................  IV­4 
SQLConnParse().................................................................................................  IV­5 
SQLDisconnect()................................................................................................  IV­6 
SQLGetConnection()...........................................................................................  IV­7 
SQLSetConnection()...........................................................................................  IV­8 
SQLGetConnections().........................................................................................  IV­9 
SQLGetConnectionInfo()....................................................................................  IV­10 
SQLGetRddName()................................................................................................  IV­11 
SQLErrorMsg()...................................................................................................  IV­12 
SQLErrorNO()....................................................................................................  IV­13 
SQLPacketSize()................................................................................................  IV­14 

Execução de comandos SQL 
SQLExecute()......................................................................................................  IV­15 
SQLArray()..........................................................................................................  IV­16 
SQLArrayAssoc().................................................................................................  IV­17

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 2 


SQLNullDate()....................................................................................................  IV­18 
SQLNull()...........................................................................................................  IV­19 

Manipulação de dados 
SQLFilter()........................................................................................................  IV­20 
SQLRefresh()......................................................................................................  IV­21 
SQL_AffectedRows()............................................................................................  IV­22 
SQL_FullDelete()................................................................................................  IV­23 

Manipulação de tabelas/índices 
SQLCreateFlags()................................................................................................  IV­24 
DBCreate()..........................................................................................................  IV­25 
TABLE()...............................................................................................................  IV­26 
INDEX()...............................................................................................................  IV­27 
TAG()..................................................................................................................  IV­28 
DATABASE()..........................................................................................................  IV­29 
TrueReccount()...................................................................................................  IV­30 
SQLCopyTable()...................................................................................................  IV­31 
SQLRenameTable()................................................................................................  IV­32 
SQLRenameIndex()................................................................................................  IV­33 
SQLDropTable()...................................................................................................  IV­34 
SQLDropIndex()...................................................................................................  IV­35 
SQLAlterTable().................................................................................................  IV­36 
SQLUseCustomIndexes().......................................................................................  IV­37 

Ger enciamento de transações 
SQLBeginTrans()................................................................................................  IV­38 
SQLEndTrans()...................................................................................................  IV­39 
SQLCommit().......................................................................................................  IV­40 
SQLRollBack()...................................................................................................  IV­41 
SQLTransCount()................................................................................................  IV­42 

Funções diver sas do ser vidor  SQL 


SQLGetDBInfo()..................................................................................................  IV­43 
SQLGetTables()..................................................................................................  IV­44 
SQLGetIndexes()................................................................................................  IV­45 
SQLGetDBs().......................................................................................................  IV­46 
SQLGetUsers()...................................................................................................  IV­47 
SQLGetConnectedUsers()....................................................................................  IV­48 
SQLServerVersion()............................................................................................  IV­49 
SQLServerDate().................................................................................................  IV­50 
SQLServerTime().................................................................................................  IV­51 

Funções de conversão 
SQLDate()..........................................................................................................  IV­52 
SQLStr()............................................................................................................  IV­53 
SQLNTrim()...........................................................................................................  IV­54 
ToString()........................................................................................................  IV­55 

Funções diver sas 
SQLRowID()........................................................................................................  IV­56 
SQLVersion().....................................................................................................  IV­57 
SQLLIB()............................................................................................................  IV­58 

Backup & Restor e 
SQLBackupStart()..............................................................................................  IV­59 
SQLBackupEnd()..................................................................................................  IV­60 
SQLBackupRestore()...........................................................................................  IV­61 
SQLBackupTable()..............................................................................................  IV­62 
SQLBackupRoutines().........................................................................................  IV­63 
SQLBackupBlock()..............................................................................................  IV­64 

Schemas 
SQLSchema().......................................................................................................  IV­65

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 3 


SQLSystemSChema().............................................................................................  IV­66 

Funções de baixo nível da API 
_SQL_GetPointer().............................................................................................  IV­67 
_SQL_GetConn()..................................................................................................  IV­68 
_SQL_SystemID()................................................................................................  IV­69 
_SQL_SystemIDStr()...........................................................................................  IV­70 
_SQL_TableStyle().............................................................................................  IV­71 
_SQL_TableName()...............................................................................................  IV­72 
_SQL_FullTableName()........................................................................................  IV­73 
_SQL_TableSchema()............................................................................................  IV­74 

Compatibilidade 
Apêndice A – Índices com a SQL LIB ..........................................................................................  A1 
Apêndice B – Dicas de performance...............................................................................................  A2 
Apêndica C – Usando o FiveWin e a SQL LIB RDD ....................................................................  A3

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 4 


I ­ Intr odução 
O Projeto SQL LIB foi desenvolvido para suprir uma grande deficiência da atual comunidade xBase, 
necessidade esta de conexão com banco de dados remotos nas linguagens Harbour e xHarbour. 

Anteriormente  estes  usuários  xBase  não  contavam  com uma  solução que  fosse  acessível  à  todos  para 
conexão com os bancos de dados remotos, limitando­se apenas aos antigos arquivos DBFs (Data Base 
Files). 

Foi pensando nisso que nós construímos então uma ferramenta moderna que surgiu para possibilitar e 
tornar viável este tipo de comunicação cliente/servidor, de uma forma segura e eficiente. 

A SQL LIB está sendo projetada para permitir conexões remotas de modo transparente via RDD com 
as seguintes bases de dados: MySQL, PostgreSQL, Firebird e ODBC. 

A facilidade e a performance de sua utilização permitem que, com um conjunto mínimo de adaptações, 
os sistemas possam migrar de modo transparente para tais SGBDs (Sistemas Gerenciadores de Banco 
de Dados ou servidores SQL), evitando assim uma grande curva de aprendizado e aproveitando toda a 
experiência do profissional xBase, além de representar uma excelente relação custo/benefício. 

A SQL LIB é uma solução completa para a atual comunidade, com suporte e atualizações constantes 
mantidas por nossa equipe de desenvolvimento. 

Este documento contém informações importantes sobre os comandos e funções suportados pela SQL 
LIB. Esperamos que esta documentação seja de grande ajuda para todos, especialmente os novos que 
desejam iniciar no empolgante mundo do SQL! 

1. Ícones utilizados 
As explicações e o material contido neste documento quando apropriados serão acompanhados de um 
ícone para identificar a importância da orientação que se segue. Eis abaixo na tabela I­1 os ícones 
empregados e suas respectivas importâncias: 

Este ícone denota materia informativa, como uma explanação de algum assunto 
relativo ao contexto 

Este ícone identifica um material importante que exige atenção e pode lhe poupar um 
tempo, tal como uma dica ou macete envolvendo alguma função em SQL. 

Este ícone indica alguma advertência ou informação de extrema importância. 
Tabela I­1 

2. Agr adecimentos 
Agradeço à todos que acreditaram em meu trabalho mas especialmente à Frank Lenon Rodrigues pela 
ajuda e apoio prestados e também à Kleyber Dérick B. Ribeiro pela atenção nos momentos difíceis de se 
‘domar’ o Fivewin devido à minha falta de experiência inicial. Mas gostaria de especialmente agradecer 
aquelas  pessoas  que não  me apoiaram em  nenhum  momento e pelo  contrário  ­ até dificultaram  e  em 
muito as coisas para mim, no decorrer deste percurso. 

Sendo assim à todos agradeço: obrigado, muito obrigado por utilizar nossas ferramentas. 
Desejo sucesso à todos e até a próxima! 

Vailton Renato 
SQL LIB, WxWeb, MyMake & xDevStudio Developer

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 5 


II – Instalação e Pr imeir os passos 
A  SQL LIB é distribuída de por meios eletrônicos por duas maneiras distintas, pois possui 2 versões: a 
FREE que visa ajudar à todos na comunidade oferecendo acesso nativo à MySQL e uma versão 
comercial, mais robusta e completa com acesso completo à todos os bancos SQL suportados pela LIB.

·  Para clientes da versão FREE, baixe o pacote de instalação diretamente de nosso site, clicando 
aqui: http://www.sqllib.com.br/download.php
·  Para clientes comerciais, você receberá um e­mail confirmando os dados cadastrais de sua 
empresa, juntamente com seu número de série para suporte. Siga as instruções que constam 
neste e­mail para efetuar o download da RDD comercial. 

Os arquivos de instalação da SQL LIB obedecem à uma nomenclatura de fácil compreensão:
·  SQL­LIB­v1.5c­FREE.zip 
Denota um arquivo de instalação da SQL LIB na versão 1.0 e indica que a mesma trata­se da 
versão FREE da RDD.

·  SQL­LIB­v1.5c­Comercial­DEMO.zip 
Denota um arquivo de instalação da SQL LIB na versão 1.0 e indica a versão COMERCIAL da 
RDD, liberada apenas para clientes registrados. 

1. Como instalar  a SQL LIB 
O processo de instalação para ambos é o mesmo. Descompacte o arquivo .ZIP e execute o aplicativo de 
instalação contido dentro do pacote. Certifique­se de descompactar os arquivos na mesma pasta do teu 
compilador. 

Você pode seguramente instalar a SQL LIB em outro diretório que não seja o do teu compilador. Neste caso será necessário 


que você copie os arquivos de INCLUDE e as LIBs para as suas devidas pastas, onde está instalado o seu Harbour ou 
xHarbour. 

Após  o  término  do  processo  acima,  você  já  estará  tudo  pronto  para  utilizar  a  ferramenta.  Como 
download adicional, recomendamos que você baixe também o DBF2SQL (antigo DBF2MYSQL) que se 
encontra para download em nosso site, a fim de lhe ajudar no processo de migração de suas bases de 
dados atuais em DBF para o servidor SQL. 

2. Quais LIBs eu necessito em meu pr ojeto? 
A SQL LIB é um projeto fantástico pelo que ela se propõe a fazer ­ e tem feito: oferecer o mesmo RDD 
para todas as versões do Harbour e do xHarbour atualmente mais usadas. Sendo assim, temos hoje no 
cenário 10 versões da SQL LIB cada uma compilada e otimizada para seu compilador específico:

·  Suporte para Harbour versão 45.0
·  Suporte para xHarbour versão 0.99.0, 0.99.1, 0.99.2, 0.99.3, 0.99.4, 
0.99.50, 0.99.51a (FW 2.6), 0.99.51 (FW 2.7), 99.60 e versões futuras. 

Quando você instala a SQL LIB estará recebendo versões da RDD para vários compiladores. É 
necessário saber identificar qual é a LIB correta para execução do seu aplicativo. Um exemplo da 
nomenclatura utilizada para identificação é mostrado como neste exemplo: 
P:\SQLLIB\COMERCIAL\LIB>dir 
O volume na unidade P é P4­3.2 HT 
O número de série do volume é CCD8­6FDF 

Pasta de P:\SQLLIB\COMERCIAL\LIB 

30/01/2006  20:45    <DIR>          .

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 6 


30/01/2006  20:45    <DIR>          .. 
17/11/2004  19:39            16.384 libmysql.lib 
28/01/2006  19:39  102.912 blibpq.lib 
30/01/2006  20:45           148.480 sqllib_HB_450.LIB 
30/01/2006  20:44           149.504 sqllib_xHB_0990.LIB 
30/01/2006  20:44           149.504 sqllib_xHB_0991.LIB  Isto identifica qual é o 
30/01/2006  20:43  149.504 sqllib_xHB_0992.LIB  compilador suportado por esta 
30/01/2006  20:36           149.504 sqllib_xHB_0993.LIB  LIB ­ Harbour ou xHarbour 
30/01/2006  20:35           150.016 sqllib_xHB_0994.LIB 
30/01/2006  20:35           150.016 sqllib_xHB_09950.LIB 
30/01/2006  20:34           146.944 sqllib_xHB_09951.LIB  Isto indica a versão do 
30/01/2006  20:34           150.016 sqllib_xHB_09951a.LIB  compilador suportado. 
11 arquivo(s)      1.359.872 bytes  Neste caso, o xHB 0.99.50
2 pasta(s)    907.030.528 bytes disponíveis 

P:\SQLLIB\COMERCIAL\LIB> 

Para  identificarmos  a  versão  correta  a  ser  utilizada  é  simples,  basta  observar  o  esquema  acima.  Por 
exemplo,  se  estivermos  compilando  com  o  xHarbour  versão  0.99.50,  iremos  utilizar  a 
sqllib_xhb_09950.lib  em nosso projeto. 

Visto  que  a  SQL  LIB  oferece  acesso  nativo,  iremos  necessitar  também  de  algumas  libs  adicionais, 
conforme  o  servidor  que  iremos  nos  conectar.  A  tabela  II­1  mostra  quais  arquivos  adicionais  são 
necessários, dependendo do driver que iremos utilizar: 

Arquivo  Driver RDD 
libmysql.lib  Esta lib contém as rotinas de acesso ao banco MySQL. 

blibpq.lib  Esta lib é utilizada pela RDD para efetuar conexão com o PostgreSQL. 

Tabela II­1 

Lembrando  que  tais  arquivos  são  obrigatórios  apenas  quando  se  deseja  utilizar  o  respectivo  banco. 
Sendo  assim,  um  programador  que  irá  utilizar  MySQL  apenas  pode  decidir  não  incluir  as  LIBs  do 
PostgreSQL ou vice­versa, tornando o tamanho do seu executável final menor. 

3. Pr oblemas na conexão ao ser vidor  SQL? 


A SQL LIB fornece o comando SQL CONNECT para estabelecer uma conexão com o servidor SQL. 
Consulte  logo  abaixo  neste  manual  sobre  este  o  comando.  Se  estiver  encontrando  problemas  em 
estabelecer a  conexão, observe algumas dicas: 

1.  Firewall – No caso de você estar tentando acessar um micro na rede ou via internet e não estar 
conseguindo  logar,  verifique  se  há  algum  firewall  ativo.  Se  houver,  talvez  seja  necessário 
habilitar  acesso  externo  à  este  micro  pela  porta  que  o  servidor  SQL  usa  –  por  exemplo:  o 
MySQL usa a porta 3306 e o PostgreSQL 5432. 

2.  Autenticação  –  Servidores  SQL  possuem  um  sistema  de  controle  de  acesso  que  variam  de 
servidor para servidor, mas basicamente consistem em verificar 3 coisas: 

a.  Se o usuário é válido 
b.  Se a senha informada confere 
c.  Se o IP de onde partiu a solicitação de conexão é válido 

Este  último  ponto  é  importante  por  que,  mesmo  se  um  nome  e  senha  corretos  forem 
fornecidos, o  servidor  SQL  pode  recusar  a  conexão  caso o IP  de onde partiu  a  solicitação 
não for válido, com base nas suas configurações internas. 

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 7 


Problemas com autenticação são fáceis de se solucionar, mas o procedimento para se efetuar 
esta configuração muda de acordo com o SGBD utilizado. Eis algumas referências para sua 
pesquisa (todos em português): 

Um artigo interessante sobre este assunto em MySQL, está disponível neste link: 
http://dev.mysql.com/doc/refman/4.1/pt/adding­users.html 
http://dev.mysql.com/doc/refman/4.1/pt/old­client.html (em português) 
http://dev.mysql.com/doc/refman/5.0/en/old­client.html (em inglês) 

Em PostgreSQL é necessário editar o arquivo pg_hba.conf liberando acesso, um exemplo é 
encontrado neste LINK e pode ser de ajuda nestes casos: 
http://pgdocptbr.sourceforge.net/pg80/client­authentication.html#EXAMPLE­PG­ 
HBA.CONF

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 8 


III – Guia de Refer ência 
Esta  seção  descreve  os  novos  comandos  e  as  novas  funções  introduzidas  pela  SQL  LIB.  O  arquivo 
SQLLIB.CH  contém  as  definições de  todos  os  comandos  suportados pela  RDD.  Algo  importante a  ser 
mencionado,  é  que  tendo  em  vista  que  a  SQL  LIB  foi  projetada  para  ser  de  fácil  utilização  e 
especialmente  pensando  nos usuários que  migram  de outras  ferramentas  para o  nosso projeto,  muitos 
comandos possuem mais de uma sintaxe e muitas funções possuem aliases visando agilizar o acesso e a 
migração de código já existente. 

Um  exemplo  típico  disto,  é o  comando  SQL  CONNECT  que pode  ser  acionado  normalmente 
como: 

SQL CONNECT ON 'localhost'; 
PORT 3306 ; 
DATABASE "test" ; 
USER "root"; 
PASSWORD ''; 
LIB 'MySQL' 

No  entanto,  visando  auxiliar  aqueles  usuários  que  estejam  migrando  de  outras  ferramentas, 
disponibilizamos também uma sintaxe adicional para este comando: 
cConn:= "Driver=MySQL;ip=192.168.0.1;usuario=root;banco=jose" 
SQL CONNECT cConn INTO nMySQL 

Basicamente estas duas linhas acima têm o mesmo efeito que o comando anteriormente passado. 
Isto ocorre para facilitar a migração de códigos já existentes e facilita também ao programador que pode 
selecionar qual modo ele se adapta melhor e qual é mais útil para utilizar em seus aplicativos. 

Outros comandos que utilizam esta mesma sintaxe são: SET PACKETSIZE, SET TRANSLATE entre muitos outros. 
Sempre que isto ocorrer, iremos demonstrar ambas as sintaxes, relacionando ambas as sintaxes. Isto ocorrerá tanto para 
os comandos, quanto para as funções – de modo que você possa decidir qual sintaxe deseja utilizar, lembrando­se sempre 
de que ambos os comandos/funções são mapeados para a mesma funcionalidade. 

A seção que se segue, conterá os comandos e funções suportadas pela RDD.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 9 


COMANDOS 
A  SQL  LIB  introduz  diversos  comandos  novos  ao  programador,  tanto  para  controle  de  conexões, 
gerenciamento das tabelas ou ainda execução de comandos SQL diretamente no servidor. Na seção que 
se  segue,  listaremos  todos  os  novos  comandos  introduzidos  pela  SQL  LIB  e  listados  no  arquivo 
SQLLIB.CH que acompanha a instalação da RDD por padrão. 

1. SQL CONNECT ON 
Estabiliza uma conexão à um servidor SQL suportado pela SQL LIB e retorna o número da conexão 
se bem sucedido ou zero em caso de erro. 

Sintaxe: 

SQL CONNECT ON <cHost> 
[PORT <nPort>] 
[DATABASE <cDb>] 
[USER <cUser>] 
[PASSWORD <cPassword>] 
[OPTIONS <nFlags>] 
[<LIB,DRIVER,RDD,VIA> <cDriverName>] 
[INTO <nOutPutVar>] 

Onde: 

<cHost>  Indica  o  nome  ou  o  IP  do  micro  à  qual  você  deseja  se  conectar  e  em  alguns 
casos pode ser utilizado a palavra­chave localhost indicando que o servidor está 
instalado na mesma CPU onde o aplicativo está sendo executado. 

<nPort>  É  o  número  da  porta  que  deve  ser  utilizada  para  conexão  ao  servidor.  Por 
exemplo,  podemos  citar  que  normalmente  o  MySQL  está  operando  na  porta 
3306 e o PostgreSQL  na 5432 e assim por diante. Este parâmetro é opcional e 
será preenchido com o valor padrão de cada banco se não for especificado. 

<cDB>  É o nome do banco de dados ao qual devemos inicialmente nos conectar. Alguns 
servidores  como  o  MySQL  permitem  que  seja  omitido  este  parâmetro  no 
comando  de  conexão,  pois  posteriormente  pode­se  selecionar   um  Database 
diferente  logo  após  a  conexão  estar  estabelecida.  No  entanto,  para  outros 
servidores como o PostgreSQL é obrigatório a passagem deste parâmetro e não 
é permitida a alteração do mesmo uma vez já estabelecida a conexão. 

<cUser>  É  o  nome  do  usuário  utilizado  para  autenticação  no  servidor.  Este  usuário  já 
deve estar previamente cadastrado no servidor SQL e deve possuir privilégio de 
acesso para que a conexão seja estabelecida com sucesso. 

<cPassword>  É a senha utilizada para autenticar o usuário especificado no parâmetro anterior 
junto ao servidor. 

<nFlags>  É um valor opcional conforme a tabela abaixo: 

SQL_NO_ERROR  Indica  que  quaisquer  erros  que  ocorram  durante  o 


processo  devem  ser  suprimidos.  Consulte  o  valor  de 
SQLERRORNO() para checar a ocorrência de algum erro. 

SQL_NO_WARNING  Opção não mais utilizada.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 10 


<cDriverName>  Identifica o nome do driver que você deseja utilizar para efetuar esta conexão. A 
SQL LIB suporte atualmente os seguintes drivers: 

MYSQL  Indica que a SQL LIB deve utilizar o driver nativo para 
MySQL para cuidar desta conexão. 

No  entanto  para  que  você  possa  linkar  o  suporte  à 


MySQL  no seu aplicativo, não esqueça de adicionar  no 
inicío do seu código fonte as seguintes linhas: 

REQUEST SQLLIB 
REQUEST MYSQL 

Feito  isto,  durante  o  processo  de  linkedição  as  funções 


necessárias serão incluídas no seu executável. 

PGSQL  Indica que a SQL LIB deve utilizar o driver nativo para 
PostgreSQL  para  gerenciar  esta  conexão.  No  início  do 
seu aplicativo, você deve incluir obrigatoriamente: 
Apelidos:  REQUEST SQLLIB 
PostgreSQL  REQUEST PGSQL 
Postgres 
PostSQL 
As  duas  linhas  abaixo  produzem  o  mesmo  efeito  do 
exemplo  acima,  pois  chamam  o  driver  do  PostgreSQL 
por um dos seus “apelidos”: 

REQUEST SQLLIB 
REQUEST PostgreSQL 

Isto  inclui  as  funções  necessárias  para  suporte  à 


PostgreSQL em seu executável. 

<nOutPutVar>  Especifica o nome de uma variável que irá receber o número da conexão atual, 
se bem sucedido ou zero em caso de erro. Caso a variável não exista, será criada 
com o valor de retorno. 

Se  a  conexão  for  efetuada  com  sucesso,  ela  torna­se  a  conexão  ativa.  Consulte  a  função 
SQLSETCONNECT() para maiores detalhes sobre o gerenciamento de conexões da SQL LIB. 

Exemplo: 

#include 'sqllib.ch' 

REQUEST SQLLIB 
REQUEST MySQL  /* Isto inclui suporte à MySQL em nosso aplicativo */ 
REQUEST PGSQL      /* Suporte à Postgres */ 

function Main() 
SQL CONNECT ON 'localhost'; 
PORT 3306 ; 
DATABASE "test" ; 
USER "root"; 
PASSWORD ''; 
OPTIONS SQL_NO_ERROR ; 
LIB 'MySQL' 

IF SQLErrorNO() > 0 
alert( 'Não conectou' ) 
else 
alert( 'Conexão estabelecida com sucesso!' )

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 11 


endif 

Consulte também: 
SQL CONNECT (com Strings de Conexão) 
SQL DISCONNECT 
SQLSETCONNECT() 

2. SQL CONNECT (com Str ings de Conexão) 
A  SQL  LIB  a  partir  da  versão  1.0,  disponibiliza  uma  forma  modificada  do  comando  SQL 
CONNECT  com  suporte  à  Strings de  conexão.  Nesta  sintaxe,  este  comando  processa  uma  string 
passada  como  argumento  e  estabiliza  uma  conexão  ao  servidor  utilizando  os  parâmetros  contidos 
nesta string. 

Este comando retorna o número da conexão se bem sucedido ou zero em caso de erro. Note ainda 
que  esta  função  não  emite  nenhum  erro  em  caso  de  falha ,  sendo  necessário  verificar 
SQLERRORNO()e  SQLERRORMSG() para averiguar o motivo que ocasionou a falha na conexão. 

Sintaxe: 

SQL CONNECT <cConn> [INTO <nOutPutVar>] 

Onde: 

<cConn>  Representa  a  string  de  conexão  contendo  os  parâmetros  necessários  para 
conectar­se  ao  servidor,  bem  como  o  nome  do  próprio  driver  RDD  utilizado 
para gerenciar esta conexão. 

Todos os parâmetros desta string de conexão possuem um ou mais apelidos, por 
exemplo,  para  especificar  o  nome  de  usuário  você  poderia  utilizar  o  termo 
“username” ou “usuário” ou ainda “user”. 

A tabela abaixo lista todos os parâmetros disponíveis para uso em uma string de 
conexão e lista também os apelidos disponíveis para cada parâmetro. 

Note  que  a  partir  da  versão  1.2,  a  SQL  LIB  novamente  inova,  possibilitando 
passar  os  parâmetros  dentro  da  string  de  conexão  utilizando  a  língua 
portuguesa , o que com certeza irá facilitar em muito a sua utilização. 

Parâmetro  Apelidos  Descr ição 


USERNAME  USUARIO, NOME,  Especifica  o  nome do usuário utilizado 
UID, USER, ID, 
para autenticação no servidor SQL. 
USER ID, USER 
NAME, NAME, 
LOGIN 

PASSWORD  SENHA, PWD,  Senha para autenticação. 


PASS, PASSWRD 

DATABASE  BASEDEDADOS,  Nome  do  banco  de  dados  ao  qual 


BASE DE DADOS,  desejamos nos conectar.
DADOS, BANCO DE 
DADOS, BANCO, 
DADOS, DTB, DB, 
DATA, BASE, 
PATH, DBQ 

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 12 


DRIVER  RDD, DRV, SQL,  Nome  do  driver  interno  da  SQL  LIB 
LIB 
que deve gerenciar esta conexão. 

HOST  SERVER,  Nome  do  computador  ou  IP  aonde  a 


SERVIDOR, 
conexão deve ser estabelecida. 
CONECTAR, IP, 
CONECTA, HST 

PORT  PORTA, PRT, EM  Número da porta que deve ser utilizada 


para  conexão.  Este  parâmetro  quando 
não  especificado,  utilizará  o  valor 
padrão do respectivo driver que a SQL 
LIB  irá  utilizar  para  gerenciar  a 
conexão. 
Nota:  Só  não  sei  ao  certo  explicar  por  que  alguns  parâmetros  possuem  tantos  apelidos,  mas 
acredito que não será por falta de uma nomenclatura apropriada que a conexão deixará de ser 
estabelecida. =D 

Além dos parâmetros passados acima, a SQL LIB aceita também um parâmetro 
adicional:  o  nome  do driver  desejado,  seguido do  IP  onde  a  conexão  deve  ser 
efetuada.  Este  parâmetro  quando  usado,  deve  ser  o  primeiro  a  ser  passado  na 
string de conexão, como mostra o exemplo abaixo: 
cConn := “PostgreSQL=192.168.0.1;usuario=postgres;”+; 
“senha=post;banco=Demos;” 
SQL CONNECT cConn INTO nPostSQL 

<nOutPutVar>  Especifica o nome de uma variável que irá receber o número da conexão atual, 
se bem sucedido ou zero em caso de erro. Caso a variável não exista, será criada 
com o valor de retorno. 

Se  a  conexão  for  efetuada  com  sucesso,  ela  torna­se  a  conexão  ativa.  Consulte  a  função 
SQLSETCONNECT() para maiores detalhes sobre o gerenciamento de conexões da SQL LIB. 

Eis um exemplo completo que efetua a conexão em 2 servidores diferentes e testa se a comunicação 
foi bem sucedida: 
#include 'sqllib.ch' 

REQUEST SQLLIB 
REQUEST MySQL 
REQUEST PostgreSQL 

function Main() 

cConn := "Driver=PostgreSQL;Servidor=192.168.0.1;” +; 
”usuario=postgres;senha=post;banco=Demos;" 

SQL CONNECT cConn INTO nPostSQL 

/* 
* Houve algum erro na conexao? 
*/ 
IF SQLErrorNO() > 0 
Alert( "Não foi possível conectar ao banco de dados !;"+; 
"Informe esta mensagem ao suporte : ;"+; 
SQLErrorMsg() ) 
Return( .F. ) 
ENDIF 

cConn := "Driver=MySQL;ip=192.168.0.1;usuario=root;banco=jose"

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 13 


SQL CONNECT cConn INTO nMySQL 

/* 
* Houve algum erro na conexao? 
*/ 
IF SQLErrorNO() > 0 
Alert( "Não foi possível conectar ao banco de dados !;"+; 
"Informe esta mensagem ao suporte : ;"+; 
SQLErrorMsg() ) 
Return( .F. ) 
ENDIF 

Este  é  um  recurso  muito  útil  quando  se  necessita  determinar  em  tempo  de  execução  as  configurações  do 
banco,  do  host  e  outros parâmetros necessários para  conexão,  pois  uma  string  utilizada  como  parâmetro 
desde comando é algo relativamente simples e pode ser armazenada em um arquivo .INI, em uma variável 
de ambiente para ser recuperada por GETENV() ou até mesmo em um simples DBF. 

Consulte também: 

SQL DISCONNECT 
SQLSETCONNECT() 

3. SQL DISCONNECT 
Fecha  uma  conexão  aberta  com  o  comando  SQL  CONNECT  ou  pelas  funções 
SQLCONNECT()/SQLCONNPARSE()  e grava quaisquer transações que ainda estiverem pendentes. Este 
comando é mapeado internamente para chamar SQLDISCONNECT(). 

Sintaxes: 

SQL DISCONNECT [FROM] <nHandle> 
SQL DISCONNECT [<ALL>] 

Onde: 

<nHandle>  Especifica o número da conexão que se deseja finalizar. 

<ALL>  Quando especificado, indica que todas as conexões abertas devem ser fechadas. 
Se omitido somente a conexão atual é fechada. 

Tenha sempre muito cuidado ao finalizar uma conexão, certifique­se de que nenhuma tabela está atualmente 
aberta e utilizando esta mesma conexão.  Pois  isto poderia gerar diversos erros no  seu aplicativo, além de 
instabilidade e GPFs. 

Consulte também: 

SQL CONNECT 

4. SQL EXECUTE 
Executa  um  comando  SQL  diretamente  no servidor e  retorna.  Esta  função  não deve  ser  utilizada 
para  enviar  comandos que retornem dados do servidor, utilize o comando USE SQL ou a função 
SQLARRAY() para esta finalidade. 

Sintaxes: 

SQL EXECUTE <cSQL> [INTO <nHandle>] [WITH [ARRAY] <aParms,...>] 

Onde:

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 14 


<cSQL>  Especifica o comando SQL que será executado no servidor. 

<nHandle>  Indica o número da conexão onde o comando SQL deve ser executado. 

<aParms>  É  um  lista  de  argumentos  utilizados  para  pré­processar  <cSQL>  utilizando  o 
PARSER interno da SQL LIB, antes de envia­lo ao servidor. 

Utilize  a  palavra­chave  WITH  ARRAY  caso  deseja  utilizar  um  ARRAY  ao 
invés de uma normal de lista de parâmetros. 

A  partir  da  versão  1.3  da  SQL  LIB  este  comando  não  gerará  nenhuma  mensagem  caso,  tenha 
ocorrido algum erro durante a execução de <cSQL>  junto ao servidor. Use o valor de retorno para 
testar  se  o  comando  foi  executado  com  sucesso  e  consulte  as  funções  SQLErrorMsg()  e 
SQLErrorNO() para obter a mensagem e o número do erro respectivamente da última falha. 

Exemplo 1 (sem parâmetros): 
cConn := "Driver=MySQL;ip=192.168.0.1;usuario=root;banco=test" 
SQL CONNECT cConn INTO nMySQL 

SQL EXECUTE “INSERT INTO CLIENTES(nome,salario) “+; 
“VALUES (‘José Matias’, 2500.00)“ 

Exemplo 2 (com lista de parâmetros): 
cConn := "Driver=MySQL;ip=192.168.0.1;usuario=root;banco=test" 
SQL CONNECT cConn INTO nMySQL 

SQL EXECUTE “INSERT INTO CLIENTES(nome,salario) VALUES ($1,$2)” ; 
WITH “Jose Matias”, 2500.00 

Exemplo 3 (utilizando parâmetros de um array): 
cConn := "Driver=MySQL;ip=192.168.0.1;usuario=root;banco=test" 
SQL CONNECT cConn INTO nMySQL 

SQL EXECUTE “INSERT INTO CLIENTES(nome,salario) VALUES ($1,$2)” ; 
WITH ARRAY { “Jose Matias”, 2500.00 } 

Consulte também: 
USE SQL 
SQLEXECUTE() 
SQLARRAY() 
SQLPARSER() 

5. SQL TRANSLATE PATH 
Especifica  o  tipo  de  conversão  a  ser  aplicada  no  PATH  dos  arquivos  passados  para  a  SQL  LIB. 
Nomes  de  arquivos  DBFs  e  de  índices  estão  sujeitos  à  alterações  por  esta  função  para  facilitar  a 
migração de softwares antigos. 

Sintaxes:

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 15 


SET TRANSLATE PATH TO <nMode> 
SQL TRANSLATE PATH TO <nMode> 

Onde: 

<nMode>  Especifica o tipo de conversão aplicada ao PATH de um arquivo. 

Para ilustrar a utilização deste comando, a tabela abaixo irá listar os possíveis 
valores para <nMode> e demonstrar o resultado que você obteria se utilizasse o 
comando USE C:\PROGRAMA\ARQUIVOS\DBF\ESTOQUE.DBF, veja como a SQL 
LIB irá interpretar esta valor, dependendo de SET TRANSLATE: 

Valor   Descrição e exemplo 
tpFileName  Retorna  apenas  o  nome  do  arquivo  sem  extensão.  No 
comando USE acima, resultaria em "ESTOQUE", este 
é o valor padrão da SQL LIB. 

tpFullPath  Retorna o path do arquivo processado mas sem 


extensão. No comando USE acima, seria o mesmo que 
“PROGRAMA_ARQUIVOS_DBF_ESTOQUE”. 

tpFullName  Resulta no nome do arquivo sem path, mas com 
extensão. No exemplo acima, seria o mesmo que 
“ESTOQUE_DBF”. 

tpFullNamePath  Retorna o path do arquivo completo e com extensão. 


No exemplo do comando use resultaria em 
“PROGRAMA_ARQUIVOS_DBF_ESTOQUE_DBF” 

Consulte também: 
SQL TRANSLATE CASE 
SQLParse() 

6. SQL TRANSLATE CASE 
Especifica  o  tipo de conversão  a  ser  aplicada  no  NOME  dos  arquivos passados  para  a  SQL  LIB. 
Nomes  de  arquivos  DBFs  e  de  índices  estão  sujeitos  à  alterações  por  esta  função  para  facilitar  a 
migração de softwares antigos. 

Esta  função  determina  o  tipo  de  conversão  (no  caso  de  maiúsculas  ou  minúsculas)  que  deve  ser 
aplicada aos os nomes de arquivos passados para comandos como USE ou SET INDEX. Isto ajuda a 
converter  todo  o  sistema  utilizando­se  um  único  comando,  para  o  caso  de  haver  vários  módulos 
PRGs, com comandos utilizando nomes de arquivos com caixa alta, baixa ou mista. 

Por exemplo, caso o servidor seja LINUX e os nomes das tabelas estiverem em letras maiúsculas, o 
servidor  pode  gerar  um  erro,  dizendo  que  determinada  tabela  não  existe,  se  o  nome  do  arquivo 
passado não coincidir – exatamente com o nome existente. 

Sintaxes: 
SET TRANSLATE CASE TO <nMode> 
SQL TRANSLATE CASE TO <nMode> 

Onde:

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 16 


<nMode>  Especifica o tipo de conversão aplicada ao NOME de um arquivo. 

A tabela lista todos os possíveis valores para <nMode>: 

Valor   Descr ição e exemplo 


tcNone  Não efetua conversão alguma ou seja, o nome 
digitado é processado do modo como é digitado. 

Este é o padrão da SQL LIB. 

tcUpperCase  Converte todos os caracteres para letras maiúsculas. 

tcLowerCase  Converte todos os caracteres passados para letras 
minúsculas. 

Consulte também: 
SQL TRANSLATE PATH 
SQLParse() 

7. SQL CUSTOM INDEXES 
Indica se a SQL LIB deve permitir ou não o uso de índices customizados. 

Sintaxe: 

SET CUSTOM INDEXES <ON,OFF> 
SQL CUSTOM INDEXES <ON,OFF> 

Onde: 

<ON>  Permite que sejam criados índices customizados quando necessário. 
<OFF>  Indica que apenas o uso de índices simples é permitido. 

O valor padrão para este comando é OFF, para se manter a compatibilidade com versões anteriores 
da  SQL  LIB.  Caso  deseje  utilizar  índices  customizados,  você  deve  ativar  esta  opção  com  SET 
CUSTOM INDEXES ON. 

Consulte o apêndice A para obter maiores informações detalhadas sobre como trabalhar com índices 
na SQL LIB. 

Exemplo: 
demos\index.prg 

8. SQL PACKETSIZE 
Especifica a quantidade de registros que devem ser lidos do servidor sempre que necessário. O valor 
padrão da SQL LIB é trazer 50 registros por vez. 

Sintaxe: 

SQL PACKETSIZE [TO] <x>

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 17 


SET PACKETSIZE [TO] <x> 
Onde: 

<x>  Representa um número maior que 2 e de preferência  menor que 1000. 

A  SQL  LIB  possui  um  mecanismo  de  paginação  que  puxa  do  servidor  apenas  os  registros 
necessários, mesmo que a tabela tenha milhares de registros. Isto assegura um melhor desempenho 
via rede e garante que a quantidade de memória RAM disponível no seu sistema seja suficiente para 
execução do seu software. 

Este comando não afeta as tabelas já se encontram abertas no sistema, nem se aplica à tabelas abertas 
com o comando USE SQL. Para tabelas que já foram abertas com o comando USE ­ não com o comando 
USE SQL ­ utilize o comando SQL CURRENT PACKETSIZE. 

Exemplo:
SET PACKETSIZE TO 25  /* Lê 25 registros por vez */ 
USE c:\test\table.dbf NEW VIA 'PGSQL' 

Consulte também: 
SQL CURRENT PACKETSIZE 
SQLPACKETSIZE() 

9. SQL CURRENT PACKETSIZE 
Altera o PACKETSIZE de um arquivo já aberto no sistema, estando ele no ALIAS() atual. 

Sintaxe: 

SQL CURRENT PACKETSIZE [TO] <x> 
SET CURRENT PACKETSIZE [TO] <x> 

Onde: 

<x>  Representa um número maior que 2 e de preferência  menor que 1000. 

Exemplo:
SET PACKETSIZE TO 25  /* Lê 25 registros por vez */ 
USE c:\test\table.dbf NEW VIA 'PGSQL' 

SET CURRENT PACKETSIZE TO 50  /* Define que deve ler 50 por vez */ 

Consulte também: 
SQL PACKETSIZE 
SQLPACKETSIZE() 

10.  SQL FULLDELETE 
Determina se um registro deve ser realmente deletado da tabela ou apenas marcado para remoção. O 
padrão da SQL LIB para este comando é OFF. 

Sintaxe: 

SQL FULLDELETE <ON,OFF>

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 18 


Onde: 

<ON>  Faz  com  que  o  registro  seja  realmente  deletado  e  suas  informações  sejam 
descartadas do banco de dados. O comando RECALL não poderá ser utilizado 
para recuperar estes dados posteriormente. 
<OFF>  Apenas marca o registro como deletado, mas o registro continua a permanecer 
na tabela até que um RECALL seja dado ou ele seja completamente removido 
pelo comando PACK. 

Consulte também: 

SQL_FULLDELETE() 

11.  SQL FILTER 
Define um filtro para a tabela atual, que deverá ser processado no lado do servidor. O uso deste tipo 
de índice é mais recomendado do que o uso de SET FILTER. 

Sintaxe: 

SQL FILTER TO [<cSQLFilter>] 

Onde: 

<cSQLFilter>  É a expressão que definirá o filtro ativo para a tabela atual. Se uma string vazia 
“” for passada como parâmetro, o filtro atual será removido. 

Se somente SQL FILTER TO  for especificado sem expressão nenhuma, o filtro atual será removido. 

Exemplo: 
demos\filtros.prg 

Consulte também: 

SQLFILTER() 

12.  COPY TABLE 
Copia o conteúdo de uma tabela existente para uma nova tabela via SQL. 

Sintaxe: 

COPY TABLE <origem> TO <destino> 
Onde: 

<origem>  É o nome da tabela atual, existente no servidor. 

<destino>  Especifica  o  nome  da  nova  tabela  que  será  criada  com  base  nos  dados  e  na 
estrutura da tabela original. 

Nota importante: esta função copia apenas a estrutura e os dados para a nova tabela – não incluindo 


triggers, views e outros objetos vinculados à tabela original.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 19 


Consulte também: 

RENAME TABLE 
DELETE TABLE 

13.  DELETE TABLE 
Apaga uma  tabela  existente  no  servidor  SQL,  eliminando  todos os  dados  e  a  própria  estrutura da 
tabela. 

Sintaxes: 

DELETE TABLE <tabela> 
DROP  TABLE <tabela> 

Onde: 

<tabela>  É o nome da tabela que será removida do servidor. 

Atenção: Este comando não está sujeito a um ROLLBACK. 

Consulte também: 

DELETE INDEX 
RENAME TABLE 
COPY TABLE 

14.  DELETE INDEX 
Deleta um ou mais índices do banco de dados. 

Sintaxe: 

DELETE INDEX <index> 
DROP  INDEX <index> 

Onde: 

<index>  É  o  nome  do  índice  que  se  deseja  excluir  do  servidor.  Você  pode  utilizar  um 
asterisco "*" como curinga para excluir mais de um índice com este comando. 

Atenção: Este comando não está sujeito a um ROLLBACK. 

Consulte também: 
DELETE TABLE 

15.  RENAME TABLE 
Altera o nome de uma tabela existente no servidor. 

Sintaxe:

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 20 


RENAME TABLE <tabela> TO <novo_nome> 

Onde: 

<tabela>  É o nome atual da tabela existente no servidor 

<novo_nome>  É o novo nome que será  dado à tabela. 

Consulte também: 
RENAME INDEX 

16.  RENAME INDEX 
Renomeia um índice existente no servidor para outro nome. 

Sintaxe: 

RENAME INDEX <indice> TO <novo_nome> 

Onde: 

<indice>  É o nome atual do índice existente no servidor 

<novo_nome>  É o novo nome que será  dado à este índice. 

Consulte também: 
RENAME TABLE 

17.  START TRANSACTION 
Inicia  uma  nova  transação  em  todas  as  conexões  atualmente  abertas e  incrementa  o  contador  de 
transações em +1. Este comando possui outros apelidos conforme exibido na sintaxe abaixo: 

Sintaxes: 

START TRANSACTION 
BEGIN TRANSACTION 
TRANSACTION START 

O comando START TRANSACTION inicia um novo bloco de transação no servidor SQL. Todos 
os comandos que forem executados dentro deste bloco, então deverão ser gravados com  COMMIT ou 
descartados com o comando ROLLBACK. 

Embora  a  função  SQL_TRANSCOUNT()  retorne  a  quantidade  de  transações  abertas  até  o 


momento, transações aninhadas não são suportadas pela SQL LIB. 

É  importante  mencionar  neste  ponto,  que  alguns  comandos  e  instruções  SQL  não  podem  ser 
desfeitos. Isto ocorre por que não se poder efetuar um ROLLBACK de algumas instruções SQL. Em 
geral,  estas  incluem  instruções  DDL  (data  definition  language),  como  aquelas  que  criam  ou 
removem banco de dados, ou aquelas que criam, apagam ou alteram tabelas.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 21 


Você  pode  desejar  projetar  as  suas  transações  para  não  incluir  estas  instruções.  Se  você  executar 
uma instrução da qual não se pode fazer ROLLBACK em uma transação, e então outra instruções 
falhar  posteriormente,  o  efeito  total  da  transação  não  pode  ser  desfeito  usando  uma  instrução 
ROLLBACK. 

Os  seguintes  comandos  finalizam  uma  transação  implicitamente  (como  se  você  tivesse  feito  um 
COMMIT  depois de executar o comando): 

Comando  Comando  Comando 


ALTER TABLE  BEGIN  CREATE INDEX 
DROP DATABASE  DROP INDEX  DROP TABLE 
LOAD MASTER DATA  LOCK TABLES  RENAME TABLE 
SET AUTOCOMMIT=1  START TRANSACTION  TRUNCATE 

Exemplo:

SELECT TEST 

* Este comando inicia uma transação SQL. 

BEGIN TRANSACTION 

WHILE !Eof() 

SELECT TESTSQL 
APPEND BLANK 

REPLACE COD    WITH TEST­>COD 
REPLACE NOME   WITH TEST­>NOME 
REPLACE ANIV   WITH TEST­>ANIV 
REPLACE BLOQ   WITH TEST­>BLOQ 
REPLACE LIMC   WITH TEST­>LIMC 
REPLACE ULTC   WITH TEST­>ULTC 
REPLACE ATIV   WITH TEST­>ATIV 

SELECT TEST 
SKIP 
End 


* Grava os dados e termina a transação. 

END TRANSACTION 

Outros Exemplos: 

demos\simples.prg 
demos\AppendFrom.prg 

Consulte também: 
END TRANSACTION 
COMMIT TRANSACTION 
ROLLBACK TRANSACTION 
SQL_TRANSCOUNT() 

18.  END TRANSACTION

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 22 


Finaliza  um  bloco  de  transação  aberto  com  START  TRANSACTION,  envia  um  COMMIT  das 
alterações pendentes (se houver) e decrementa o contador de transações ativas em ­1. 

Sintaxe: 

END TRANSACTION 

Este comando antes de finalizar  a transação, envia um COMMIT TRANSACTION  explícito para evitar a 


perca de dados. Por isto, caso deseje cancelar uma transação, envie um ROLLBACK antes de 
finalizar a transação com END TRANSACTION. 

Consulte também: 
COMMIT TRANSACTION 
ROLLBACK TRANSACTION 
BEGIN TRANSACTION 

19.  COMMIT TRANSACTION 
Grava todas as alterações feitas dentro de um bloco de transações, mas não a finaliza. 

Sintaxes: 

COMMIT TRANSACTION 
SQL COMMIT 

Consulte também: 
ROLLBACK TRANSACTION 
BEGIN TRANSACTION 
END TRANSACTION 

20.  ROLLBACK TRANSACTION 
Descarta todas as alterações efetuadas no bloco de transação atual em todas as tabelas envolvidas, 
mas não finaliza o bloco de transações. 

Sintaxe: 

ROLLBACK TRANSACTION 
SQL ROLLBACK 

Ao se efetuar um ROLLBACK num bloco de transação, todas as tabelas envolvidas nesta operação 
terão os seus registros atualizados com GOTO RECNO(), para se certificar de que os dados atuais 
são os mais recentes do banco de dados. 

Consulte também: 
BEGIN TRANSACTION 
COMMIT TRANSACTION 

21.  CLEAR INDEXES

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 23 


Limpa todos os índices anexados à tabela atual ou à uma outra tabela específica no servidor. 

Sintaxe: 

CLEAR INDEXES [FOR  <table>] 
CLEAR INDEXES [FROM <table>] 

Onde: 

<table>  É  o  nome  da  tabela  cujo  os  índices  devem  ser  deletados.  Caso  seja  omitido, 
todos os índices da tabela atual serão deletados. 

Quando  se  indexa  um  campo  utilizando­se  a  SQL  LIB,  as  informações  sobre  aquele  índice  tais 
como  tamanho,  expressão  da  chave,  flag  indicando  se  ele  é  um  índice  composto  e  muitas  outras 
informações são gravadas numa tabela de sistema chamada SQL$INDEXES. 

Em alguns casos, as informações nesta tabela podem não ser mais úteis – como por exemplo, 
quando vamos reindexar a tabela atual. Desde modo você deve chamar CLEAR INDEXES, para 
garantir que todas as informações no sistema são consistentes. 

Consulte também: 
DELETE INDEX 

22.  SELECT SCHEMA 
Informa  em  qual  SCHEMA  deve  ser  utilizado  para  procura  e  acesso  as  tabelas  no  servidor  ou 
opcionalmente informa em qual SCHEMA estão armazenados as tabelas de sistema da SQL LIB. 

Sintaxes: 

SELECT SCHEMA <cSchemaName> 
SELECT SYSTEM SCHEMA <cSchemaName> 
Onde: 

<cSchemaName>  É o nome do SCHEMA que deve ser configurado para pesquisa no servidor. 

O suporte à SCHEMAs não é característica de todos os servidores. No momento em que este 
documento estava sendo redigido, o MySQL não possuía ainda esta característica (versão atual 
5.0.18). 

Já com PostgreSQL este comando é muito útil, pois muda o SCHEMA ativo. Você pode obter o 
nome do SCHEMA atual apenas chamando a função SQLSCHEMA() sem parâmetros. 

Note  que  temos  dois  comandos  para  manipulação  de  SCHEMAS,  a  primeira  sintaxa  é  para  a 
TABELA  individualmente  aberta  com  USE.  A  segunda  função  é  utilizada  pela  SQL  LIB  para 
acessar as tabelas do sistema, tais como SQL$INDEXES e outras que possam surgir. 

O comando USE SQL e a função SQLARRAY() não são afetados por esta função, pois nestes casos 
o comando SQL deve ser passado já no formato final para execução. 

Exemplo: 

cConn := "PostgreSQL=192.168.0.1;usuario=post;senha=post;banco=Demos" 
SQL CONNECT cConn INTO nPostSQL

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 24 


SELECT SCHEMA public 
USE vendedores NEW VIA “PGSQL”  // Abre a tabela “public”.”vendedores” 

SELECT SCHEMA vendas 
USE pedidos NEW VIA “PGSQL”  // Abre a tabela “vendas”.”pedidos” 

Consulte também: 

SQLSCHEMA() 
SQLSYSTEMSCHEMA() 

23.  USE 
O comando USE por padrão no Clipper e por extensão no Harbour/xHarbour, abre um arquivo DBF 
na área atual e opcionalmente os  seu índices. Com a SQL LIB  este comando mantém  sua sintaxe 
original,  mas  agora  é  importante (especialmente  para o  Clippeiros)  a  atenção  à  alguns  parametros 
opcionais do comando USE. 

Sua sintaxe padrão no Clipper 5.3 é: 

USE <(db)> 
[VIA <rdd>] 
[ALIAS <a>] 
[<new: NEW>] 
[<ex: EXCLUSIVE>] 
[<sh: SHARED>] 
[INDEX <(index1)> [, <(indexn)>]] 

O ponto em destaque que queremos dar aqui é para o parâmetro VIA. Esta cláusula identifica para a 
RTL (run­time library) do compilador, sobre qual é o nome do RDD que você deseja utilizar para 
gerenciar não somente a abertura deste arquivo, mas também seus comandos de leitura e gravação. 

Sendo assim, sempre que formos utilizar a  SQL LIB para abrir uma tabela no servidor precisamos 
informar  o  nome  do  RDD  valor  na  clausula  VIA,  indicando  o  driver  que  irá  manipular  estas 
informações para nós. Veja dois exemplos abaixo: 

use c:\test\table.dbf alias TestSQL new via ‘MySQL’ 
use test.dbf alias Test via ‘PGSQL’ new 

Nos  exemplos  acima,  indicamos  no  primeiro  caso  que  deve­se  utilizar  a  SQLLIB  para  abrir  o 
arquivo, utilizando­se o driver para MySQL e no segundo usamos o driver para PostgreSQL. 

Neste  ponto  a  mágica  da  SQL  LIB  começa  a  funcionar.  O  ponto  de  maior  dificuldade  e 
compreensão imediata  para os  novos,  é que  a  SQL  LIB  não  vai procurar  um  arquivo  no  seu  HD 
chamado c:\test\table.dbf  conforme especificado na linha de comando. 

Ao invés disto, a SQL LIB checa se existe uma conexão ativa para um servidor MySQL. Se houver, 
ela vai buscar por uma tabela  neste servidor. O nome da tabela pode mudar conforme os valores dos 
comandos SET TRANSLATE PATH e SQL TRANSLATE CASE. 

O mesmo ocorre com o segundo exemplo, porém desta vez, o driver utilizado é o do PostgreSQL. A 
tabela abaixo lista os nomes dos RDDs introduzidos pela SQL LIB e mostra a qual servidor se cada 
um ser aplicam: 

RDD  Servidor  Supor tado 


MySQL  MySQL, versão 4.1.7 ou superior.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 25 


PGSQL  PostgreSQL versão 8.0 ou superior. 

Podemos  evitar  o  trabalho  de  especificar  a  cláusula  VIA  seguida  do  nome  de  um  RDD  em  cada 
comando USE que formos executar. O segredo para isto é que se VIA for omitido, o valor padrão 
para esta cláusula é o nome do RDD que estiver definido em RDDSETDEFAULT(). 

Por padrão o driver inicial é definido como DBFNTX, mas podemos alterá­lo à nosso favor – eis um 


exemplo completo e comentado: 

? 'TestRDD ­ on ' + SQLVersion() + ' & ' + Version() 

/* 
* Utilizamos este commando para se conectar ao servidor SQL via TCP/IP 
*/ 

SQL CONNECT ON       'localhost';      // Nome da estação ou IP 
PORT     3306;          // Numero da porta 
DATABASE 'test'; 
USER     'root'; 
PASSWORD '' ; 
OPTIONS  SQL_NO_WARNING ; 
LIB      'MySQL' 
/* 
* Houve algum erro na conexao? 
*/ 
IF SQLErrorNO() > 0 
Alert( "Não foi possível conectar ao banco de dados !;"+; 
"Informe esta mensagem ao suporte : ;;"+; 
SQLErrorMsg() ) 
QUIT 
ENDIF 

/* 
* Aqui abrimos o arquivo .DBF local, veja que não especificamos 
* a clausula VIA, forçando ele a abrir o padrão. 
*/ 
USE test.dbf ALIAS Test  NEW 
Struct := dbStruct() 
CLOSE ALL 

/* 
* O comando a seguir, diz que todos os arquivos abertos com 
* USE, COPY ou qualquer comando de manipulação de dados, deve 
* usar o driver para MySQL da SQL LIB: 
*/ 
rddSetDefault(“mysql”) 
/* 
* Agora vamos CRIAR uma tabela no servidor MySQL com a mesma 
* estrutura do arquivo .DBF local: 
*/ 
dbCreate( 'test_table.dbf', Struct ) 

/* 
* Abre o arquivo remotamente via MySQL, pois agora o padrão para VIA 
* se não especificado é “MySQL”. 
*/ 
USE test_table ALIAS TestSQL NEW 
/* 
* Agora abrimos o aquivo .DBF localmente e precisamos abri­lo como 
* DBF explicitamente, pois mudamos o valor de RDDSETDEFAULT() 
*/ 
USE test.dbf ALIAS Test  NEW VIA ‘DBFNTX’ // ou ‘DBFCDX’ se preferir 
...

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 26 


Sendo assim com poucos ajustes, é possível migrar um sistema inteiro para SQL. Desde que 
façamos um bom uso das rotinas adequadas da SQL LIB. 

Consulte também: 
SET TRANSLATE PATH 
SQL TRANSLATE CASE 
USE SQL 

24.  USE SQL / USE AS 
Executa um comando SQL no servidor e obtém o resultado da consulta abrindo­o como um tabela 
somente para leitura. 

Sintaxe recomendada : 

USE SQL <(SQL)> 
[VIA <rdd>] 
[ALIAS <a>] 
[INTO <conn>] 
[NEW] 
[EXCLUSIVE] 
[SHARED] 
[READONLY] 

Sintaxe alternativa: 
USE <(db)> 
AS <SQL> 
[INTO <conn>] 
[VIA <rdd>] 
[ALIAS <a>] 
[NEW] 
[SHARED] 
[EXCLUSIVE] 
[READONLY] 
[C1LOGICAL] 
[OVERWRITE] 
[RECISION <p>] 
[SCROLLABLE] 
[PERMANENT] 

Onde a maioria dos parâmetros mantém a forma tradicional do comando USE, exceto por alguns 
novos: 

<cSQL>  É o comando SQL a ser executado no servidor 

<conn>  É  o  numero  da  conexão  específica  para  utilizada  para  enviar  o  comando  SQL 
para o servidor 

<rdd>  É o nome do RDD que irá o retorno deste comando SQL. Consulte o comando 
USE para obter uma tabela com todos os nomes de RDDs disponíveis. 

O comando USE SQL é importante para executar comandos no lado do servidor que retornem dados 
específicos, por exemplo: dados para um relatório, uma lista de usuários conectados ou obter o valor 
de retorno de uma Stored Procedure.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 27 


Nota importante: Desde a versão 1.4 da SQL LIB RDD, as colunas SQL_ROWID e 
SQL_DELETED se tornam visíveis dentro e um USE SQL ou SQLARRAY() e deste 
modo podem ser consultadas como qualquer outro campo normal da tabela. 

Ele difere do comando SQL EXECUTE pois pode processar os valores de retorno do comando SQL 


e diferentemente de SQLARRAY(), este comando abre o resultado do comando como um ALIAS() 
válido. 

Exemplo: 
cSQL := "show full columns from test_table" 

* Abre o comando e puxa os dados como somente­leitura 
USE SQL (cSQL) ALIAS Temp VIA ‘MySQL’ 

/* 
* Exibimos os dados do resultado atualizados num DBEDIT 
*/ 
cls 
SET COLOR TO W+/B 
@ 5,02 to 24,77 doub 

DBEdit(6,3,23,76) 

Consulte também: 

DEMOS\USE_SQL1.PRG 
DEMOS\USE_SQL2.PRG 
SQLARRAY()

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 28 


IV­FUNÇÕES 
A SQL LIB  é composta por uma grande  variedade de funções, que realizam diversas tarefas tanto do 
lado  do  servidor  SQL,  como  no  lado  do  cliente.  Esta  seção  irá  descrever  as  funções  disponíveis  e 
algumas  funções  interessantes  da  API  de  baixo  nível  da  SQL  LIB,  lembrando  que  as  constantes 
utilizadas por estas funções estão listadas no arquivo SQLLIB.CH que acompanha a instalação. 

1. SQLPARSESTYLE() 
Retorna e opcionalmente altera o tipo de conversão a ser aplicada no PATH dos arquivos passados 
para  a  SQL  LIB.  O  comando  SQL  TRANSLATE  PATH  é  mapeado  internamente  como  uma 
chamada à esta função. 

Sintaxe: 

SQLParseStyle( [<nStyle>] ) ­­> nOldStyle 

Onde: 

<nStyle>  É  o parâmetro opcional  que  identifica  o  novo  estilo  a  ser  aplicado  nas  futuras 
conversões efetuadas pela SQL LIB. 

<nOldStyle>  É o valor atual de SQLPARSESTYLE() 

Para obter uma lista completa dos  valores para <nStyle>,  verifique  a referência  ao  comando SQL 


TRANSLATE PATH neste guia. 

Exemplo: 

SQLParseStyle( tpFullNamePath ) 

Consulte também: 
SQL TRANSLATE PATH 

2. SQLPARSECASE() 
Retorna  e  opcionalmente  altera  o  tipo  de  conversão  a  ser  aplicada  aos  NOMES  dos  arquivos 
passados  para  a  SQL  LIB.  O  comando  SQL TRANSLATE  CASE  é  mapeado  internamente  como 
uma chamada à esta função. 

Sintaxe: 

SQLParseCase( nStyle ) ­­> nOldStyle 

Onde: 

<nStyle>  É  o parâmetro opcional  que  identifica  o  novo  estilo  a  ser  aplicado  nas  futuras 
conversões efetuadas pela SQL LIB. 

<nOldStyle>  É o valor atual de SQLPARSECASE() 

Para obter uma lista completa dos valores para <nStyle> e uma explicação mais detalhada, verifique 
a referência ao comando SQL TRANSLATE CASE neste guia.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 29 


Exemplo: 

SQLParseCase( tcLowerCase ) 

Consulte também: 
SQL TRANSLATE CASE 

3. SQLPARSE() 
Converte o nome de arquivo passado como argumento, aplicando as configurações definidas pelas 
funções SQLPARSESTYLE e SQLPARSECASE. 

Sintaxe: 

SQLParse( <cFileName>, [<nStyle>] ) ­­> cResult 

Onde: 

<cFileName>  É a string contendo o nome do arquivo a ser convertido. 

<nStyle>  É um parâmetro opcional que indica o tipo de conversão a ser aplicada. Se não 
for especificado o valor de SQLPARSESTYLE() será assumido como padrão. 

<cResult>  É o nome do arquivo especificado em <cFileName> convertido e formatado. 

Exemplo: 

#include 'sqllib.ch' 

arq = ‘C:\PROGRAMA\NETPLUS\DBF\NETEST.DBF’ 

/* 
* Poderíamos utilizar o comando SQL TRANSLATE PATH/CASE, mas vamos 
* passar o segundo parâmetro para ilustrar como funciona. 
*/ 
? SQLPARSE( arq, tpFileName  ) // => NETEST (padrão da SQL LIB) 
? SQLPARSE( arq, tpFullName     ) // => NETEST_DBF 
? SQLPARSE( arq, tpFullPath     ) // => PROGRAMA_NETPLUS_DBF_NETEST 
? SQLPARSE( arq, tpFullNamePath ) // => PROGRAMA_NETPLUS_DBF_NETEST_DBF 

quit 

Consulte também: 
SQLPARSESTYLE() 
SQLPARSECASE() 

4. SQLCONNECT() 
Estabiliza uma conexão à um servidor SQL suportado pela SQL LIB e retorna o número da conexão 
se bem sucedido ou zero em caso de erro. 

Sintaxe:

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 30 


SQLConnect( <cHost>, [<cPort>], [<cDb>], [<cUser>], 
<cPwd>, [<nFlags>], <cRddName> ) ­­> nHandle 

Onde: 

<cHost>  É o nome do computador ou IP ao qual deve ser estabelecida a conexão. 

<cPort>  Número da porta para comunicação com o servidor, este parâmetro é opcional e 


se não for especificado o padrão do banco será assumido. 

<cDb>  É  o  nome do  Database  ao qual  devemos  nos  conectar.  Alguns  drivers  como o 
MySQL  suportam  que  este  parâmetro  seja  omitido,  já  para  PostgreSQL  é 
obrigatório. 

<cUser>  Nome do usuário para autenticação. 

<cPwd>  Senha do usuário para autenticação. 

<nFlags>  É um valor opcional que pode alterar o modo de comportamento da conexão em 
caso de erro. 

<cRddName>  Identifica o nome do driver que você deseja utilizar para efetuar esta conexão. 

<nHandle>  É o numero do handle desta conexão se bem sucedido ou zero indicando erro. 

Para  uma  lista  completa  de  valores  para  o  parâmetro  <nFlags>  e  também  para  <cRddName>, 
consulte o comando  SQL CONNECT ON  neste  guia. Se a conexão for estabelecida com sucesso, 
esta se tornará a conexão ativa. 

Exemplo: 

#include 'sqllib.ch' 

SQLConnect( ‘localhost’, 3306, ‘test’, ‘root’, ‘’,; 
SQL_NO_WARNING, ‘MySQL’ ) 

/* 
* Houve algum erro na conexao? 
*/ 
IF SQLErrorNO() > 0 
Alert( "Não foi possível conectar ao banco de dados !;"+; 
"Informe esta mensagem ao suporte : ;"+; 
SQLErrorMsg() ) 
Return( .F. ) 
ENDIF 

Consulte também: 
SQL CONNECT ON 
SQLSETCONNECT() 

5. SQLCONNPARSE() 
Estabiliza uma  conexão  à  um  servidor  SQL utilizando  os  parâmetros  passados  por  uma string de 
conexão e retorna um número maior que zero se bem sucedido ou zero em caso de erro. 

Sintaxe:

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 31 


SQLConnParse( <cConnString> ) ­­> nHandle 

Onde: 

<cConnString>  Representa  a  string  de  conexão  contendo  os  parâmetros  necessários  para 
conectar­se  ao  servidor,  bem  como  o  nome  do  próprio  driver  RDD  utilizado 
para gerenciar esta conexão. 

<nHandle>  É o numero desta conexão se bem sucedido ou zero indicando erro. 

Esta função não gera nenhum erro ou mensagem de alerta em caso de falha, se a comunicação for 
estabelecida  com  sucesso  ela  se  tornará  a  conexão  ativa.  Consulte  SQLERRORNO()  ou 
SQLERRORMSG()  para  obter  detalhes  sobre  o  último  erro  ocorrido  e  também  a  função 
SQLSETCONNECT() para maiores detalhes sobre o gerenciamento de conexões da SQL LIB. 

Para uma consideração detalhada sobre quais parâmetros são permitidos dentro de <cConnString>, 
consulte  a  explanação  pormenorizada  do  comando  SQL  CONNECT  (com  Strings  de  Conexão) 
neste guia. 

Exemplo: 

cConn := "Driver=MySQL;ip=192.168.0.1;usuario=root;banco=jose" 
nConn := SQLConnParse( cConn ) 

/* 
* Houve algum erro na conexao? 
*/ 
IF SQLErrorNO() > 0 
Alert( "Não foi possível conectar ao banco de dados !;"+; 
"Informe esta mensagem ao suporte : ;"+; 
SQLErrorMsg() ) 
Return( .F. ) 
ENDIF 

Consulte também: 
SQL CONNECT (com Strings de Conexão) 
SQLSETCONNECT() 

6. SQLDISCONNECT() 
Fecha  uma  conexão  aberta  com  o  comando  SQL  CONNECT  ou  pelas  funções  SQLCONNECT()  e 
SQLCONNPARSE()  e  grava  quaisquer  transações  que  ainda  estiverem  pendentes.  O  comando  SQL 
DISCONNECT é mapeado para esta função. 

Sintaxes: 

SQLDisconnect( [<nHandle>] )  ­­> lSuccess 
SQLDisconnect( [<lAll>] )  ­­> lSuccess 

Onde: 

<nHandle>  Especifica  o  número da  conexão que  se  deseja  finalizar,  se  omitido  a conexão 
atual será fechada.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 32 


<lAll>  Se  um  valor  lógico  for  passado  como  parâmetro,  SQLDISCONNECT  fechará 
todas as conexões abertas se <lAll> for verdadeira. 

lSuccess  É  um  valor  lógico,  indicando  se  a  conexão  ou  conexões  foram  fechadas  com 
sucesso. 

Não  é  necessário  finalizar  todas  as  conexões  por  ocasião  da  saída  do  seu  aplicativo.  A  SQL  LIB 
finaliza automaticamente e envia um COMMIT à todas as conexões abertas. 

Exemplo: 

Close all 
SQLDisconnect( .T. ) 
quit 

Consulte também: 
SQLCONNECT() 

7. SQLGETCONNECTION() 
Retorna o HANDLE da conexão atual em uso pela SQL LIB ou pesquisa por uma conexão válida 
para  o  RDD  solicitado.  Esta  função  possui  outros  nomes  como  SQLGETCONNECT()  e 
SQLGETCONN(). 

Sintaxe: 

SQLGETCONNECTION( [<cRddName>] ) ­­> nHandle 

Onde: 

<cRddName>  É  uma  string  que  identifica  o  nome  do  RDD  a  ser  pesquisado  na  tabela  de 
conexões. 

nHandle  É o número da conexão ou zero se nada semelhante for encontrado. 

Se  <cRddName>  for omitido,  esta  função  retorna  o  número da conexão  atualmente  em  uso. Caso 
contrário, ela pesquisa dentro de todas as conexões já estabelecidas e registradas internamente pela 
SQL LIB, procurando a primeira conexão bem sucedida para o driver solicitado. 

Exemplo: 

#include 'sqllib.ch' 

cConn := "Driver=PostgreSQL;Servidor=192.168.0.1;”+; 
"usuario=postgres;senha=post;banco=Demos;porta=5432" 

SQL CONNECT cConn INTO nPostSQL 

cConn := "Driver=MySQL;ip=192.168.0.1;usuario=root;banco=jose" 

SQL CONNECT cConn INTO nMySQL 

/* 
* O comando SQL CONNECT, efetua uma conexão e registra­a como ativa. 
* Sendo assim, o comando abaixo retornará o valor de nMySQL: 
*/

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 33 


? SQLGETCONNECTION()  // Retorna o mesmo valor de nMySQL 
? SQLGETCONNECTION( "POSTGRESQL" ) // Retorna o mesmo valor de nPostSQL 
? SQLGETCONNECTION( "MYSQL" )      // Retorna o mesmo valor de nMySQL 

Consulte também: 
SQLSETCONNECTION() 
SQLGETCONNECTIONS() 

8. SQLSETCONNECTION() 
Altera o número da conexão atualmente em uso pela SQL LIB. Esta função possui outros nomes 
como SQLSETCONNECT() e SQLSETCONN(). 

Sintaxe: 

SQLSETCONNECTION( <nHandle> ) ­­> lSuccess 

Onde: 

<nHandle>  É o número da nova conexão que deverá ser definida como ativa. 


lSuccess  É um valor de retorno lógico indicando se a alteração foi efetuada com sucesso. 

Exemplo: 

/* 
* Neste exemplo iremos estabelecer duas conexões e demonstrar o uso 
* da função SQLSETCONNECTION(): 
*/ 

cConn := "Driver=PostgreSQL;Servidor=192.168.0.1; "+; 
"usuario=postgres;senha=post;banco=Demos;porta=5432" 

SQL CONNECT cConn INTO nPostSQL 

cConn := "Driver=MySQL;ip=192.168.0.1;usuario=root;banco=jose" 

SQL CONNECT cConn INTO nMySQL 

/* 
* Abrimos o arquivo utilizando a conexão atual (que foi a ultima 
* ser efetuada neste caso) 
*/ 
USE estoque NEW VIA “MySQL” 

/* 
* Agora iremos selecionar a conexão do PostgreSQL e abrir uma 
* tabela nesta conexão. 
*/ 
SQLSETCONNECTION( nPostSQL ) 

USE clientes NEW VIA “PGSQL” 
.... 

Consulte também: 
SQLGETCONNECTION()

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 34 


9. SQLGETCONNECTIONS() 
Retorna um ARRAY contendo informações sobre todas as conexões ativas registradas pela SQL 
LIB. 

Sintaxe: 

SQLGetConnections() ­> aResult 

Onde: 

<aResult>  É  um  array  multidimensional  contendo  informações  sobre  as  conexões  ativas 
registradas pela SQL LIB. 

O arquivo SQLLIB.CH define as seguintes constantes para o array retornado por esta função: 

Constante  Descrição 
SQL_CONN_HANDLE  Identifica o handle da conexão 

SQL_CONN_RDD  Nome do RDD que gerencia esta conexão 

SQL_CONN_HOST  Nome do host ao qual esta conexão está conectada 

SQL_CONN_PORT  Número da porta utilizada para comunicação 

SQL_CONN_DB  Nome do Database originalmente conectado 

SQL_CONN_USER  Nome do usuário utilizado para autenticação 

SQL_CONN_PASSWORD  Senha usada para autenticar a conexão 

SQL_CONN_FLAGS  Flags opcionais utilizados para estabelecer a conexão 

SQL_CONN_SYSTEMID  É um valor numérico interno da SQL LIB que identifica o SYSTEM 
ID do driver utilizado para gerenciar esta conexão. 

Exemplo: 

#include 'sqllib.ch' 

aList := SQLGetConnections() 

FOR I := 1 TO Len( aList ) 

Conn := aList[i] 

? “Usuário “, Conn[SQL_CONN_USER], “ conectado em “,; 
Conn[SQL_CONN_HOST], “ via “, Conn[SQL_CONN_RDD] ,; 
“ na conexão “, Conn[SQL_CONN_HANDLE] 
End 

Consulte também: 
SQLGETCONNECTIONINFO()

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 35 


10.  SQLGETCONNECTIONINFO() 
Retorna um array contendo informações sobre a conexão passada como argumento. 

Sintaxes: 

SQLGetConnectionInfo ( [<nConnect>] ) ­­> aInfo 
SQLGetConnectionInfo( <cRddName> )  ­­> aInfo 

Onde: 

<nConnect>  É o número da conexão que se deseja obter informações. Se este argumento for 
omitido a conexão ativa será assumida. 

<cRddName>  Se  o  argumento  passado  como  parâmetro  for  uma  expressão  caracter, 
<cRddName> deve conter o nome do driver RDD específico para pesquisa. 

Neste caso a primeira conexão bem sucedida, que possua o RDD solicitado será 
processada. 

aInfo  É um  array  multidimensional com as  informações  da  conexão  ou  NIL  se  nada 
for encontrado. 

Este array de retorno possui a mesma estrutura individual de SQLGETCONNECTIONS(). 

Exemplo: 

#include 'sqllib.ch' 

Conn := SQLGetConnectionInfo(nConn) 

? “Usuário “, Conn[SQL_CONN_USER], “ conectado em “,; 
Conn[SQL_CONN_HOST], “ via “, Conn[SQL_CONN_RDD] ,; 
“ na conexão “, Conn[SQL_CONN_HANDLE] 

Consulte também: 
SQLGETCONNECTIONS() 

11.  SQLGETRDDNAME() 
Recebe como parâmetro o numero da conexão e retorna o nome do driver interno da SQL LIB que 
está gerenciando esta conexão. 

Sintaxe: 

SQLGetRddName( [<nConnect>] ) ­­> cRddName 

Onde: 

<nConnect>  É o número da conexão que se deseja obter informações. Se este argumento for 
omitido a conexão ativa será assumida. 

<cRddName>  É o nome do driver interno da SQL LIB que está gerenciando esta conexão.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 36 


Para uma tabela aberta com PostgreSQL por exemplo, esta função retornará “PGSQL”, já para uma 
conexão MySQL retornará “MYSQL” e assim por diante. 

Consulte também: 
SQLGetConnectionInfo() 

12.  SQLERRORMSG() 
Retorna uma string representando a última mensagem de erro obtida (se houver) durante uma 
operação interna da SQL LIB. 

Sintaxe: 

SQLErrorMsg() ­­> cMsg 

Onde: 

<cMsg>  Representa a string contendo a última mensagem de erro gerada. 

Veja um exemplo detalhado em SQLERRORNO(). 

Consulte também: 
SQLERRORNO() 

13.  SQLERRORNO() 
Retorna o número do último erro (se houver) durante uma operação interna da SQL LIB. 

Sintaxe: 

SQLErrorNo() ­­> nError 

Onde: 

<nError>  É o número do último erro ocorrido ou zero em caso de sucesso. 

Exemplo: 

cConn := "Driver=PostgreSQL;Servidor=192.168.0.1;"+; 
"usuario=postgres;senha=post;banco=Demos;porta=5432" 
SQL CONNECT cConn INTO nPostSQL 

/* 
* Houve algum erro na conexao? 
*/ 
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 

Consulte também: 
SQLErrorMsg()

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 37 


14.  SQLPACKETSIZE() 
Especifica  a  quantidade  de  registros  que  devem  ser  lidos  do  servidor  sempre  que  necessário.  O 
comando SQL PACKET SIZE e SQL CURRENT PACKETSIZE são mapeados internamente para 
chamar esta função. 

Sintaxe: 

SQLPacketSize( [<nSize>], [<lCurrentAlias ) ­­> nOldSize 

Onde: 

<nSize>  É o novo valor indicando quantos registros devem ser lidos. 

<lCurrentAlias>  É um valor lógico indicando se <nSize> aplica­se apenas a tabela atual. 

Consulte também: 
SQL PACKETSIZE 

15.  SQLEXECUTE() 
Executa um comando SQL diretamente  no servidor e retorna  verdadeiro ou falso indicando êxito. 
Outros apelidos que esta função possui: SQLEXEC() e SQLLIB_EXECSQL(). 

Sintaxe: 

SQLExecute( <cSQL>, [<aParms>], [<nConnection>] ) ­­> lResult 

Onde: 

<cSQL>  É a string contendo o comando SQL a ser executado. 

<aParms>  É um array com uma lista de argumentos utilizados para pré­processar <cSQL> 
utilizando o PARSER interno da SQL LIB, antes de envia­lo ao servidor. 

<nConnection>  Indica o número da conexão onde o comando SQL deve ser executado. 

lResult  É  um  valor  de  retorno  lógico  indicando  verdadeiro ou  falso  se  o  comando  foi 
executado com sucesso. 

Esta função não deve ser utilizada para enviar comandos que retornem dados do servidor, tais como 
o  comando  SELECT  ou  SHOW.  Nestes  casos,  utilize  o  comando  USE  SQL  ou  ainda  a  função 
SQLARRAY() que são próprias para esta finalidade. 

A partir da versão 1.3 da SQL LIB esta função não gerará nenhuma mensagem caso, tenha ocorrido 
algum  erro  durante  a  execução  de  <cSQL>  no  servidor.  Use  o  valor de  retorno  para  testar  se  o 
comando foi executado  com sucesso e consulte as funções SQLErrorMsg()  e  SQLErrorNO() 
para obter a mensagem e o número do erro respectivamente da última falha. 

Exemplo:
SET DATE TO BRIT

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 38 


cConn := "Driver=MySQL;ip=192.168.0.1;usuario=root;banco=test" 
SQL CONNECT cConn INTO nMySQL 

SQLExecute( “INSERT INTO CLIENTES(nome,salario,aniv) VALUES ($1,$2,$3)” ,; 
{ “Jose Matias”, 2500.00, CTOD(’10/05/1965’) }, nMySQL ) 

Consulte também: 
SQLARRAY() 
SQLPARSER() 
USE SQL 
Apêndice C – Trabalhando com o PARSER SQL interno da SQL LIB 

16.  SQLARRAY() 
Envia  um  comando  SQL  direto  ao  servidor  e  obtém  o  valor  de  retorno  armazenando­o  em  um 
ARRAY.  Esta  função  só  deve  ser  utilizada   com  comandos  SQL  que  retornem  dados,  tais  como 
SELECT, SHOW, EXPLAIN entre outros. 

Sintaxe: 

SQLArray( <cSQL>, [<aParms>], [<nConn>], 
[< aFieldNames>], [<nSystemID>] ) ­­> aResult 

Onde: 

<cSQL>  Especifica o comando SQL que será executado no servidor. 

<aParms>  É  um  lista  de  argumentos  opcionais  utilizados  para  pré­processar  <cSQL> 
utilizando  o  PARSER  interno  da  SQL  LIB,  antes  de  enviar  o  comando  ao 
servidor. 

<nConn>  Indica o número da conexão onde o comando SQL deve ser executado. 

<aFieldNames>  É  um  array  opcional  que  se  especificado,  será  preenchido  com  os  nomes  dos 
campos retornados na consulta efetuada. 

Por exemplo, em um comando “SELECT NOME, FONE FROM CLIENTES”, 
este array conteria dois valores: { “NOME”, “FONE” } 

<nSystemID>  É  um  valor  numérico  interno  da  SQL  LIB  que  identifica  o  SYSTEM  ID  do 
driver utilizado para gerenciar esta conexão. 

Especificar  este  parâmetro  acelera  a  execução  do  comando  SQL  quando  há 
muitas  conexões  efetuadas  ao  mesmo  tempo,  pois  a  SQL  LIB  não  necessita 
pesquisar internamente para averiguar qual é o driver correto para gerenciar esta 
conexão, visto que o este parâmetro serve para obtermos esta informação. 

aResult  É  o  array  multidimensional  que  contém  os  valores  de  retorno  do  comando 
executado no sistema. 

Para  cada  registro  (ou  tuples)  retornados  pela  consulta  será  criado  um  item 
correspondente  em  aResult  e  para  cada  campo  retornado  será  criado  um  item 
dentro desta linha. De modo que aResult será declarado como:

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 39 


DECLARE aResult[numero_de_linhas][numero_de_colunas] 

Exemplo 1 (MySQL): 

/* 
* Lista todas as tabelas cadastradas no servidor MySQL 
*/ 
tabelas := SQLArray( ‘SHOW TABLES’ ) 
? ToString( tabelas ) 

Exemplo 2 (PostgreSQL com parâmetros): 

/* 
* Testa se a tabela CLIENTES existir – código em PostgreSQL: 
*/ 
SQL := "SELECT tablename FROM pg_tables WHERE tablename = $1" 
Arr := SQLArray( SQL, {“CLIENTES”} ) 

if Empty( Arr ) 
? ‘Tabela nao existe!’ 
else 
? ‘Tabela existe servidor!’ 
endif 

Consulte também: 
SQLEXECUTE() 
SQLPARSER() 
USE SQL 
Apêndice C – Trabalhando com o PARSER SQL interno da SQL LIB 

17.  SQLARRAYASSOC() 
Envia  um  comando  SQL  direto  ao  servidor  e  obtém  o  valor  de  retorno  armazenando­o  em  um 
ARRAY  associativo.  Esta  função  é  semelhante  à  SQLARRAY()  e  segue  as  suas  mesmas  regras, 
diferenciando­se  apenas  no  vetor  de  retorno  que  possui  associação  com  os  campos  das  tabelas 
(sempre em letras minúsculas). 

Sintaxe: 

SQLArrayAssoc( <cSQL>, [<aParms>], [<nConn>], 
[< aFieldNames>], [<nSystemID>] ) ­­> aResult 

Onde: 

<cSQL>  Especifica o comando SQL que será executado no servidor. 

<aParms>  É  um  lista  de  argumentos  opcionais  utilizados  para  pré­processar  <cSQL> 
utilizando  o  PARSER  interno  da  SQL  LIB,  antes  de  enviar  o  comando  ao 
servidor. 

<nConn>  Indica o número da conexão onde o comando SQL deve ser executado. 

<aFieldNames>  É  um  array  opcional  que  se  especificado,  será  preenchido  com  os  nomes  dos 
campos retornados na consulta efetuada. 

Por exemplo, em um comando “SELECT NOME, FONE FROM CLIENTES”,

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 40 


este array conteria dois valores: { “NOME”, “FONE” } 

<nSystemID>  É  um  valor  numérico  interno  da  SQL  LIB  que  identifica  o  SYSTEM  ID  do 
driver utilizado para gerenciar esta conexão. 

Especificar  este  parâmetro  acelera  a  execução  do  comando  SQL  quando  há 
muitas  conexões  efetuadas  ao  mesmo  tempo,  pois  a  SQL  LIB  não  necessita 
pesquisar internamente para averiguar qual é o driver correto para gerenciar esta 
conexão, visto que o este parâmetro serve para obtermos esta informação. 

aResult  É  o  array  multidimensional  que  contém  os  valores  de  retorno  do  comando 
executado no sistema. 

Para  cada  registro  (ou  tuples)  retornados  pela  consulta  será  criado  um  item 
correspondente  em  aResult  e  para  cada  campo  retornado  será  criado  um  item 
dentro desta linha. De modo que aResult será declarado como: 

DECLARE aResult[numero_de_linhas][numero_de_colunas] 

Exemplo: 

/* 
* Testa se a tabela CLIENTES existir – código em PostgreSQL: 
*/ 
result:=SQLArrayAssoc("SELECT * from USERS order by NAME") 

for n:=1 to len(result) 

/* 
* Exibe na tela o valor do campo ‘name’ de 
* todos os registros devolvidos… 
*/ 
? result[n][ 'name'] 
next 

Consulte também: 
SQLARRAY() 
SQLEXECUTE() 
SQLPARSER() 
USE SQL 
Apêndice C – Trabalhando com o PARSER SQL interno da SQL LIB 

18.  SQLNULLDATE() 
Retorna uma string representando uma data em branco ou nula. 

Sintaxe: 

SQLNullDate( [<nSystemID >] ) ­­> cData 

Onde: 

<nSystemID>  É  o  número  identificador do  driver  (também  conhecido  como System  ID)  que 


deve ser utilizado para determinar qual é o valor correto de retorno. 

Caso  este  parâmetro  seja  omitido,  a  SQL  LIB  determinará  o  valor  padrão  de 
nSystemID verificando a conexão atual.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 41 


cData  É a string representando uma data vazia ou nula. 

Utilize esta função ao efetuar pesquisas direto no servidor, de modo a manter seu software portável 
entre os diversos drivers suportados pela SQL LIB – isto apenas é necessário caso você não esteja 
utilizando nenhum dos parsers internos da RDD. 

Em alguns servidores SQL como o PostgreSQL, campos com valores NULL não são armazenados 
em índices forçando com que uma pesquisa tal como “SELECT * FROM DATE IS NULL” realize 
um table scan ­ o que com certeza sacrificaria seu aplicativo e o banco. 

Por  isto  a  SQL  LIB  trabalha  com  esta  função  para  determinar  qual  a  expressão  correta  a  ser 
utilizada nestes casos. 

Exemplo: 

? SQLNullDate(POSTGRESQL_ID )  // Retornará: “0001­01­01” 
? SQLNullDate( MYSQL_ID ) 

/* Utilizando para montar um filtro no servidor */ 
SQLFILTER( “aniversario =” + SQLNullDate() ) 

Consulte também: 
SQLNULL() 

19.  SQLNULL() 
Retorna a expressão caracter utilizada para gravação em campos string, quando nenhum valor for 
especificado, evitando que valores NULL sejam gravados na tabela. 

Sintaxe: 

SQLNULL() ­­> cChar 

Onde: 

<cChar>  É o caracter formatado para string, representando o valor de NULL. 

Lembrando que  o uso desta função é apenas necessário,  caso  você não  esteja utilizando nenhum 


dos parsers internos da SQL LIB. 

Veja maiores detalhes em SQLNULLDATE()sobre quando aplicar este tipo de função. 

Exemplo: 

/* Filtrar os clientes que estejam sem telefone */ 
SQL FILTER TO “fone =” + SQLNull() ) 

Consulte também: 
SQLNULLDATE()

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 42 


20.  SQLFILTER() 
Retorna e opcionalmente define um filtro para ser aplicado no lado do servidor  para a tabela atual. 
A  expressão  passada  por  argumento  deve  ser  formatada  como  um  filtro  SQL.  O  comando  SQL 
FILTER é mapeado internamente para executar esta função. 

Sintaxe: 

SQLFilter( [<cFilter>] ) ­­> cCurrentFilter 

Onde: 

<cFilter>  É  a  expressão  que  deverá  ser  aplicada  como  filtro  no  ALIAS()  atual.  Se  uma 
string  vazia  “”  for  passada  como  argumento,  o  filtro  atualmente  definido  para 
esta tabela será removido. 

cCurrentFilter  É o filtro atualmente em uso. 

O  uso  deste  comando  é  altamente  recomendado  como  substituto  de  SET  FILTER  e  SET 
RELATION  sempre  que  possível,  por  ser  aplicado  diretamente  no  servidor  ­  o  que  torna  o  seu 
processamento mais rápido. 

Exemplo: 

/* 
* Filtra todos os clientes que contenham a palavra “JOAO” em qualquer 
* posição em seu nome – seja no inicio, meio ou fim 
*/ 
USE clientes NEW ALIAS cli VIA ‘mysql’ 
SQLFILTER( “nome LIKE ‘%JOAO%’” ) 
GO TOP 
BROWSE() 

21.  SQLREFRESH() 
Atualiza os dados da tabela atual, forçando um sincronismo da cache atual com os dados do servidor 
SQL. 

Sintaxe: 

SQLRefresh() ­­> nil 

Esta  rotina  atualiza  os  dados  da  tabela  atual  dando  um  GOTO  para  o  mesmo  registro  onde  está 
atualmente  posicionado o ponteiro  de  registros.  Caso  esta  função  seja  chamada sobre um  registro 
deletado com FULLDELETE() estando ativo, a tabela atual irá retornar um EOF(). 

Exemplo: 

USE pedidos NEW VIA ‘mysql’ 
/* 
* Deleta todos os registros da tabela e atualiza o 
* os dados da memoria 
*/ 
SQL EXECUTE “DELETE FROM PEDIDOS”

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 43 


SQLRefresh() 

Consulte também: 
FULLDELETE() 

22.  SQL_AFFECTEDROWS() 
Retorna o número de linhas afetadas pelo último comando SQL. 

Sintaxe: 

SQL_AffectedRows()­­> nRowCount 

Onde: 

<nRowCount>  É  o  número  de  linhas  atualizadas  /  deletadas  /  inseridas  pelo  último  comando 
SQL enviado ao servidor. 

Exemplo: 

SQL EXECUTE “DELETE FROM pedidos” 
ALERT( ntrim(SQL_AffectedRows()) + ‘ linhas foram excluídas‘ ) 

23.  SQL_FULLDELETE() 
Especifica  se  um  registro  deve  ser  excluído  definitivamente  da  tabela  ou  apenas  marcado  para 
remoção futura com o comando PACK. O comando SQL FULLDELETE é mapeado internamente 
para chamar esta função. 

Sintaxe: 

SQL_FullDelete( [<lDelete>] ) ­­> lOldValue 

Onde: 

<lDelete>  Se  verdadeiro  o  registro  atual  será  definitivamente  deletado  da  tabela  caso 
contrário, será apenas marcado para remoção futura com o comando PACK. 

lOldValue  É o valor atual desta função. 

Esta função é útil para se efetuar validações do lado do servidor – imagine a seguinte situação: 

·  Um  aplicativo  possui  uma  tabela  de  clientes  e  outra  de  pedidos,  que  é  vinculada  aos 
clientes. Este mesmo aplicativo, pode deixar para o usuário a opção de se ‘EXCLUIR’ 
um item do cadastro de clientes e este comando, efetuaria um DBDELETE() no registro 
selecionado desta tabela. 

Note o ponto importante agora:  O servidor SQL pode recusar esta operação de exclusão 


se já houver uma chave estrangeira vinculada nesta tabela, por exemplo.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 44 


Utilizando  esta  linha  de  raciocínio  acima,  nunca  haveria  em  sua  base  de  dados  nenhum  pedido 
efetuado para algum cliente excluído (registro órfão) e sendo assim,  você sempre terá sua base de 
dados consistente. 

Consulte também: 
SQL FULLDELETE 

24.  SQLCREATEFLAGS () 


Define parâmetros adicionais que serão anexados à função DBCreate() antes de serem enviados para 
o  servidor  SQL.  Esta  função  deve  ser  usada  para  se  alterar  algum  parâmetro  da  tabela,  que 
normalmente  não  está  disponível  pelos  parâmetros  de  DBCreate(),  como  por  exemplo,  o  seu 
TABLE TYPE ou ROW_FORMAT. 

Sintaxe: 

SQLCreateFlags( [<cFlags>], [<nSystemID>] ) ­­> cCurrentFlags 

Onde: 

<cFlags>  É  a  string  contendo uma  ou  mais  opções  que  serão  enviadas  ao  servidor  SQL 
juntamente com o comando DDL no momento de criação da tabela. 

<nSystemID>  É  um  valor  numérico  interno  da  SQL  LIB  que  identifica  o  SYSTEM  ID  do 
driver utilizado para gerenciar esta conexão. 

Este  parâmetro  é  importante,  pois  ele  determina  que  <cFlags>  seja  aplicado 
APENAS à conexões que utilizem este driver. 

Isto significa que, caso sua aplicação utilize ao mesmo tempo uma conexão com 
MySQL  e  outra  com  PostgreSQL,  você  pode por  exemplo,  mudar  os  flags  de 
DBCreate() apenas para as conexões que usam somente MySQL. Deste modo, 
cada banco SQL terá sua própria configuração gerenciada pela SQL LIB RDD 
individualmente. 

Se  este  parâmetro  for  omitido  será  substituído  pelo  SYSTEM  ID  da  conexão 
atual. 

cCurrentFlags  É o valor atualmente em vigor para o <nSystemID>  especificado. 

Exemplo de como criar tabelas com estruturas personalizadas com a SQL LIB: 

LOCAL aStru := {{'nome','c',25,0},{'aniv','d',10,0}} 
LOCAL cFlag 
/* 
* Cria uma tabela normalmente sem alterar nada. 
* Seu formato ser  InnoDB (com suporte … transa‡äes) 
*/ 
DBCREATE( 'test1', aStru ) 

/* 
* Alteramos um parâmetro e forçamos ele a criar a tabela como MyISAM 
* este formato não suporta transações. 
*

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 45 


* Observe que no exemplo abaixo, o valor atual em vigor para a conexão ‚ 
* salvo na variavel cFlag e depois ‚ restaurado. 
*/ 
cFlag := SQLCreateFlags( 'ENGINE=MyISAM' ) 
DBCREATE( 'test2', aStru ) 

SQLCreateFlags("ENGINE=MyISAM DEFAULT CHARSET=latin1"+; 
"PACK_KEYS=1 ROW_FORMAT=COMPRESSED" ) 

DBCREATE( 'test3', aStru ) 

SQLCreateFlags( cFlag ) 

/* 
* A função abaixo, irá criar a tabela test4 com o mesmo formato de test1 
* Pois no exemplo acima, RESTAURAMOS o valor de SQLCreateFlags() ao seu 
* padrão logo depois de criarmos test3. 
*/ 
DBCREATE( 'test4', aStru ) 

Consulte também: 
DBCREATE() 

25.  DBCREATE() 
Cria um arquivo de dados no formato DBF ou uma tabela no servidor SQL com a SQL LIB. 

Sintaxe: 

DBCreate( < cNomeArquivo >, [<aEstrutura>] ) ­­> NIL 

Onde: 

<cNomeArquivo>  É o nome do arquivo .DBF ou o nome da tabela SQL que será criada contendo a 
estrutura desejada. 

A primeira coluna deve conter o nome do campo, a segunda o tipo, a terceira, o 
tamanho do campo e a quarta, o número de casas decimais. Os dados fornecidos 
devem seguir as regras usadas pelo comando Create do DBU. Informe sempre 
as quatro colunas, ou seja, a coluna Decimals deve ser especificada com 0 (zero) 
para campos não numéricos 
<aEstrutura>  É  um  array  contendo  a  estrutura  da  nova  tabela  ou  arquivo  .DBF  que  será 
criado.  Quando  se  trabalha  com  Clipper,  este array  deve  ter  no  mínimo quatro 
colunas  quando  se  deseja  criar  um  arquivo  DBF,  sendo  que  cada  linha 
corresponde a um campo a ser criado. 

No  entanto,  quando  se  trabalha  com  a  SQL  LIB  RDD  este  array  pode  conter 
mais  informações,  indicando  outras  características  que  se  deseja  agregar  aos 
campos da nova tabela. 

A  listagem  que  se  segue  abaixo,  destaca  as  posições  que  este  array  poderá 
possui, bem como o significado de cada valor: 

Posição  Refer ência 


1°  Nome do campo à ser criado (sem espaços)

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 46 


2°  Tipo do campo representado pela primeira letra:

·  CHAR (texto)
·  NUMERICO
·  DATA
·  LÓGICO
·  MEMO 

Você também poderá criar campos em uma tabela com 
tipo de dados específicos do seu banco de dados. Para 
especificar explicitamente o formato em SQL para um 
determinado  campo,  de  modo  que  a  SQL  LIB  possa 
interpretar  isto  de  modo  correto,  o  décimo  valor   do 
item que define o campo é usado para indicar se o tipo 
do campo é nativo do servidor SQL. 

3°  Tamanho do campo em bytes. 

4°  Número de casas decimais. 

5°  Um flag, indicando com valor verdadeiro se este campo 
deve ser criado como ‘NOT NULL’. 

6°  Valor lógico, indicando se o campo possuirá ou não o flag 
“UNIQUE”. 

7°  Valor lógico, indicando se o campo possuirá ou não o flag 
“AUTOINCREMENT”. 

8°  Valor lógico, indicando se o campo possuirá ou não o flag 
“PRIMARY KEY” 

9°  Indica a expressão “DEFAULT” para o campo, caso o 
usuário não a preencha. 

10°  Valor lógico, indicando se o tipo deste campo é um tipo 
nativo do servidor SQL. 

Exemplo 1 (criando uma tabela em SQL com alguns parametros adicionais): 

aStru := {} 

* Campo NOT NULL 
AAdd( aStru, {"key"   , "n", 10, 0, .t.} ) 

* PRIMARY KEY e AUTO INCREMENTO 
AAdd( aStru, {"codigo", "n", 10, 0, ,, .t., .t. } ) 

* Nome ‚ um campo caracter normal 
AAdd( aStru, {"nome"  , "c", 25, 0 } ) 

* campo caracter normal 
AAdd( aStru, {"endereco" , "c", 40, 0 } ) 

* NOT NULL e UNIQUE

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 47 


AAdd( aStru, {"cpf" , "c", 21, 0, .T., .T. } ) 

* Campos com formatação normal 
AAdd( aStru, {"civil" , "c",  1, 0 } ) 
AAdd( aStru, {"obs"   , "m", 10, 0 } ) 
AAdd( aStru, {"cadastro","d", 10, 0 } ) 

DBCreate( 'test6',aStru) 

A partir da SQL LIB  v1.3, dois novos comandos personalizados foram introduzidos com o intuito 
de ajudar ao programador na montagem do ARRAY correto para DBCreate(). Eles estão definidos 
dentro do arquivo SQLLIB.CH e o exemplo 2 abaixo, demonstra a sua facilidade: 

Exemplo 2 (mesmo resultado do exemplo 1, porém com algumas regras de validação adicionais): 

/* 
* Mesmo exemplo de campos acima, utilizando a 
* sintaxe com os novos comandos introduzidos na SQL LIB. 
*/ 
aCampos := {} 
SQL ADD FIELD "KEY"      TYPE INTEGER                   INTO aCampos 
SQL ADD FIELD "Codigo"   NUM(10)   PRIMARY_KEY AUTO_INC INTO aCampos 
SQL ADD FIELD "Nome"     CHAR(25)  DEFAULT " " NOT NULL INTO aCampos 
SQL ADD FIELD "Endereco" CHAR(40)  INTO aCampos 
SQL ADD FIELD "CPF"      CHAR(21)  NOT NULL UNIQUE      INTO aCampos 
SQL ADD FIELD "Civil"    TYPE "ENUM('Casado','Solteiro')" ; 
NOT NULL DEFAULT 'Solteiro' INTO aCampos 
SQL ADD FIELD "OBS"      MEMO(10)  INTO aCampos 
SQL ADD FIELD "Cadastro" DATE(10) DEFAULT Date()        INTO aCampos 

DBCreate( 'test7',aCampos) 

Consulte também: 
SQLCREATEFLAGS() 

26.  TABLE() 
Testa se uma ou mais tabelas existem no servidor. 

Sintaxe: 

Table( <cMask>, [<nConnection>] ) ­­> lFound 

Onde: 

<cMask>  É a string contendo o nome ou a máscara das tabelas que serão pesquisadas no 
servidor SQL. 

Utilize  o  asterisco  “*”  como  caracter  curinga  para  pesquisar  por  mais  de  uma 
tabela. 

<nConnection>  É o número da conexão com o servidor utilizada para extrair a informação. Se 
este  parâmetro  for  omitido  será  substituído  por  um  valor  padrão,  segundo  o 
algoritmo abaixo:

·  Se houver algum arquivo aberto na área atual e se ele for uma tabela aberta

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 48 


com a SQL LIB, utilize e conexão desta tabela .

·  Caso contrário a conexão atual será assumida. 

lFound  É  um  valor  lógico  indicando  se  um  ou  mais  arquivos  foram  encontrados  no 
servidor. Esta função faz uso do SCHEMA atual para efetuar a pesquisa. 

Exemplo 1 (checando se uma tabela existe): 

if Table( ‘clientes.dbf’ ) 
? ‘tabela de clientes já existe!’ 
else 
dbCreate( ‘clientes.dbf’, aEstrutura ) 
endif 

Exemplo 2 (checando se várias tabelas existem): 

if !Table( ‘NET*.dbf’ ) 
? ‘tabelas do sistema não foram encontradas’ 
endif 

Consulte também: 
SQLGETTABLES() 
INDEX() 
TAG() 

27.  INDEX() 
Checa se um ou mais índices existem no servidor SQL. Esta função considera apenas os índices 
criados com o comando INDEX ON ou DBCREATEINDEX(). 

Sintaxe: 

Index( <cMask>, [<nConnection>] ) ­­> lFound 

Onde: 

<cMask>  É a string contendo o nome ou a máscara dos índices que serão pesquisados no 
servidor SQL. 

Utilize  o  asterisco  “*”  como  caracter  curinga  para  pesquisar  por  mais  de  uma 
tabela. 

<nConnection>  É o número da conexão com o servidor utilizada para extrair a informação. Se 
este  parâmetro  for  omitido  será  substituído  por  um  valor  padrão,  segundo  o 
algoritmo abaixo:

·  Se houver algum arquivo aberto na área atual e se ele for uma tabela aberta 
com a SQL LIB, utilize e conexão desta tabela .

·  Caso contrário a conexão atual será assumida.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 49 


lFound  É  um  valor  lógico  indicando  se  um  ou  mais  arquivos  foram  encontrados  no 
servidor. 

Exemplo: 

USE clientes NEW VIA ‘PGSQL’ 

IF !index( “nome.ntx” ) 
? ‘indexando tabela de clientes.’ 
INDEX ON nome TO nome.ntx 
Else 
SET INDEX TO nome 
End 

Consulte também: 
SQLGETINDEXES() 
TAG() 
TABLE() 

28.  TAG() 
Checa  a  existência  de  uma  tag  específica  dentro  de um  índice  criado  pela  SQL  LIB.  Esta  função 
considera apenas os índices criados com o comando INDEX ON ou DBCREATEINDEX(). 

Sintaxe: 

Tag( <cTag>, <cIndex>, [<nConnection>] ) ­­> lFound 

Onde: 

<cTag>  É o nome da tag que se deseja pesquisar no índice. 

<cIndex>  É o nome do índice que contém a tag procurada. 

<nConnection>  É o número da conexão com o servidor utilizada para extrair a informação. Se 
este  parâmetro  for  omitido  será  substituído  por  um  valor  padrão,  segundo  o 
algoritmo abaixo:

·  Se houver algum arquivo aberto na área atual e se ele for uma tabela aberta 
com a SQL LIB, utilize e conexão desta tabela .

·  Caso contrário a conexão atual será assumida. 

lFound  É um valor lógico indicando se <cTag> existe em <cIndex>. 

Exemplo: 

USE clientes NEW VIA ‘PGSQL’ 
CLEAR INDEXES 

INDEX ON nome  TAG ‘nome’  TO clientes.cdx 


INDEX ON endereco  TAG ‘ende’  TO clientes.cdx

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 50 


? tag( “nome”, “clientes.cdx” )  // Result: .T. 
? tag( “fone”, “clientes.cdx” )  // Result: .F. 
? tag( “ende”, “clientes.cdx” )  // Result: .T. 

Consulte também: 
SQLGETINDEXES() 
INDEX() 
TABLE() 

29.  DATABASE() 
Checa a existência de um DATABASE junto ao servidor SQL. 

Sintaxe: 

DataBase( <cDB>, [<nConnection>] ) ­­> lFound 

Onde: 

<cDB>  É o nome do DATABASE que se deseja averiguar. 

<nConnection>  É o número da conexão com o servidor utilizada para extrair a informação. Se 
este  parâmetro  for  omitido  será  substituído  por  um  valor  padrão,  segundo  o 
algoritmo abaixo:

·  Se houver algum arquivo aberto na área atual e se ele for uma tabela aberta 
com a SQL LIB, utilize e conexão desta tabela .

·  Caso contrário a conexão atual será assumida. 

lFound  É um valor lógico indicando se <cDB> existe no servidor. Esta função faz uso 
do  SCHEMA atual para efetuar a pesquisa. 

Exemplo: 

#include 'sqllib.ch' 

/* 
* Neste exemplo, checamos se o banco de dados já existe, caso 
* contrário criamos ele. 
*/ 
SQL CONNECT ON '192.168.0.1'; 
PORT     3306; 
DATABASE 'template1'; 
USER     'postgres'; 
PASSWORD 'sql' ; 
LIB      'PostgreSQL'; 
INTO nPostSQL 

IF Database( “sistema” ) 
* Database já existe! 
ELSE 
SQL EXECUTE “CREATE DATABASE sistema” 
End 

SQL DISCONNECT nPostSQL

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 51 


/* 
* Tudo Ok! Usamos agora o banco de dados correto =D 
*/ 
SQL CONNECT ON       '192.168.0.1'; 
PORT     3306; 
DATABASE 'sistema'; 
USER     'postgres'; 
PASSWORD 'sql' ; 
LIB      'PostgreSQL' 

Consulte também: 
SQLGETDBS() 
TABLE() 
INDEX() 

30.  TRUERECCOUNT() 
Retorna  a  quantidade  correta  de  registros  de  uma  tabela.  Esta  função  ignora  o  valor  de 
SQL_ROWID ao calcular os regsitros. 

Sintaxe: 

TrueReccount() ­­> nCount 

Onde: 

<nCount>  Representa a quantidade de registros reais da tabela. 

Normalmente a SQL LIB calcula a quantidade de registros de uma tabela através do seguinte 
comando: 

SELECT max( sql_rowid) FROM tabela 

No  entanto,  em  alguns  casos  é  necessário  sabermos  a quantidade  real de registros  de uma tabela, 
neste caso então o programador pode fazer uso desta função. 

31.  SQLCOPYTABLE() 
Duplica  os  dados  da  tabela  passada  como  argumento  para  uma  nova,  incluindo  seus  dados  e  sua 
estrutura. 

Sintaxe: 

SQLCopyTable( <cSource>, <cDestiny> ) ­­> lSuccess 

Onde: 

<cSource>  É o nome da tabela ou view que se deseja duplicar. 

<cDestiny>  É o nome da nova tabela se que deseja criar com os dados da tabela original. 

Caso esta tabela já exista no servidor, ela será apagada e uma nova será criada 
com a estrutura igual à <cSource>, de modo que nenhum erro será gerado pela

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 52 


SQL LIB. 

Nota importante: esta função copia apenas a estrutura e os dados para a nova tabela – não incluindo 


triggers, views e outros objetos vinculados à tabela original. 

Consulte também: 
SQLRENAMETABLE() 

32.  SQLRENAMETABLE() 
Altera  o  nome  de  uma  tabela  existente  no  servidor.  O  comando  RENAME  TABLE  é  mapeado 
internamente para executar esta função. 

Sintaxe: 

SQLRenameTable( <cSource>, <cNewName> ) ­­> lSuccess 

Onde: 

<cSource>  É o nome atual da tabela existente no servidor 

<cNewName>  É o novo nome que será  dado à tabela. 

lSuccess  É um valor lógico indicando êxito ou não na execução do comando. 

Exemplo: 

? SQLRenameTable( “clientes.dbf”, “clientes_antigo.dbf” ) 

Consulte também: 
SQLCOPYTABLE() 
SQLRENAMEINDEX() 
SQLDROPTABLE() 

33.  SQLRENAMEINDEX() 
Altera o nome de um índice existente já criado pela SQL LIB. O comando RENAME INDEX é 
mapeado internamente para executar esta função. 

Sintaxe: 

SQLRenameIndex( <cIndexName>, <cNewName> ) ­­> lSuccess 

Onde: 

<cIndexName>  É o nome atual da tabela existente no servidor 

<cNewName>  É o novo nome que deverá ser repaçado ao índice 

lSuccess  É um valor lógico indicando êxito ou não na execução do comando.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 53 


Exemplo: 

USE clientes NEW VIA ‘MySQL’ 
INDEX ON nome TO idxnome.ntx 

CLOSE ALL 

? SQLRenameIndex( ‘idxnome.ntx’, ‘nomeindex.ntx’ ) 

USE clientes NEW VIA ‘MySQL’ 
SET INDEX TO nomeindex.ntx 

Consulte também: 
SQLCOPYTABLE() 
SQLRENAMETABLE() 

34.  SQLDROPTABLE() 
Remove uma tabela específica do banco de dados. 

Sintaxe: 

SQLDropTable( <cTableName> ) ­­> nil 

Onde: 

<cTableName>  É a string identificando o nome da tabela que será removida do banco de dados. 

Exemplo: 

SQLDropTable( ‘tabla.dbf’ ) 

Consulte também: 
SQLRENAMETABLE() 

35.  SQLDROPINDEX() 
Remove um ou mais índices existentes com nome igual ao passado por parâmetro. 

Sintaxe: 

SQLDropIndex( <cIndexName> ) ­­> nil 

Onde: 

<cIndexName>  É a string identificando o nome do índice a ser removido. Você pode utilizar o 
asterisco  “*”  como  curinga  para  excluir  mais  de  um  índice  com  o  mesmo 
comando.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 54 


Exemplo: 

USE clientes NEW VIA ‘MySQL’ 
INDEX ON nome TO idxnome.ntx 

CLOSE ALL 

? SQLDropIndex( ‘idxnome.ntx’ ) 

USE clientes NEW VIA ‘MySQL’ 
SET INDEX TO idxnome.ntx  // Erro: o indice nao existe 

Consulte também: 
SQLRENAMEINDEX() 

36.  SQLALTERTABLE() 
Altera  a  estrutura  de  uma  tabela  existente  e  deixa­a  igual  à  estrutura  passada  como  parâmetro  ­ 
inclusive na ORDEM EXATA dos campos (se o servidor for MySQL). 

Sintaxe: 

SQLAlterTable( <cTabela>, <aStruct>, [<nConnection>] ) ­­> lSuccess 

Onde: 

<cTabela>  É o nome da tabela existente que será atualizada. 

<aStruct>  É um array com a nova estrutura para a tabela, este parâmetro possui o mesmo 
formato do array utilizado por DBCREATE() respeitando as seguintes regras: 

·  Caso um campo exista em <aStruct> , mas ainda não exista  na tabela será 


criado. 
·  Caso um campo exista na tabela , mas não em <aStruct> será deletado 
·  Caso  um  campo  exista  em  ambos  o  tipo  de  campo,  tamanho  e  outros 
critérios serão validados e se necessário, o campo será alterado para possuir 
as novas características contidas em <aStruct>. 

lSuccess  É um valor indicando êxito ou não na execução da função. 

Exemplo: 

Demos\structdemo.prg 

37.  SQLUSECUSTOMINDEXES() 
Indica  se  a  SQL  LIB  deve  permitir  ou  não  o  uso  de  índices  customizados.  Esta  função  vem 
desabilitada por padrão na SQL LIB e deve ser alterada caso o programador deseje utilizar este tipo 
de índice. 

Sintaxe:

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 55 


SQLUseCustomIndexes( [<lActive>] ) ­­> lOldValue 

Onde: 

<lActive>  É um valor indicando se o uso de índices customizados é permitido ou não. 

lOldValue  Valor lógico indicando o status atual desta função. 

Consulte o apêndice A para obter maiores informações detalhadas sobre como trabalhar com índices 
na SQL LIB. 

Exemplo: 
demos\index.prg 

38.  SQLBEGINTRANS() 
Inicia uma nova transação em todas as conexões atualmente abertas e incrementa o contador de 
transações em +1. 

Sintaxe: 

SQLBeginTrans()­­> nil 

Considere a referência ao comando START TRANSACTION neste guia para uma explanação mais 
completa sobre o uso de transações dentro da SQL LIB: 

Consulte também: 
SQLENDTRANS() 
START TRANSACTION 

39.  SQLENDTRANS() 
Finaliza um bloco de transação aberto com a função SQLBEGINTRANS() ou o comando START 
TRANSACTION,  envia  um  COMMIT  das  alterações  pendentes  (se  houver)  e  decrementa  o 
contador de transações ativas em ­1. 

Sintaxe: 

SQLEndTrans () ­­> nil 

Consulte também: 
SQLBEGINTRANS() 
SQLCOMMIT() 
SQLROLLBACK() 

40.  SQLCOMMIT() 
Grava todas as alterações feitas dentro de um bloco de transações, mas não a finaliza.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 56 


Sintaxe: 

SQLCommit() ­­> nil 

Consulte também: 
SQLBEGINTRANS() 
SQLROLLBACK() 
SQL COMMIT 

41.  SQLROLLBACK() 
Descarta todas as alterações efetuadas no bloco de transação atual em todas as tabelas envolvidas, 
mas não finaliza o bloco de transações. 

Sintaxe: 

SQLRollBack() ­­> nil 

Consulte também: 
SQLENDTRANS() 
SQLCOMMIT() 
SQL ROLLBACK 

42.  SQLTRANSCOUNT() 
Retorna um número indicando quantas transações estão em aberto. 

Sintaxe: 

SQLTransCount() ­> nCount 
Onde: 

<nCount>  Número indicando quantas transações estão em aberto até o momento. 

Exemplo: 

BEGIN TRANSACTION 

? SQLTransCount()  // Result: 1 

END TRANSACTION 

? SQLTransCount()  // Result: 0 

Consulte também: 
BEGIN TRANSACTION 
END TRANSACTION 

43.  SQLGETDBINFO() 
Esta função retorna um array com informações extraídas do servidor SQL.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 57 


Sintaxe: 

SQLGetDBInfo( <nDBInfo> ,[<nConn>] ) ­­> xResult 

Onde: 

<nDBInfo>  É um valor numérico indicando qual o tipo de informação que se deseja extrair 
do servidor SQL. 

Constante  Descr ição 


DBI_GETVERSION  Obtém uma string com o nome e a versão do 
banco de dados. 

DBI_GETSYSTEMID  Retorna  o  número  do driver  interno  da  SQL 


LIB  que  gerencia  esta  conexão,  também 
conhecido como System ID 

DBI_GETSYSTEMIDSTR  Retorna uma expressão caracter  indicando o 


nome  do  driver  utilizado  para  gerenciar  esta 
conexão. 

DBI_GETALLDBS  Obtém uma lista  de todos os bancos de dados 


cadastrados no servidor. 

DBI_GETALLTABLES  Obtém  uma  lista   com  todas  as  tabelas 


registradas dentro da base de dados atual 

DBI_GETALLINDEXES  Obtém  uma  lista   de  todos  os  índices 


registrados dentro da base de dados atual. 

DBI_GETALLUSERS  Obtém  uma  lista   de  todos  os  usuários 


cadastrados no servidor SQL. 

DBI_GETALLCONNUSERS  Obtém  uma  lista   de  todos  os  usuários 


atualmente  conectados  no  servidor  e  retorna 
diversas informações, tais como:

· Nome do usuário e IP (ou nome da CPU) 
de onde o usuário está conectado

· Nome  do  banco  de  dados  atualmente 


conectado

· Porta à qual ele está conectado

· Comando  SQL  atualmente  em  execução 


por este usuário (quando disponível) 

Todas  estas  informações  são  obtidas  como 


expressões to tipo caracter. 

<nConn>  É o número da conexão com o servidor utilizada para extrair a informação. Se 
este  parâmetro  for  omitido  será  substituído  por  um  valor  padrão,  segundo  o

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 58 


algoritmo abaixo:

·  Se houver algum arquivo aberto na área atual e se ele for uma tabela aberta 
com a SQL LIB, utilize e conexão desta tabela .

·  Caso contrário a conexão atual será assumida. 

xResult  É  o  valor  de  retorno  contendo  a informação  solicitada.  Pode  ser  um  ARRAY, 
uma  expressão  CARACTER  ou  NUMÉRICA  dependendo  do  valor  de 
<nDBInfo>. 

Existem  várias  funções  simples  disponibilizadas  pela  SQL  LIB  que  utilizam  esta  função  para 
simplificar  seu  uso por parte do programador,  algumas  delas  são  alistadas  logo  baixo,  sob o  item 
‘Consulte’. 

Exemplo: 

#include 'sqllib.ch' 

cls 
? ‘Servidor atual’, SQLGetDBInfo( DBI_GETVERSION ) ) 
? ‘Usários conectados atualmente neste servidor:’ 
? ToString( SQLGetDBInfo( DBI_GETALLCONNUSERS ) ) 

wait 

Consulte também: 
SQLGETTABLES() 
SQLGETDBS() 
SQLGETINDEXES() 
SQLGETCONNECTEDUSERS() 
SQLGETUSERS() 

44.  SQLGETTABLES() 
Retorna  um  array  contendo  os  nomes  de  todas  as  tabelas  registradas  no  banco  de dados  atual  da 
conexão passada por parâmetro. 

Sintaxe: 

SQLGetTables( [<nConn>], [<cMask>] ) ­­> aResult 

Onde: 

<nConn>  É o numero da conexão com o servidor a ser testada, se omitido é assumido a 
conexão atual. 

<cMask>  É  um  parâmetro  opcional  que  especifica  um  filtro  para  a  listagem  a  ser 
retornada. 

Pode­se utilizar o asterisco “*” como curinga para o filtro. 

aResult  Um array contendo os nomes das tabelas encontradas. 

Exemplo:

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 59 


#include 'sqllib.ch' 

cls 

// Lista todas as tabelas registradas no servidor 
? ToString( SQLGetables( nil, “” )) 

// Lista todas as tabelas registradas no servidor que começe 
// com a expressão “clie*” 
? ToString( SQLGetables( nil, “clie*” )) 

wait 

Consulte também: 
SQLGETDBINFO() 
SQLGETINDEXES() 

45.  SQLGETINDEXES() 
Retorna  um  array  contendo os  nomes  de  todos  os  índices  registrados  no  banco  de dados  atual  da 
conexão passada por parâmetro. 

Sintaxe: 

SQLGetIndexes( [<nConn>], [<cMask>] ) ­­> aResult 

Onde: 

<nConn>  É o numero da conexão com o servidor a ser testada, se omitido é assumido a 
conexão atual. 

<cMask>  É  um  parâmetro  opcional  que  especifica  um  filtro  para  a  listagem  a  ser 
retornada. 

Pode­se utilizar o asterisco “*” como curinga para o filtro. 

aResult  Um array contendo os nomes de todos os índices encontrados. 

Consulte também: 
SQLGETTABLES() 
SQLGETDBINFO() 

46.  SQLGETDBS() 
Retorna  uma  lista  com  todos  os  nomes  de  bancos  de  dados  cadastrados  no  servidor  da  conexão 
solicitada. 

Sintaxe: 

SQLGetDBs( [<nConn>], [<cMask>] ) ­­> aResult 

Onde:

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 60 


<nConn>  É o numero da conexão com o servidor a ser testada, se omitido é assumido a 
conexão atual. 

<cMask>  É um parâmetro opcional que especifica um filtro a ser aplicado na listagem a 
ser retornada. 

Pode­se utilizar o asterisco “*” como curinga para o filtro. 

aResult  Um array contendo os nomes de todos os índices encontrados. 

Consulte também: 
SQLGETTABLES() 
SQLGETINDEXES() 
SQLGETDBINFO() 

47.  SQLGETUSERS() 
Retorna uma lista contendo todos os usuários cadastrados no servidor SQL. 

Sintaxe: 

SQLGetUsers( [<nConn>] ) ­­> aResult 

Onde: 

<nConn>  É o numero da conexão com o servidor a ser testada, se omitido é assumido a 
conexão atual. 

aResult  Um array contendo os nomes de todos os usuários cadastrados no servidor. 

Consulte também: 
SQLGETCONNECTEDUSERS() 
SQLGETDBINFO() 

48.  SQLGETCONNECTEDUSERS() 
Obtém uma lista de todos os usuários atualmente conectados no servidor SQL. 

Sintaxe: 

SQLGetConnectedUsers( [<nConn>] ) ­­> aResult 

Onde: 

<nConn>  É o numero da conexão com o servidor a ser testada, se omitido é assumido a 
conexão atual. 

aResult  Um  array  contendo  os  nomes  de  todos  os  usuários  atualmente  conectados  no 
servidor. 

Esta função retorna diversas informações, tais como:

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 61 


· Nome do usuário e IP (ou nome da CPU) de onde o usuário está conectado;

· Nome do banco de dados atualmente conectado;

· Porta à qual ele está conectado;

· Comando SQL atualmente em execução por este usuário (quando disponível); 

Consulte também: 
SQLGETUSERS() 
SQLGETDBINFO() 

49.  SQLSERVERVERSION() 
Retorna uma string contendo o nome e a versão do servidor SQL da conexão solicitada. 

Sintaxe: 

SQLServerVersion( [<nConn>] ) ­­> cVersion 

Onde: 

<nConn>  É o numero da conexão com o servidor a ser testada, se omitido é assumido a 
conexão atual. 

cVersion  É uma string contendo o nome e a versão do servidor SQL. 

Exemplo 1: 

cConn := "MySQL=192.168.0.1;usuario=root;banco=jose" 
SQL CONNECT cConn INTO nMySQL 

cConn := "PostgreSQL=192.168.0.1;usuario=postgres;senha=post;banco=Demos" 
SQL CONNECT cConn INTO nPostSQL 

? SQLServerVersion( nMySQL )  // Result: “MySQL 4.1.9­max” 
? SQLServerVersion( nPostSQL )  // Result: “PostgreSQL 8.1.2” 

Consulte também: 
SQLGETDBINFO() 

50.  SQLSERVERDATE() 
Retorna a data atual do computador onde o servidor SQL da conexão solicitada estiver em 
execução. 

Sintaxe: 

SQLServerData( [<nConn>] ) ­­> dDate

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 62


Onde: 

<nConn>  É o numero da conexão com o servidor a ser testada, se omitido é assumido a 
conexão atual. 

dDate  É  a  data  atual  do  computador  onde  o  servidor  está  em  execução  ou  NIL  se  a 
conexão não for válida. 

Exemplo 1: 

cConn := "MySQL=192.168.0.1;usuario=root;banco=jose" 
SQL CONNECT cConn INTO nMySQL 

Data1 := DATE() 
Data2 := SQLServerDate() 

If Data1 <> Data2 
? “A data de seu computador está errada! Favor corrigir!” 
end 

Consulte também: 
SQLSERVERTIME() 

51.  SQLSERVERTIME() 
Retorna a hora atual do computador onde o servidor SQL está em execução. 

Sintaxe: 

SQLServerTime( [<nConn>] ) ­­> cTime 

Onde: 

<nConn>  É o numero da conexão com o servidor a ser testada, se omitido é assumido a 
conexão atual. 

cTime  É a hora atual do computador onde o servidor SQL está em execução no formato 
HH:MM:SS. 

Exemplo 1: 

cConn := "MySQL=192.168.0.1;usuario=root;banco=jose" 
SQL CONNECT cConn INTO nMySQL 

HoraAtual := DATE() 
HoraServer:= SQLServerDate() 

? ‘A hora atual do seu micro é:’, HoraAtual 
? ‘A hora atual no servidor SQL é:’, Hora Server 
pause 

Consulte também: 
SQLSERVERTIME()

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 63 


52.  SQLDATE() 
Formata a data passada como argumento, para uma string válida para pesquisa em SQL. 

Sintaxe: 

SQLDate( [<dDate>] ) ­­> cDate 

Onde: 

<dDate>  É  a  data  a  ser  convertida  para  uma  expressão  caracter.  Se  este  argumento  for 
omitido a data atual do computador será assumida. 

cDate  É a data passada como argumento no formato ‘AAAA­MM­DD’ ou ‘0001­01­ 
01’ caso uma data vazia seja encontrada. 

Note que esta função já retorna a data solicitada como string e delimitada com 
aspas simples. 

Exemplo 1: 

cConn := "MySQL=192.168.0.1;usuario=root;banco=jose" 
SQL CONNECT cConn INTO nMySQL 

cSQL  := “select * from funcionários WHERE dataAdmissao = “ + ; 
SQLDate(Date()) 

USE SQL (cSQL) NEW ALIAS temp 
Browse() 

Consulte também: 
SQLSTR() 

53.  SQLSTR() 
Formata a string passada como argumento retornando uma string SQL válida (e já delimitada) que 
você pode usar em uma instrução SQL. 

Sintaxe: 

SQLStr( <cString>, [<nSystemID>] ) ­­> cResult 

Onde: 

<cString>  É a string contendo a expressão a ser formatada. 

<nSystemID>  É o número do driver ­ também conhecido como System ID – que gerencia esta 
conexão 

cResult  É  a  string  formatada  e  delimitada  com  aspas  simples  para  uso  em  comandos 
SQL. 

A função SQLSTR() adiciona aspas simples no inicio e no final da string passada como argumento 
e, caso o parâmetro <nSystemID> seja especificado, a string será enviada para o driver gerenciador 
da conexão correspondente a fim de ser codificada para uma string SQL com escape.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 64 


Exemplo: 

Nome  := “Jose Matias da Silva” 
Salario := 1200.00 

cSQL := “INSERT INTO funcionários (nome, salario) VALUES (” +; 
SQLStr(Nome)+ “,” + SQLnTrim( Salario ) + “)” 

SQL EXECUTE cSQL 

Consulte também: 
NTRIM() 

54.  SQLNTRIM() 
Converte um valor numério para uma expressão caracter removendo quaisquer espaços na string. 
Esta função também possui outro nome: NTRIM(). 

Sintaxe: 

SQLnTrim( <nValue> ) ­­> cValue 
nTrim( <nValue> ) ­­> cValue 

Onde: 

<nValue>  É o número a ser convertido. 

cValue  É a string contendo o valor numérico convertido para caracter e sem espaços. 

Exemplo: 

Nome    := “Jose Matias da Silva” 
Salario := 1200.00 

cSQL := “INSERT INTO funcionários (nome, salario) VALUES (” +; 
SQLStr(Nome)+ “,” + SQLnTrim( Salario ) + “)” 

SQL EXECUTE cSQL 

Consulte também: 
SQLSTR() 

55.  TOSTRING() 
Converte  o  valor  passado  como  argumento  de  qualquer  tipo,  para  uma  expressão  caracter  e 
opcionalmente formatada. 

Sintaxe: 

TOSTRING( <xValue>, [<lFormatted>] ) ­­> cValue

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 65 


Onde: 

<xValue>  É o valor de qualquer tipo (exceto CODEBLOCK) que se deseja converter 

<lFormatted>  É um valor lógico indicando se a string pode ser formatada para saída no vídeo, 
o que geralmente inclui quebras de linhas e alguns outros detalhes para melhor 
visulização da informação por parte do usuário. 

Utilize este parâmetro como FALSO caso deseje gravar o valor de retorno desta 
função em uma tabela/campo. Se omitido .T. é assumido. 

cValue  É a string representando a informação contida em <xValue> em formato string. 

Esta função foi concebida com o intuito de fornecer ao programador um modo de gravar em tabelas 
SQL dados que normalmente ele não conseguiria tais como arrays e objetos. 

Na atual implementação de TOSTRING(), apenas o suporte a variáveis do tipo objeto ainda não está 
concluído. Estamos trabalhando para já nas próximas versões finalizarmos este ajuste. 

Exemplo 1: 

/* 
* Iremos depurar o valor de uma variável 
*/ 

aFiles := directory( “*.*” ) 

? ‘existem ‘, len(aFiles), ‘ arquivos neste diretorio’ 
Wait 

? ‘Eis os arquivos encontrados:’ 
? ToString( aFiles ) 

wait 
quit 

Exemplo 2: 

/* 
* Vamos gravar as preferências de cores do usuário em uma tabela 
* e iremos restaura­las nos próximos logins. 
*/ 
PUBLIC aColors 

USE setup NEW VIA ‘MySQL’ 

IF Empty( SETUP_COLOR ) 
aColors := { “W+/B*”, “B/W”, “W+/R” } 

REPLACE SETUP_COLOR WITH ToString( aColors, .F. ) 
ELSE 
aColors := &SETUP_COLOR. 
End 

ALERT( SQLVersion() + ' & ' + Version(), { “Ok” }, aColors[1] ) 
quit 

Consulte também:

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 66 


SQLSTR() 
SQLNTRIM() 

56.  SQLROWID() 
Retorna o último valor numérico lido da coluna SQL_ROWID da tabela atual. 

Sintaxe: 

SQLRowID() ­­> nValue 

Onde: 

<nValue>  É o último valor lido da coluna SQL_ROWID. 

57.  SQLVERSION() 
Retorna um string informando a versão, o número e o mês de lançamento da SQL LIB. 

Sintaxe: 

SQLVersion( [<lShort>] ) ­­> cVersion 

Onde: 

<lShort>  É um valor lógico indicando se desejamos obter apenas uma descrição simples 
da versão ou se desejamos obter todos os detalhes da mesma. 

Exemplo: 

? SQLVersion()  // Result: SQL LIB COMERCIAL v1.2b March/2006 
? SQLVersion(.T.)  // Result: v1.2b 

Consulte também: 
SQLSERVERVERSION() 

58.  SQLLIB() 
Retorna verdadeiro se a tabela atual for uma tabela aberta utilizando­se a SQL LIB. 

Sintaxe: 

SQLlib() ­­> lSQL 

Onde: 

<lSQL>  Indica se a tabela aberta na área atual pertence à SQL LIB. 

Exemplo:

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 67 


USE vendedores NEW VIA ‘MySQL’  ALIAS ven 

USE produtos   NEW VIA ‘DBFCDX’ ALIAS pro 

USE clientes  NEW VIA ‘PgSQL’  ALIAS cli 

? ven­> ( SQLLIB() )  // Result .T. foi aberto com MySQL 
? pro­> ( SQLLIB() )  // Result .F. foi aberto com dbfcdx 
? cli­> ( SQLLIB() )  // Result .T. foi aberto com Postgres 

Consulte também: 

SQLSERVERVERSION() 

59.  SQLBACKUPSTART() 
Inicia  o  sistema  de  backup  da  SQL  LIB  e  reserva  o  HANDLE  do  arquivo  .SQL  passado  como 
argumento, retornando um valor numérico que indica o êxito ou não da operação. 

Sintaxe: 

SQLBackupStart( <cFile>, [<nPacketSize>], [<lDropObjects>], 
[<bEval>], [<nConnection>] ) ­­> nSuccess 

Onde: 

<cFile>  É o nome do arquivo .SQL que será gerado com os dados do backup. 

<nPacketSize>  Informa  quantos  registros  serão  copiados  por  bloco  dados.  Se  omitido  o 
padrão se SET PACKETSIZE será assumido. 

<lDropObjects>  Este  parâmetro  indica  se  os  objetos  (tabelas,  views  entre  outros)  devem  ser 
excluídos da base de dados, antes do backup iniciar­se, se omitido o padrão é 
FALSE. 

Caso  esteja  recuperando  um  backup  de  uma  tabela,  por  exemplo,  e  ela  já 
existir  na base de dados, se este parâmetro for verdadeiro, a tabela atual será 
excluída  e  recriada  novamente.  Se  falso  for  especificado  os  dados  do  script 
atual serão adiconados ao final da tabela já existente. 

Use este parâmetro com cuidado ao criar e recuperar scripts de backup. 

<bEval>  É  um  code  block  que  irá  controlar  o  comportamento  das  rotinas  de  backup 
para esta operação. 

Este  code­block  será  processado  sempre que  necessário  ou  alguma  operação 


for  executada/gravada  ou  algo  de  imprevisto  ocorrer  durante  a  operação  de 
backup. 

Este  code­block  receberá  três  parâmetros  chamados  de  nMode,  ObjName  e 


Data ,  sendo  o  primeiro  numérico  que  conterá  o  Modo  atual  do backup  e  os 
outros 2 valores poderão mudar de acordo com o status/modo atual da função: 

Valor de nMode  Descrição

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 68 


SQL_BACKUP_BEGIN  Iniciou­se  o  processo  de  backup.  Os  dois 
parâmetros finais passados são:

·  ObjName  contém o  nome do  arquivo  .SQL 


gerado.

·  Data   contém  o  Handle  do  arquivo  obtivo 


com FCREATE(). 

O  code­block  deve  então  retornar  .T.  para 


prosseguir  com o backup ou .F. para cancelar  a 
operação. 

SQL_BACKUP_END  O  processo  de  backup  está  concluído.  Os  dois 


parâmetros finais passados são:

·  ObjName contém o nome do arquivo .SQL 
gerado.

·  Data   contém  o  Handle  do  arquivo  obtivo 


com FCREATE(). 

Qualquer valor de retorno para este modo será 
ignorado pela SQL LIB. 

SQL_BACKUP_DDL  Indica  que  uma  instrução  SQL  que  altera  a 


estrutura   de  algum  objeto  no  banco  de  dados 
está pronta para ser executada.

·  ObjName  contém  o  nome  do  objeto  que 


será afetado.

·  Data  contém o tipo de informação que está 
prestes a ser alterada, podendo ser: 

SQL_BACKUP_TABLE, 
SQL_BACKUP_VIEW, 
SQL_BACKUP_FUNC, 
etc... 

O  code­block  deve  então  retornar  .T.  para 


permitir   que  o  comando  seja  executado ou  .F. 
para ignorar  a operação. 

SQL_BACKUP_DATA  Indica  que  uma  instrução  SQL  que  adiciona 


dados  no  banco  de  dados  está  pronta  para  ser 
executada.

·  ObjName  contém  o  nome  da  tabela  que 


será atualizada.

·  Data   contém  o  valor 


SQL_BACKUP_TABLE

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 69 


SQL_BACKUP_ERROR  Indica  que  algum  erro  inesperado  ocorreu 
durante  o  processo.  Neste  caso  os  dois 
parâmetros finais são:

·  ObjName  contém  o  comando  SQL  que 


gerou o erro.

·  Data   contém  o  número  da  linha  no  script 


SQL que gerou a exceção. 

O  arquivo  SQLLIB.CH  contém  todas  as  definições  das  constantes 


mencionadas na tabela acima. 

<nConnection>  Parâmetro  indicando  a  conexão  para  se  extrair  as  informações  desejadas.  Se 
omitido o número da conexão atual. 

nSuccess  É  um  valor  numérico  indicando  o  êxito  ou  não  da  função.  Pode  possuir  os 
seguintes valores: 

Retorno  Comentário 
> 0  Não  foi  possível  criar  o  arquivo  de  backup,  o  valor 
retornado é o valor obtido de FERROR(). 

­1  O Handle passado da conexão SQL não foi encontrado ou 
é inválido 

­2  Erro ao puxar a estrutura da tabela 

A função SQLBACKUPSTART() inicia o sistema de backup e reserva memória e recursos para as 
demais funções de processamento – mas ela não gera o backup de nenhuma informação! 

Um backup feito pela SQL LIB consiste em uma ou mais chamadas à funções auxiliares da RDD, 
como por exemplo, a chamada à função para SQLBACKUPTABLE() para se efetuar os backups de 
uma  ou  mais  tabelas  do  servidor,  ou  ainda,  SQLBACKUPROUTINES()  para  gerar  o  backup  de 
views, triggers, functions ou SP . 

O importante é ter em mente que esta função apenas inicia  o processo, que deve ser finalizado com 
SQLBACKUPEND(). 

Exemplo 1: 

cConn := "Driver=MySQL;ip=192.168.0.1;usuario=root;banco=demos" 
SQL CONNECT cConn INTO nMySQL 

IF SQL_ErrorNO() > 0 
Return( .F. ) 
ENDIF 

/* 
* Aqui fazemos o backup de toda a base de dados 
*/ 
SQLBackupStart( 'backup.sql', 10, TRUE ) 
SQLBackupTable( '*.*' ) 
SQLBackupRoutines() 
SQLBackupEnd()

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 70 


Exemplo 2 
#include “sqllib.ch” 
CLEAR SCREEN 

SQLBackupStart( 'backup.sql', 10, .T., ; 
{|nMode,cObjName,uData| ShowProcess(nMode,cObjName,uData) } ) 

SQLBackupTable( '*.*' ) 
SQLBackupRoutines() 
SQLBackupEnd() 


quit 

/* 
* Esta é nossa função personalizada que exibe informações 
* diversas sobre o processo de backup. 
*/ 
FUNCTION ShowProcess(nMode,cObjName,uData) 

do case 
case nMode == SQL_BACKUP_BEGIN 
? 'Backup iniciado em ', cObjName, ' handle =',uData 
Fwrite( uData, '# Backup iniciado' ) 

case nMode == SQL_BACKUP_END 
? 'Backup Terminado!' 
Fwrite( uData, '# Backup efetuado com sucesso!!' ) 

case nMode == SQL_BACKUP_DDL 
? 'Extraindo Metadados da', SQL_BACKUP_OBJECTS[uData],cObjName 

/* 
* Não deixa ele fazer o BKP das tabelas iniciadas com 
* esta sequencia de letras (apenas para exemplificar) 
*/ 
IF LEFT( cObjName, 3 ) == 'sr_' THEN ; 
RETURN .F. 

case nMode == SQL_BACKUP_DATA 
? 'Extraindo dados de', cObjName, ' registros',uData 

/* 
* Não deixa ele fazer o BKP das tabelas iniciadas com 
* esta sequencia de letras (apenas para exemplificar) 
*/ 
IF LEFT( cObjName, 3 ) == 'sr_' THEN ; 
RETURN .F. 

End 
RETURN .T. 

Consulte também: 
SQLBACKUPEND() 
SQLBACKUPTABLE() 
SQLBACKUPROUTINES() 

60.  SQLBACKUPEND()

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 71 


Finaliza  um  backup  iniciado  com  SQLBACKUPSTART(),  libera  memória  e  fecha  os  handles de 
arquivos alocados e não mais necessários. 

Sintaxe: 

SQLBackupEnd() ­­> nError 

Onde: 

<nError>  Se  algum  erro  ocorrer  durante  o  processo,  tal  como  a  impossibilidade  de  se 
fechar o arquivo .SQL criado por SQLBACKUPSTART(), este valor de retorno 
será o mesmo correspondente à FERROR(). 

Consulte também: 
SQLBACKUPSTART() 

61.  SQLBACKUPRESTORE() 
Restaura um BACKUP previamente gerado pela SQL LIB ou por ferramentas de terceiros. 

Sintaxe: 

SQLBackupRestore( <cFile>, [<lDropObjects>], 
[<lAbortOnAnyError>], 
[<bEval>], [<nConnection>] )  ­­> nSuccess 

Onde: 

<cFile>  É o nome e path do arquivo .SQL que será restaurado. 

<lDropObjects>  É um valor lógico indicando se um objeto que já existe no banco de dados 
deve ser excluído ao se executar o script de comando. 

Este parâmetro ainda não foi implementado na versão atual da SQL LIB e 
pode ser ignorado. 
<lAbortOnAnyError>  Valor lógico indicando se a operação de backup deve ser cancelada quando 
um erro ocorrer. 

Esta opção está .T. por padrão, caso seja especificado um valor .F., o code­ 
block  informado  em  <bEval>  deve  decidir  se  a  execução  do  script  deve 
prosseguir ou não. 

<bEval>  É  um  code  block  que  irá  controlar  o  comportamento  desta  operação  de 
restauração de dados. 

Este  code­block  será  processado  sempre  que  necessário  ou  alguma 


operação  for  executada/gravada  ou  algo  de  imprevisto  ocorrer  durante  a 
operação de backup e recebe os mesmos parâmetros passados pela função 
SQLSTARTBACKUP() 

<nConnection>  Parâmetro indicando a conexão para se restaurar as informações desejadas. 
Se omitido o número da conexão atual.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 72 


Tenha sempre certeza absoluta de os parâmetros passados para esta função são realmente válidos e 
tome cuidado pois esta rotina se executada em uma conexão diferente da desejada poderá acarretar 
em perca de dados importantes! 

Exemplo: 
/* 
* restaura o backup criado no exemplo da função SQLStartBackup() 
*/ 
SQLBackupRestore( 'backup.sql' ) 

Consulte também: 
SQLSTARTBACKUP() 

62.  SQLBACKUPTABLE() 
Gera o script de backup para uma ou mais tabelas ou views do banco dados.  Esta função deve ser 
usada depois de SQLBACKUPSTART() e antes de SQLBACKUPEND(). 

Sintaxe: 

SQLBackupTable( <xTables>, [<lExtractData>] , [<lExtractStruct>], 
<nPacketSize> ) ­­> nSuccess 

Onde: 

<xTables>  É uma array contendo os nomes das tabelas e/ou views, para se efetuar cópia 
de segurança ou apenas uma string contendo o nome de uma única tabela ou 
view para backup. 

Pode­se utilizar o asterisco como caracter curinga para se processar o backup 
de mais de uma tabela ao mesmo tempo. 

<lExtractData>  É um valor lógico indicando se a SQL LIB deve gerar o backup dos dados das 
tabelas relacionadas em <xTables>. 

<lExtractStruct>  É um valor lógico indicando se a SQL LIB deve gerar o backup da estrutura 
das tabelas solicitadas. 

Este parâmetro como .F. é útil para se transferir os dados de uma tabela, para 
outra  tabela  sem  apagar  nenhuma  informação.  Por  padrão  a  RDD  efetua  o 
backup tanto dos dados, quando da estrutura da tabela. 

<nPacketSize>  É  um  valor  numérico  indicando  a quantidade  de registros  a  serem  incluídos 


no  script  gerado.  Se  omitido,  o  padrão  de  SQLBACKUPSTART()  será 
assumido. 

<nSuccess>  É um valor igual à zero, indicando sucesso ou outro valor em caso de erro. 

Exemplo 1 :

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 73 


/* 
* Efetua o backup de duas tabelas 
*/ 
SQLBackupStart( 'backup.sql' ) 
SQLBackupTable( 'clientes' ) 
SQLBackupTable( 'fornecedores' ) 
SQLBackupEnd() 

Exemplo 2 : 
/* 
* O mesmo exemplo acima, que efetua o backup de duas 
* tabelas, agora em uma única linha: 
*/ 
SQLBackupStart( 'backup.sql' ) 
SQLBackupTable( { 'clientes', 'fornecedores' } ) 
SQLBackupEnd() 

Exemplo 3: 
/* 
* Faz o backup dos dados da tabela clientes, mas não da sua estrutura 
* (isto é útil para se transferir os dados para outra tabela sem apagar 
*  nenhuma informação) 
*/ 
SQLBackupStart( 'clientes.sql' ) 
SQLBackupTable( 'clientes', .T., .F. ) 
SQLBackupEnd() 

Exemplo 4: 
/* 
* Geramos o backup dos dados das vendas para enviar para a filial. 
* Usamos um asterisco para fazer backup das tabelas: PEDIDOS, 
* PEDIDOS_ITEMS e PEDIDOS_PRAZOS: 
*/ 
SQLBackupStart( 'filial.sql' ) 
SQLBackupTable( 'clientes', .T., .F. ) 
SQLBackupTable( 'pedidos*.*', .T., .F. ) 
SQLBackupEnd() 

Consulte também: 
SQLBACKUPROUTINES() 

63.  SQLBACKUPROUTINES() 
Gera o backup das functions e procedures de um banco de dados, filtrando os objetos utilizando a 
máscara passada como argumento. 

Sintaxe: 

SQLBackupRoutines( [<cMask>] ) ­­> nResult 

Onde: 

<cMask>  É a máscara a ser utilizada como filtro para os objetos que serão copiados para o

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 74 


script de backup. Pode­se utilizar o asterisco como curinga neste parâmetro. 

<nSuccess>  É um valor igual à zero, indicando sucesso ou outro valor em caso de erro. 

Exemplo: 

SQLBackupStart( 'system.sql' ) 
SQLBackupRoutines() 
SQLBackupEnd() 

Consulte também: 
SQLBACKUPTABLE() 

64.  SQLBACKUPBLOCK() 
Obtém  e opcionalmente  permite  trocar o  code­block  que  está  monitorando  as operações atuais de 
backup por outro. 

Sintaxe: 

SQLBackupBlock( [<bBlock>] ) ­­> bOldBlock 

Onde: 

<bBlock>  É  um  parâmetro  opcional,  que  indica  o  novo  code­block  que  irá  substituir  o 
especificado  em  SQLBACKUPSTART  no  gerenciamento  das  operações  de 
backup. 

bOldBlock  É uma cópia do code­block atualmente ativo. 

Consulte também: 
SQLSTARTBACKUP() 

65.  SQLSCHEMA() 
Consulta  e  opcionalmente  altera  o  SCHEMA  atualmente  em  uso  para  as  tabelas  aberta  com  o 
comando USE. 

Sintaxe: 

SQLSchema( [<cNewSchema>] ) ­­> cOldSchema 

Onde: 

<cNewSchema>  É o nome do novo SCHEMA a ser utilizado para abertura das tabelas. 

<cOldSchema>  É o SCHEMA atualmente em uso e ativo. 

Exemplo:

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 75 


cConn := "PostgreSQL=192.168.0.1;usuario=post;senha=post;banco=Demos" 
SQL CONNECT cConn INTO nPostSQL 

SQLSchema( “public” ) 
USE vendedores NEW VIA “PGSQL”  // Abre a tabela “public”.”vendedores” 

SQLSchema( “vendas” ) 
USE pedidos NEW VIA “PGSQL”  // Abre a tabela “vendas”.”pedidos” 

Consulte também: 
SELECT SCHEMA 

66.  SQLSYSTEMSCHEMA() 
Consulta e opcionalmente altera o SCHEMA atualmente em uso para as tabelas do sistema. 

Sintaxe: 

SQLSystemSchema( [<cNewSchema>] ) ­­> cOldSchema 

Onde: 

<cNewSchema>  É o nome do novo SCHEMA a ser utilizado para abertura das tabelas do sistema 

<cOldSchema>  É o SCHEMA atualmente em uso e ativo. 

Tabelas  do  sistema,  são  as  tabelas  utilizadas  pela  SQL  LIB  para  monitorar  o  controle  índices  e 
outras informações, tais como SQL$INDEXES e outras que possam surgir. 

Consulte também: 
SQLSCHEMA() 
SELECT SCHEMA 

67.  _SQL_GETPOINTER() 
Função  de  baixo  da  API  que  retorna  um  ponteiro  contendo  informações  diversas  da  tabela 
atualmente selecionada. 

Sintaxe: 

_SQL_GetPointer() ­­> nPointer 

Onde: 

<nPointer>  É um numero indicando o ponteiro contendo informações da tabela. 

As  funções  de  baixo  nível  da  API  devem  ser  utilizadas  com  cautela,  pois  quando  estas  funções 
forem erroneamente aplicadas em tabelas que não foram abertas com a SQL LIB, pode acarretar em 
instabilidade do sistema e gerar várias GPFs.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 76 


68.  _SQL_GETCONN() 
Função de baixo da API que obtém o handle da conexão SQL a partir de o ponteiro passado como 
parâmetro. 

Sintaxe: 

_SQL_GetConn( <nPointer> ) ­­> nConnection 

Onde: 

<nPointer>  É o ponteiro retornado por _SQL_GETPOINTER() 

nConnection  É o número da conexão utilizada para comunicar­se com o servidor SQL. 

Consulte também: 
_SQL_GETPOINTER() 

69.  _SQL_SYSTEMID() 
Retorna o driver ID também chamado de System ID do pointer passado como argumento. 

Sintaxe: 

_SQL_SYSTEMID( <nPointer> ) ­­> nSystemID 

Onde: 

<nPointer>  É o ponteiro retornado por _SQL_GETPOINTER() 

nSystemID  Número único que identifica o driver utilizado pela SQL LIB para gerenciar esta 
tabela representada por <nPointer> 

Consulte também: 
_SQL_GETPOINTER() 
_SQL_SYSTEMIDSTR() 

70.  _SQL_SYSTEMIDSTR() 
Retorna uma string representando o driver ID do pointer passado como argumento. 

Sintaxe: 

_SQL_SYSTEMIDSTR( <nPointer> ) ­­> cSystemID 

Onde: 

<nPointer>  É o ponteiro retornado por _SQL_GETPOINTER() 

cSystemID  String  identificando o driver utilizado pela SQL LIB para gerenciar esta tabela

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 77 


representada em <nPointer> 

Consulte também: 
_SQL_GETPOINTER() 
_SQL_SYSTEMID() 

71.  _SQL_TABLESTYLE() 
Retorna o tipo de tabela representada pelo ponteiro passado como argumento. 

Sintaxe: 

_SQL_TABLESTYLE( <nPointer> ) ­­> nType 

Onde: 

<nPointer>  É o ponteiro retornado por _SQL_GETPOINTER() 

nType  Retorna o tipo de comando utilizado para abrir esta tabela. Os possíveis valores 
estão alistados na tabela abaixo: 

Código  Comentário 
TS_COMPLEX_SQL  Indica que a tabela foi aberta com o comando USE 
SQL e portanto, a tabela é somente leitura. 

TS_SINGLE_SQL  Indica que a tabela foi aberta com o comando USE 
normal  e  pode  ser  atualizada  com  o  comando 
REPLACE normalmente. 

Consulte também: 
_SQL_GETPOINTER() 

72.  _SQL_TABLENAME() 
Retorna o nome da tabela do servidor ao qual esta área está  vinculada, representada pelo ponteiro 
passado como argumento. 

Sintaxe: 

_SQL_TABLENAME( <nPointer> ) ­­> cTableName 

Onde: 

<nPointer>  É o ponteiro retornado por _SQL_GETPOINTER() 

cTableName  É o nome na tabela no servidor ao qual esta área está vinculada ou asterisco “*” 
caso esta área seja aberta com USE SQL.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 78 


Consulte também: 
_SQL_GETPOINTER() 

73.  _SQL_FULLTABLENAME() 
Retorna  o  nome  completamente  qualificado  que  identifica  a  tabela  no  servidor  SQL,  conforme 
indicado no ponteiro passado como parâmetro. 

Sintaxe: 

_SQL_FullTableName( <nPointer> ) ­­> cFullName 

Onde: 

<nPointer>  É o ponteiro retornado por _SQL_GETPOINTER() 

cFullName  É o nome completamente qualificado da tabela à qual <nPointer> se refere. 

Consulte também: 
_SQL_GETPOINTER() 

74.  _SQL_TABLESCHEMA() 
Retorna o SCHEMA atual da tabela representada pelo ponteiro passado como argumento.. 

Sintaxe: 

_SQL_TableSchema( <nPointer> ) ­­> cSchemaName 

Onde: 

<nPointer>  É o ponteiro retornado por _SQL_GETPOINTER() 

cSchemaName  É o nome do SCHEMA ao qual esta função está vinculada 

Exemplo: 

#include 'sqllib.ch' 
endif 

Consulte também: 
SQL DISCONNECT

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 79 


APÊNDICE A 
Índices com a SQL LIB 
A  SQL  LIB  trabalha  com  dois  tipos  de  índices:  SIMPLES  e  CUSTOMIZADO.  Há  grandes 
diferenças  no  modo  como  ela  gerencia  estes  tipos  de  índices  e  o  mais  importante:  índices 
customizados são mais lentos para se atualizar na base de dados. 

Para entendermos melhor, um índice customizado é um índice que possui uma ou mais funções em 
sua chave, eis alguns  exemplos: 

use VENDAS.DBF new alias VENDAS via ‘MySQL’ 
index on SUBSTR( NOME, 1,5) + DTOS( dData )  to CLIANIV.NTX 
index on STRZERO( nPEDIDO )  + VENNOME  to PEDVEN.NTX 
index on DESCEND( dEfetuado )  to EFET.NTX 

No primeiro caso acima, a SQL LIB criará um novo campo chamado SQL_INDEX_CUSTOM001, 
dentro da  tabela  VENDAS. Depois  de  criar  este  campo,  a  SQL LIB  irá  processar  a expressão  do 
índice,  neste caso o “SUBSTR(  NOME,  1,5)  +  DTOC(  Data  )” para todos os registros da tabela, 
armazenando os valores corretos na nova coluna gerada e somente depois disto, irá criar um índice 
com base nesta nova coluna criada. O mesmo processo irá ser repetido nos outros 2 índices criados: 
PEDVEN.NTX e EFET.NTX. 

Como é de se imaginar, este processo pode se tornar extremamente lento, especialmente se a tabela 
em questão possuir alguns milhares ou dezenas de milhares de registros. Exatamente por isto, o uso 
deste tipo de índice é altamente desaconselhado, exceto em casos em que não é possível substitui­lo 
por um índice simples. 

Um  índice  SIMPLES  é  um  índice  formado  pela  junção  de  um  ou  mais  campos,  sem  o  uso  de 
funções. Eis alguns exemplos de como se criar índices simples, utilizando o exemplo citado acima, 
mas agora revisado: 

use VENDAS.DBF new alias VENDAS via ‘MySQL’ 
index on NOME + dData  to CLIANIV.NTX 
index on nPEDIDO + cVENNOME  to PEDVEN.NTX 
index on dEfetuado  to EFET.NTX 

Você pode seguramente concatenar campos do tipo DATA, com campos NUMERICOS ou até mesmo com 
campos  CARACTERES,  sem  necessitar  fazer  uso  de  nenhuma  função  para  converter  os  valores  para 
expressões caracteres – pois a SQL LIB faz isto para você automaticamente! 

Além  disto,  a  SQL  LIB  possui  a  vantagem  única  de  suportar  tanto  a  sintaxe  do  DBFNTX,  como  também 
suportar o uso de TAGs ­ no melhor estilo do DBFCDX. Você pode tranquilamente mesclar ambos os tipos 
de índices em seu sistema e deixar a SQL LIB fazer todo o trabalho para você! 

Nos  três  casos  apresentados  acima,  a  SQL  LIB  irá  criar  um  índice  simples,  ou  seja,  não  será 
necessário criar nenhuma coluna adicional, nem se processar nenhum comando em toda a tabela da 
base  de  dados.  Este  tipo  de  índice,  tende  a  ser  mais  rápido  e  mais  ágil  em  sua  criação,  além  da 
vantagem de que este tipo de dados acelera ainda mais o processo de gravação dos dados na tabela 
por ocasião de um comando REPLACE. 

A SQL LIB possui um parser  interno, que é inteligente o bastante para detectar o uso das funções 
STR(),  DTOC()  e  DTOS()  nas  chaves  passadas  para  criação  de  índices.  Este  parser  detecta  e 
determina se a expressão passada para o comando INDEX ON, pode ser convertida  para um índice 
simples ou se neste caso será mais adequado criar um índice composto para a tabela.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 80 


Eis logo abaixo, alguns exemplos de conversões feitas; se criarmos três índices em uma tabela com 
estas chaves: 

use VENDAS.DBF new alias VENDAS via ‘MySQL’ 
index on DTOS(dData) + cCodigoItem + Str( nPedNum ) to PEDITEM.NTX 
index on DTOS(dData) + cCodigoItem  to PEDDATA.NTX 
index on DTOS(dData) + Str( nVendedor )  to PEDVEND.NTX 

Nos  três  casos  acima,  o  parser  interno  da  SQL  LIB  irá  criar  índices  simples  para  a  tabela  em 
questão,  pois  ele  irá processar  cada  expressão passada  para  a  indexação  como  se  estivessem  sido 
escritas deste modo: 
use VENDAS.DBF new alias VENDAS via ‘MySQL’ 
index on dData + cCodigoItem + nPedNum  to PEDITEM.NTX 
index on dData + cCodigoItem  to PEDDATA.NTX 
index on dData + nVendedor  to PEDVEND.NTX 

Após  a  criação  do  índice,  podemos  testar  a  função  INDEXKEY()  para  checarmos  como  foi 
indexado a tabela acima: 
use VENDAS.DBF new alias VENDAS via ‘MySQL’ 
set index to peditem, peddata, pedvend 

set order to 1 
? indexkey()  // Resultado: DTOS(dData) + cCodigoItem + Str( nPedNum ) 

set order to 2 
? indexkey()  // Resultado: DTOS(dData) + cCodigoItem 

set order to 3 
? indexkey()  // Resultado: DTOS(dData) + Str( nVendedor ) 

quit 

Este recurso é especialmente útil, quando se migra um aplicativo já existente para se trabalhar com a 
SQL,  pois  a  SQL  LIB  pode  determinar  qual  será  o  modo  que  irá  lhe  dar  o  melhor  desempenho 
possível. 

Exemplo: 
demos\index.prg 

Consulte também: 
SQL CUSTOM INDEXES

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 81 


APÊNDICE B 
Dicas de per for mance 
É possível aumentar o desempenho de aplicativos escritos com a SQL LIB observando­se algumas 
dicas simples. 

DICA n° 1:

·  Ao  se  inserir diversos registros,  é  possível  ganhar  performance alterando poucas  linhas  no 


sistema, proceda assim: 
/* 
* Inclua os comandos dentro de um bloco de 
* transação para ganhar desempenho 
*/ 

? 'puxando dados' 

BEGIN TRANSACTION 
append from test.dbf via 'DBFNTX' 
END TRANSACTION 

/* 
* O mesmo vale se você possuir vários comandos de 
* gravação. Como neste exemplo: 
*/ 
BEGIN TRANSACTION 

SELECT TEST 
GO TOP 

WHILE !Eof() 

SELECT TESTSQL 
APPEND BLANK 

REPLACE COD    WITH TEST­>COD 
REPLACE NOME   WITH TEST­>NOME 
REPLACE ANIV   WITH TEST­>ANIV 
REPLACE BLOQ   WITH TEST­>BLOQ 
REPLACE LIMC   WITH TEST­>LIMC 
REPLACE ULTC   WITH TEST­>ULTC 
REPLACE ATIV   WITH TEST­>ATIV 
COMMIT 

SELECT TEST 
SKIP 
End 

END TRANSACTION 

Você  ganha  muita  performance  trabalhando  como  o  exemplo  acima,  pois  todos  os 
COMMITs  enviados dentro do  bloco BEGIN/END  TRANSACTION  serão  ignorados  e  os 
dados comitados apenas no final do bloco, acelerando em muito o tempo de gravação. 

Seguindo­se este exemplo, chega­se a levar 0.05 segundos para adicionar 2.415 registros.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 82 


DICA n° 2:

·  Substituir  quando  possível  o  comando  SET  FILTER  pelo  uso  de  SQL  FILTER  que  é 
executado do lado do servidor, ganhando assim desempenho máximo. Veja um exemplo: 
/* 
* Exemplo do comando SET FILTER 
*/ 
SELECT pedido_itens 
SET FILTER TO pedido_num = pedido­>numero 
GO TOP 

/* 
* Mesmo comando agora com SQL FILTER: 
*/ 
SELECT pedido_itens 
SQL FILTER TO “pedido_num = ” + nTrim( pedido­>numero ) 
GO TOP

·  O mesmo vale para o comando SET RELATION que se possível deve ser substituído pela 
função ORDSCOPE(). 

Seguindo­se estas sugestões simples, você obterá o máximo de desempenho em seu aplicativo.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 83 


APÊNDICE C 
Usando o FiveWin e a SQL LIB RDD. 
O  uso da  SQL  LIB RDD  com  o FiveWin é  uma  opção  excelente para o programador.  Com  estas 
duas ferramentas em mãos é possível utilizar a melhor ferramenta comercial para desenvolvimento 
visual e a melhor opção para comunicação com bancos de dados SQL. 

No entanto alguns cuidados devem ser observados para que seu aplicativo venha a trabalhar de 
modo  correto,  pois  algumas  rotinas  utilizadas  pela  SQL  LIB  já  existem  disponíveis  dentro  do 
FiveWin. Isto se deve ao acesso à ODBC fornecido pelo FW já oferecer funções com os nomes tais 
como SQLExecute() e SQLRollback() – o mesmo problema não acontece com nenhuma outra LIB 
visual. 

O resultado deste aparente ‘conflito de funções’ é que estranhamente após dar vários comandos 
SQL  no  banco  de  dados,  as  informações  estranhamente  não  são  gravadas  no  servidor  ou  são 
gravadas apenas quando você sai do seu aplicativo. 

Para  resolver  este  simples  detalhe,  você  deve  certificar­se de  que  os  arquivos  .LIB  fornecidos 
com a SQL LIB estejam antes das libs do FW no momento da linkagem do seu aplicativo ou seja na 
ordem das LIB a SQL LIB deve vir primeiro do que a FiveH.lib e a FiveHC.lib! 

Segue abaixo um pequeno passo­a­passo sobre como resolver este detalhe usando algumas das 
mais comuns ferramentas de compilação e linkagem.

·  MyMake:  Se você estiver usando o MyMake para compilar e linkar seus projetos, saiba que 
ele já possui a opção para corrigir este comportamento. Eis como efetuar o ajuste simples:

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 84 


o  Selecione o RDD da SQL LIB para trabalho em seu projeto clicando sobre a opção 
destacada em vermelho na imagem acima. 

o  O MyMake irá disponibilizar a opção ‘SQL LIB antes das libs do FW’, conforme 
destacado em verde ­ basta deixar esta opção marcada para resolver este detalhe das 
LIBs. 

o  Salve as alterações e compile seu projeto.

·  xDevStudio: Se você usa a xDevStudio para compilar seu projeto ela já possui a opção para 


ajuste deste parâmetro da ordem das libs. 

o  Clique em PROJETO > PROPRIEDADES a janela de ‘Opções do projeto’ 
semelhante à imagem acima irá se abrir. 

o  Clique em CONFIGURAR COMPILADORES SELECIONADOS conforme 
destacado em verde na imagem acima. 

o  Na seqüência deixe a opção ‘SQL LIB antes das LIB do FW’ (destacado em vermelho 
acima) setado como ‘SIM’. 

o  Salve as alterações e compile seu projeto.

SQL LIB RDD® para Harbour & xHarbour, © 2003­ 2006  por Vailton Renato – renato@rdd.com.br. Todos os direitos são reservados.  Pág. 85