Clipper On Line • Ver Tópico - Pedido de ajuda simples no MySql

Pedido de ajuda simples no MySql

Discussão sobre SQL

Moderador: Moderadores

 

Pedido de ajuda simples no MySql

Mensagempor alxsts » 05 Abr 2014 03:53

Olá!

Após a instalação do driver, você precisará configurar uma fonte de dados de sistema em seu computador e associá-la na string de conexão ao seu banco de dados.

Veja neste tópico como foi feito para Oracle e adapte para MySql.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Pedido de ajuda simples no MySql

Mensagempor rochinha » 05 Abr 2014 12:08

Amiguinho,

Não sei qual a versão do seu Windows mas em cada um pode mudar a posição do painel de controle ODBC.

Portanto veja no Painel de Controle/Fontes de dados ODBC ou no menu Iniciar/Ferramentas Administrativas/Fontes de dados ODBC.

Veja na aba Fontes de dados do Usuário se tem algo com MySQL ODBC X.XX Driver, senão:

- clique no botão Adicionar
- procure e escolha MySQL ODBC X.XX Driver
- clique em Concluir.

Na tela MySQL ODBC X.XX Driver - DSN Configuration digite em:

- Data Source Name - TESTEADO
- Host/Server Name - localhost
- Database Name - mysql
- User - root
- Port - 3306

Clique no botão Test Data Source e veja se dá Sucessfully.

Tente executar novamente os testes. Lembrando que no .PRG o USE mysql refere-se a um database com este nome existente no MySQL onde estão armazenados todos os usuarios.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Pedido de ajuda simples no MySql

Mensagempor cjp » 06 Abr 2014 00:46

Alexandre,

Vc judiou de mim. Não vou conseguir fazer essa adaptação. Não é falta de vontade, é falta de conhecimento mesmo. Vi todo o post, mas não consigo saber o que adaptar.

Rochinha,

Eu estou usando o Windows 7. Fiz o que vc disse, mas deu erro. Veja:

Imagem
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Pedido de ajuda simples no MySql

Mensagempor rochinha » 06 Abr 2014 01:29

Amiguinho,

Todo mundo passou batido e a pergunta é:

Voce instalou o MySQL Server? tem um serviço chamado mysqld-nt.exe ou mysqld5-nt.exe rodando no gerenciador de tarefas?

Senão, voce deve ir no mesmo lugar de onde baixou o MySQL ODBC Driver e baixar o MySQL Server. Instale, bastando confirmar todas as telas sem muita frescura.

Depois rode os exemplos que usam MySQL.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Pedido de ajuda simples no MySql

Mensagempor rochinha » 06 Abr 2014 13:49

Amiguinhos,

Apesar da minha insistência para que o amigo instale o MySQL e etc, sendo que o mesmo quer aprender a usar Oracle, é porque os exemplos que tenho são fáceis de entender a mecanica de conexão.

Uma vez aprendido como se conectar com um database tão fácil de instalar como MySQL o colega saberá como fazer o mesmo com outros databases.

Antes de aprender a andar, engatinhamos.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Pedido de ajuda simples no MySql

Mensagempor cjp » 07 Abr 2014 01:34

Não é que eu queira exatamente o Oracle. É que, como estou tão cru nessa questão, quero começar pelo mais fácil, para ir aprendendo aos poucos. O que vocês me recomendarem, eu vou fazer, sem dúvida.

Baixei o MySQL Server deste site: http://dev.mysql.com/downloads/file.php?id=451431. Não sei se está certo.

Ele baixou o arquivo mysql-5.6.17-win32.zip.

Ocorre que, aparentemente, ele não tem um arquivo de instalação. Veja o conteúdo desse zip:

Imagem

Qual arquivo devo executar?
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Pedido de ajuda simples no MySql

Mensagempor rochinha » 09 Abr 2014 13:37

Amiguinho,

Não consigo abrir a imagem, sempre da erro:

Ops! O Google Chrome não conseguiu localizar pt.tinypic.com

Você quis dizer: pl.­tinypic.­com/­view.­php


Crie a MYSQL pasta no C:

Decompacte este conteúdo na basta ficando C:\mysql, c:\mysql\bin e c:\mysql\data.

Entre na pasta BIN salve o conteúdo abaixo no arquivo RUN-ME.BAT:
copy my.ini %windir%

if not exist %windir%\my.ini goto erro
mysqld-nt --remove MySQL
mysqld-nt --install MySQL
goto fim

:erro
@echo Arquivo MY.INI nao foi carregado para a pasta do Windows

:fim
pause


Execute o arquivo RUN-ME.BAT e verifique se o mysqld-nt.exe esta no Task Manager.

Caso não exista o mysqld-nt.exe troque as chamadas no .BAT para mysqld5-nt ou mysqld6-nt, conforme o que voce encontrar na pasta BIN.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Pedido de ajuda simples no MySql

Mensagempor cjp » 11 Abr 2014 01:22

Fiz o que vc disse. Mas não tem o arquivo mysqld... na pasta Windows, nem em nenhuma pasta do meu computador.
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Pedido de ajuda simples no MySql

Mensagempor rochinha » 11 Abr 2014 11:36

Amiguinho,

[quote Voce escreveu:]Mas não tem o arquivo mysqld... na pasta Windows, nem em nenhuma pasta do meu computador[/quote]

Como não?

Voce escreveu:
Baixei o MySQL Server deste site: http://dev.mysql.com/downloads/file.php?id=451431.


Eu escrevi:
Voce instalou o MySQL Server?


Voce precisa descompactar o conteúdo na pasta C:\mysql.

Em post anterior escrevi:

Crie a MYSQL pasta no C:

Decompacte este conteúdo na basta ficando C:\mysql, c:\mysql\bin e c:\mysql\data.

Entre na pasta BIN salve o conteúdo...
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Pedido de ajuda simples no MySql

Mensagempor cjp » 14 Abr 2014 01:09

Não sei se te entendi bem, mas vamos lá:

1) Tenho o conteúdo do MySQL Server na pasta c:\mysql, conforme segue:

 O volume na unidade C nÆo tem nome.
O N£mero de S‚rie do Volume ‚ 9A06-814E

Pasta de C:\mysql

11/04/2014  01:15    <DIR>          .
11/04/2014  01:15    <DIR>          ..
21/03/2014  00:19    <DIR>          bin
21/03/2014  00:18            17.987 COPYING
21/03/2014  00:30    <DIR>          data
21/03/2014  00:19    <DIR>          docs
21/03/2014  00:19    <DIR>          include
21/03/2014  00:19    <DIR>          lib
21/03/2014  00:18             1.141 my-default.ini
21/03/2014  00:21    <DIR>          mysql-test
21/03/2014  00:18             2.496 README
11/04/2014  01:15               215 run-me.bat
21/03/2014  00:22    <DIR>          scripts
21/03/2014  00:22    <DIR>          share
21/03/2014  00:22    <DIR>          sql-bench
21/03/2014  00:22    <DIR>          support-files
               4 arquivo(s)         21.839 bytes
              12 pasta(s)   747.734.597.632 bytes dispon¡veis


2) A subpasta BIN está assim:

 O volume na unidade C nÆo tem nome.
O N£mero de S‚rie do Volume ‚ 9A06-814E

Pasta de C:\mysql\bin

21/03/2014  00:19    <DIR>          .
21/03/2014  00:19    <DIR>          ..
21/03/2014  00:18           123.392 echo.exe
21/03/2014  00:18         1.216.512 echo.pdb
21/03/2014  00:18         3.892.736 innochecksum.exe
21/03/2014  00:18         3.813.376 innochecksum.pdb
21/03/2014  00:18         4.281.344 myisamchk.exe
21/03/2014  00:18         5.124.096 myisamchk.pdb
21/03/2014  00:18         4.085.248 myisamlog.exe
21/03/2014  00:18         4.526.080 myisamlog.pdb
21/03/2014  00:18         4.195.328 myisampack.exe
21/03/2014  00:18         4.984.832 myisampack.pdb
21/03/2014  00:18         4.167.168 myisam_ftdump.exe
21/03/2014  00:18         4.861.952 myisam_ftdump.pdb
21/03/2014  00:18         4.566.528 mysql.exe
21/03/2014  00:18         6.746.112 mysql.pdb
21/03/2014  00:18         4.493.824 mysqladmin.exe
21/03/2014  00:18         6.516.736 mysqladmin.pdb
21/03/2014  00:18         4.627.968 mysqlbinlog.exe
21/03/2014  00:18         7.122.944 mysqlbinlog.pdb
21/03/2014  00:18         4.487.680 mysqlcheck.exe
21/03/2014  00:18         6.418.432 mysqlcheck.pdb
21/03/2014  00:18        27.538.944 mysqld-debug.exe
21/03/2014  00:18        35.876.864 mysqld-debug.pdb
21/03/2014  00:18        10.966.528 mysqld.exe
21/03/2014  00:18        35.328.000 mysqld.pdb
21/03/2014  00:18         4.553.216 mysqldump.exe
21/03/2014  00:18         6.606.848 mysqldump.pdb
21/03/2014  00:18             7.635 mysqldumpslow.pl
21/03/2014  00:18            27.822 mysqld_multi.pl
21/03/2014  00:18            36.010 mysqlhotcopy.pl
21/03/2014  00:18         4.481.024 mysqlimport.exe
21/03/2014  00:18         6.426.624 mysqlimport.pdb
21/03/2014  00:18         4.482.048 mysqlshow.exe
21/03/2014  00:18         6.410.240 mysqlshow.pdb
21/03/2014  00:18         4.503.552 mysqlslap.exe
21/03/2014  00:18         6.541.312 mysqlslap.pdb
21/03/2014  00:18         4.730.880 mysqltest.exe
21/03/2014  00:18         7.278.592 mysqltest.pdb
21/03/2014  00:18        11.760.640 mysqltest_embedded.exe
21/03/2014  00:18        33.067.008 mysqltest_embedded.pdb
21/03/2014  00:18         4.934.144 mysql_client_test.exe
21/03/2014  00:18        12.005.888 mysql_client_test_embedded.exe
21/03/2014  00:18        33.075.200 mysql_client_test_embedded.pdb
21/03/2014  00:18             9.102 mysql_config.pl
21/03/2014  00:18         4.316.672 mysql_config_editor.exe
21/03/2014  00:18         5.820.416 mysql_config_editor.pdb
21/03/2014  00:18             4.413 mysql_convert_table_format.pl
21/03/2014  00:18        11.625.984 mysql_embedded.exe
21/03/2014  00:18        32.731.136 mysql_embedded.pdb
21/03/2014  00:18         3.898.880 mysql_plugin.exe
21/03/2014  00:18         3.813.376 mysql_plugin.pdb
21/03/2014  00:18            10.518 mysql_secure_installation.pl
21/03/2014  00:18         3.791.872 mysql_tzinfo_to_sql.exe
21/03/2014  00:18         3.379.200 mysql_tzinfo_to_sql.pdb
21/03/2014  00:18         4.039.680 mysql_upgrade.exe
21/03/2014  00:18         3.911.680 mysql_upgrade.pdb
21/03/2014  00:18         3.884.032 my_print_defaults.exe
21/03/2014  00:18         3.690.496 my_print_defaults.pdb
21/03/2014  00:18         3.999.744 perror.exe
21/03/2014  00:19         3.895.296 perror.pdb
21/03/2014  00:19         3.804.672 replace.exe
21/03/2014  00:19         3.452.928 replace.pdb
21/03/2014  00:19         3.883.008 resolveip.exe
21/03/2014  00:19         3.690.496 resolveip.pdb
              63 arquivo(s)    458.544.908 bytes
               2 pasta(s)   747.734.568.960 bytes dispon¡veis


O que falta?
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Pedido de ajuda simples no MySql

Mensagempor rochinha » 14 Abr 2014 12:02

Amiguinho,

Voltar 3 posts atrás e executar os passos passados.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Pedido de ajuda simples no MySql

Mensagempor cjp » 17 Abr 2014 01:13

Vc está falando deste post?

Amiguinho,

Não consigo abrir a imagem, sempre da erro:

Ops! O Google Chrome não conseguiu localizar pt.tinypic.com

Você quis dizer: pl.­tinypic.­com/­view.­php

Crie a MYSQL pasta no C:

Decompacte este conteúdo na basta ficando C:\mysql, c:\mysql\bin e c:\mysql\data.

Entre na pasta BIN salve o conteúdo abaixo no arquivo RUN-ME.BAT:
Expandir visualizacaoVer codigo
01 copy my.ini %windir%
02
03 if not exist %windir%\my.ini goto erro
04 mysqld-nt --remove MySQL
05 mysqld-nt --install MySQL
06 goto fim
07
08 :erro
09 @echo Arquivo MY.INI nao foi carregado para a pasta do Windows
10
11 :fim
12 pause
13

Execute o arquivo RUN-ME.BAT e verifique se o mysqld-nt.exe esta no Task Manager.

Caso não exista o mysqld-nt.exe troque as chamadas no .BAT para mysqld5-nt ou mysqld6-nt, conforme o que voce encontrar na pasta BIN.


Se for, fiz de novo, mas já dá problema no início, pois não tem o arquivo my.ini.
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Pedido de ajuda simples no MySql

Mensagempor dbsh » 28 Abr 2014 17:51

desinstale todos mysql que tenha instalado

Nesta pagina você tem os instaladores MYSQL WEB e OFFLINE da ultima versão, bem mais fácil e só avançar, quase todo automático
http://dev.mysql.com/downloads/installer/

MYSQL 5.6:
http://dev.mysql.com/downloads/installer/5.6.html

Nesta pagina você tem a ultima versão dos instaladores ODBC para MYSQL
http://dev.mysql.com/downloads/connector/odbc/

MYSQL ODBC 5.1:
http://dev.mysql.com/downloads/connector/odbc/5.1.html

MYSQL ODBC 5.2:
http://dev.mysql.com/downloads/connector/odbc/5.2.html

MYSQL ODBC 5.3:
http://dev.mysql.com/downloads/connector/odbc/5.3.html

No Arquivo Adordd.prg, a string de coneção que uso para MYSQL ODBC 5.1:
aWAData[ WA_CONNECTION ]:Open( "Driver={MySQL ODBC 5.1 Driver};Server=127.0.0.1;Port=3306;Database=paf;uid=root;pwd=root;" )

OBS:
Pegue os link com extensão .msi
Avatar de usuário

dbsh
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 115
Data de registro: 14 Jul 2004 14:19
Cidade/Estado: ES
Curtiu: 2 vezes
Mens.Curtidas: 15 vezes

Pedido de ajuda simples no MySql

Mensagempor cjp » 02 Mai 2014 02:09

Colega,

Baixei o Mysql 5.6 e o instalador Odbc da última versão.

O arquivo adordd.prg está assim:

/*
* Harbour Project source code:
* ADORDD - RDD to automatically manage Microsoft ADO
*
* Copyright 2007 Fernando Mancera <fmancera@viaopen.com> and
* Antonio Linares <alinares@fivetechsoft.com>
* www - http://harbour-project.org
*
* Copyright 2007-2008 Miguel Angel Marchuet <miguelangel@marchuet.net>
*  ADO_GOTOID( nWA, nRecord )
*  ADO_GOTO( nWA, nRecord )
*  ADO_OPEN( nWA, aOpenInfo ) some modifications
*     Open: Excel files
*           Paradox files
*           Access with password
*           FireBird
*  ADO_CLOSE( nWA )
*  ADO_ZAP( nWA )
*  ADO_ORDINFO( nWA, nIndex, aOrderInfo ) some modifications
*  ADO_RECINFO( nWA, nRecord, nInfoType, uInfo )
*  ADO_FIELDINFO( nWA, nField, nInfoType, uInfo )
*  ADO_FIELDNAME( nWA, nField )
*  ADO_FORCEREL( nWA )
*  ADO_RELEVAL( nWA, aRelInfo )
*  ADO_EXISTS( nRdd, cTable, cIndex, ulConnect )
*  ADO_DROP(  nRdd, cTable, cIndex, ulConnect )
*  ADO_LOCATE( nWA, lContinue )
*
* www - http://www.xharbour.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; see the file COPYING.txt.  If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
*
* As a special exception, the Harbour Project gives permission for
* additional uses of the text contained in its release of Harbour.
*
* The exception is that, if you link the Harbour libraries with other
* files to produce an executable, this does not by itself cause the
* resulting executable to be covered by the GNU General Public License.
* Your use of that executable is in no way restricted on account of
* linking the Harbour library code into it.
*
* This exception does not however invalidate any other reasons why
* the executable file might be covered by the GNU General Public License.
*
* This exception applies only to the code released by the Harbour
* Project under the name Harbour.  If you copy code from other
* Harbour Project or Free Software Foundation releases into a copy of
* Harbour, as the General Public License permits, the exception does
* not apply to the code that you add in this way.  To avoid misleading
* anyone as to the status of such modified files, you must delete
* this exception notice from them.
*
* If you write modifications of your own for Harbour, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice.
*
*/

#include "rddsys.ch"
#include "fileio.ch"
#include "error.ch"
#include "adordd.ch"
#include "dbstruct.ch"
#include "dbinfo.ch"

#include "hbusrrdd.ch"

#define WA_RECORDSET   1
#define WA_BOF         2
#define WA_EOF         3
#define WA_CONNECTION  4
#define WA_CATALOG     5
#define WA_TABLENAME   6
#define WA_ENGINE      7
#define WA_SERVER      8
#define WA_USERNAME    9
#define WA_PASSWORD   10
#define WA_QUERY      11
#define WA_LOCATEFOR  12
#define WA_SCOPEINFO  13
#define WA_SQLSTRUCT  14
#define WA_CONNOPEN   15
#define WA_PENDINGREL 16
#define WA_FOUND      17

#define WA_SIZE       17

#define RDD_CONNECTION 1
#define RDD_CATALOG    2

#define RDD_SIZE       2

ANNOUNCE ADORDD

*THREAD STATIC t_cTableName
*THREAD STATIC t_cEngine
*THREAD STATIC t_cServer
*THREAD STATIC t_cUserName
*THREAD STATIC t_cPassword
*THREAD STATIC t_cQuery := ""

STATIC FUNCTION ADO_INIT( nRDD )

   LOCAL aRData := Array( RDD_SIZE )

   USRRDD_RDDDATA( nRDD, aRData )

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_NEW( nWA )

   LOCAL aWAData := Array( WA_SIZE )

   aWAData[ WA_BOF ] := .F.
   aWAData[ WA_EOF ] := .F.

   USRRDD_AREADATA( nWA, aWAData )

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_CREATE( nWA, aOpenInfo )

   LOCAL cDataBase  := hb_tokenGet( aOpenInfo[ UR_OI_NAME ], 1, ";" )
   LOCAL cTableName := hb_tokenGet( aOpenInfo[ UR_OI_NAME ], 2, ";" )
   LOCAL cDbEngine  := hb_tokenGet( aOpenInfo[ UR_OI_NAME ], 3, ";" )
   LOCAL cServer    := hb_tokenGet( aOpenInfo[ UR_OI_NAME ], 4, ";" )
   LOCAL cUserName  := hb_tokenGet( aOpenInfo[ UR_OI_NAME ], 5, ";" )
   LOCAL cPassword  := hb_tokenGet( aOpenInfo[ UR_OI_NAME ], 6, ";" )

   LOCAL oConnection := win_oleCreateObject( "ADODB.Connection" )
   LOCAL oCatalog := win_oleCreateObject( "ADOX.Catalog" )
   LOCAL aWAData := USRRDD_AREADATA( nWA )
   LOCAL oError, n

   DO CASE
   CASE Lower( Right( cDataBase, 4 ) ) == ".mdb"
      IF ! hb_FileExists( cDataBase )
         oCatalog:Create( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + cDataBase )
      ENDIF
      oConnection:Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + cDataBase )

   CASE Lower( Right( cDataBase, 4 ) ) == ".xls"
      IF ! hb_FileExists( cDataBase )
         oCatalog:Create( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + cDataBase + ";Extended Properties='Excel 8.0;HDR=YES';Persist Security Info=False" )
      ENDIF
      oConnection:Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + cDataBase + ";Extended Properties='Excel 8.0;HDR=YES';Persist Security Info=False" )

   CASE Lower( Right( cDataBase, 3 ) ) == ".db"
      IF ! hb_FileExists( cDataBase )
         oCatalog:Create( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + cDataBase + ";Extended Properties='Paradox 3.x';" )
      ENDIF
      oConnection:Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + cDataBase + ";Extended Properties='Paradox 3.x';" )

   CASE Lower( Right( cDataBase, 4 ) ) == ".fdb"
      IF ! hb_FileExists( cDataBase )
         oCatalog:Create( "Driver=Firebird/InterBase(r) driver;Uid=" + cUserName + ";Pwd=" + cPassword + ";DbName=" + cDataBase + ";" )
      ENDIF
      oConnection:Open( "Driver=Firebird/InterBase(r) driver;Uid=" + cUserName + ";Pwd=" + cPassword + ";DbName=" + cDataBase + ";" )
      oConnection:CursorLocation := adUseClient

   CASE Upper( cDbEngine ) == "MYSQL"
        aWAData[ WA_CONNECTION ]:Open( "Driver={MySQL ODBC 5.6 Driver};Server=127.0.0.1;Port=3306;Database=paf;uid=root;pwd=root;" )
//      oConnection:Open( ;
//         "Driver={MySQL ODBC 3.51 Driver};" + ;
//         "server=" + cServer + ;
//         ";database=" + cDataBase + ;
//         ";uid=" + cUserName + ;
//         ";pwd=" + cPassword )

   ENDCASE

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
      oConnection:Execute( "DROP TABLE " + cTableName )
   RECOVER
   END SEQUENCE

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
      IF Lower( Right( cDataBase, 4 ) ) == ".fdb"
         oConnection:Execute( "CREATE TABLE " + cTableName + " (" + StrTran( StrTran( aWAData[ WA_SQLSTRUCT ], "[", '"' ), "]", '"' ) + ")" )
      ELSE
         oConnection:Execute( "CREATE TABLE [" + cTableName + "] (" + aWAData[ WA_SQLSTRUCT ] + ")" )
      ENDIF
   RECOVER
      oError := ErrorNew()
      oError:GenCode := EG_CREATE
      oError:SubCode := 1004
      oError:Description := hb_langErrMsg( EG_CREATE ) + " (" + ;
         hb_langErrMsg( EG_UNSUPPORTED ) + ")"
      oError:FileName := aOpenInfo[ UR_OI_NAME ]
      oError:CanDefault := .T.

      FOR n := 0 TO oConnection:Errors:Count - 1
         oError:Description += oConnection:Errors( n ):Description
      NEXT

      UR_SUPER_ERROR( nWA, oError )
   END SEQUENCE

   oConnection:Close()

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_CREATEFIELDS( nWA, aStruct )

   LOCAL aWAData := USRRDD_AREADATA( nWA )
   LOCAL n

   aWAData[ WA_SQLSTRUCT ] := ""

   FOR n := 1 TO Len( aStruct )
      IF n > 1
         aWAData[ WA_SQLSTRUCT ] += ", "
      ENDIF
      aWAData[ WA_SQLSTRUCT ] += "[" + aStruct[ n ][ DBS_NAME ] + "]"
      DO CASE
      CASE aStruct[ n ][ DBS_TYPE ] $ "C,Character"
         aWAData[ WA_SQLSTRUCT ] += " CHAR(" + hb_ntos( aStruct[ n ][ DBS_LEN ] ) + ") NULL"

      CASE aStruct[ n ][ DBS_TYPE ] == "V"
         aWAData[ WA_SQLSTRUCT ] += " VARCHAR(" + hb_ntos( aStruct[ n ][ DBS_LEN ] ) + ") NULL"

      CASE aStruct[ n ][ DBS_TYPE ] == "B"
         aWAData[ WA_SQLSTRUCT ] += " DOUBLE NULL"

      CASE aStruct[ n ][ DBS_TYPE ] == "Y"
         aWAData[ WA_SQLSTRUCT ] += " SMALLINT NULL"

      CASE aStruct[ n ][ DBS_TYPE ] == "I"
         aWAData[ WA_SQLSTRUCT ] += " MEDIUMINT NULL"

      CASE aStruct[ n ][ DBS_TYPE ] == "D"
         aWAData[ WA_SQLSTRUCT ] += " DATE NULL"

      CASE aStruct[ n ][ DBS_TYPE ] == "T"
         aWAData[ WA_SQLSTRUCT ] += " DATETIME NULL"

      CASE aStruct[ n ][ DBS_TYPE ] == "@"
         aWAData[ WA_SQLSTRUCT ] += " TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP"

      CASE aStruct[ n ][ DBS_TYPE ] == "M"
         aWAData[ WA_SQLSTRUCT ] += " TEXT NULL"

      CASE aStruct[ n ][ DBS_TYPE ] == "N"
         aWAData[ WA_SQLSTRUCT ] += " NUMERIC(" + hb_ntos( aStruct[ n ][ DBS_LEN ] ) + ")"

      CASE aStruct[ n ][ DBS_TYPE ] == "L"
         aWAData[ WA_SQLSTRUCT ] += " LOGICAL"
      ENDCASE
   NEXT

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_OPEN( nWA, aOpenInfo )

   LOCAL aWAData := USRRDD_AREADATA( nWA )
   LOCAL cName, aField, oError, nResult
   LOCAL oRecordSet, nTotalFields, n

   /* When there is no ALIAS we will create new one using file name */
   IF Empty( aOpenInfo[ UR_OI_ALIAS ] )
      hb_FNameSplit( aOpenInfo[ UR_OI_NAME ],, @cName )
      aOpenInfo[ UR_OI_ALIAS ] := cName
   ENDIF

   IF Empty( aOpenInfo[ UR_OI_CONNECT ] )
      aWAData[ WA_CONNECTION ] := win_oleCreateObject( "ADODB.Connection" )
      aWAData[ WA_TABLENAME ] := t_cTableName
      aWAData[ WA_QUERY ] := t_cQuery
      aWAData[ WA_USERNAME ] := t_cUserName
      aWAData[ WA_PASSWORD ] := t_cPassword
      aWAData[ WA_SERVER ] := t_cServer
      aWAData[ WA_ENGINE ] := t_cEngine
      aWAData[ WA_CONNOPEN ] := .T.

      DO CASE
      CASE Lower( Right( aOpenInfo[ UR_OI_NAME ], 4 ) ) == ".mdb"
         IF Empty( aWAData[ WA_PASSWORD ] )
            aWAData[ WA_CONNECTION ]:Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + aOpenInfo[ UR_OI_NAME ] )
         ELSE
            aWAData[ WA_CONNECTION ]:Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + aOpenInfo[ UR_OI_NAME ] + ";Jet OLEDB:Database Password=" + AllTrim( aWAData[ WA_PASSWORD ] ) )
         ENDIF

      CASE Lower( Right( aOpenInfo[ UR_OI_NAME ], 4 ) ) == ".xls"
         aWAData[ WA_CONNECTION ]:Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + aOpenInfo[ UR_OI_NAME ] + ";Extended Properties='Excel 8.0;HDR=YES';Persist Security Info=False" )

      CASE Lower( Right( aOpenInfo[ UR_OI_NAME ], 4 ) ) == ".dbf"
         aWAData[ WA_CONNECTION ]:Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + aOpenInfo[ UR_OI_NAME ] + ";Extended Properties=dBASE IV;User ID=Admin;Password=;" )

      CASE Lower( Right( aOpenInfo[ UR_OI_NAME ], 3 ) ) == ".db"
         aWAData[ WA_CONNECTION ]:Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + aOpenInfo[ UR_OI_NAME ] + ";Extended Properties='Paradox 3.x';" )

      CASE aWAData[ WA_ENGINE ] == "MYSQL"
           aWAData[ WA_CONNECTION ]:Open( "Driver={MySQL ODBC 5.6 Driver};Server=127.0.0.1;Port=3306;Database=paf;uid=root;pwd=root;" )
//         aWAData[ WA_CONNECTION ]:Open( "DRIVER={MySQL ODBC 5.6 Driver};" + ;
//            "server=" + aWAData[ WA_SERVER ] + ;
//            ";database=" + aOpenInfo[ UR_OI_NAME ] + ;
//            ";uid=" + aWAData[ WA_USERNAME ] + ;
//            ";pwd=" + aWAData[ WA_PASSWORD ] )

      CASE aWAData[ WA_ENGINE ] == "SQL"
         aWAData[ WA_CONNECTION ]:Open( "Provider=SQLOLEDB;" + ;
            "server=" + aWAData[ WA_SERVER ] + ;
            ";database=" + aOpenInfo[ UR_OI_NAME ] + ;
            ";uid=" + aWAData[ WA_USERNAME ] + ;
            ";pwd=" + aWAData[ WA_PASSWORD ] )

      CASE aWAData[ WA_ENGINE ] == "ORACLE"
         aWAData[ WA_CONNECTION ]:Open( "Provider=MSDAORA.1;" + ;
            "Persist Security Info=False" + ;
            iif( Empty( aWAData[ WA_SERVER ] ), ;
            "", ";Data source=" + aWAData[ WA_SERVER ] ) + ;
            ";User ID=" + aWAData[ WA_USERNAME ] + ;
            ";Password=" + aWAData[ WA_PASSWORD ] )

      CASE aWAData[ WA_ENGINE ] == "FIREBIRD"
         aWAData[ WA_CONNECTION ]:Open( "Driver=Firebird/InterBase(r) driver;" + ;
            "Persist Security Info=False" + ;
            ";Uid=" + aWAData[ WA_USERNAME ] + ;
            ";Pwd=" + aWAData[ WA_PASSWORD ] + ;
            ";DbName=" + aOpenInfo[ UR_OI_NAME ] )
      ENDCASE
   ELSE
      aWAData[ WA_CONNECTION ] := win_oleAuto()
      aWAData[ WA_CONNECTION ]:__hObj := aOpenInfo[ UR_OI_CONNECT ] /* "ADODB.Connection" */
      aWAData[ WA_TABLENAME ] := t_cTableName
      aWAData[ WA_QUERY ] := t_cQuery
      aWAData[ WA_USERNAME ] := t_cUserName
      aWAData[ WA_PASSWORD ] := t_cPassword
      aWAData[ WA_SERVER ] := t_cServer
      aWAData[ WA_ENGINE ] := t_cEngine
      aWAData[ WA_CONNOPEN ] := .F.
   ENDIF

   /* will be initilized */
   t_cQuery := ""

   IF Empty( aWAData[ WA_QUERY ] )
      aWAData[ WA_QUERY ] := "SELECT * FROM "
   ENDIF

   oRecordSet := win_oleCreateObject( "ADODB.Recordset" )

   IF oRecordSet == NIL
      oError := ErrorNew()
      oError:GenCode := EG_OPEN
      oError:SubCode := 1001
      oError:Description := hb_langErrMsg( EG_OPEN )
      oError:FileName := aOpenInfo[ UR_OI_NAME ]
      oError:OsCode := 0 /* TODO */
      oError:CanDefault := .T.

      UR_SUPER_ERROR( nWA, oError )
      RETURN HB_FAILURE
   ENDIF
   oRecordSet:CursorType := adOpenDynamic
   oRecordSet:CursorLocation := adUseClient
   oRecordSet:LockType := adLockPessimistic
   IF aWAData[ WA_QUERY ] == "SELECT * FROM "
      oRecordSet:Open( aWAData[ WA_QUERY ] + aWAData[ WA_TABLENAME ], aWAData[ WA_CONNECTION ] )
   ELSE
      oRecordSet:Open( aWAData[ WA_QUERY ], aWAData[ WA_CONNECTION ] )
   ENDIF

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
      aWAData[ WA_CATALOG ] := win_oleCreateObject( "ADOX.Catalog" )
      aWAData[ WA_CATALOG ]:ActiveConnection := aWAData[ WA_CONNECTION ]
   RECOVER
   END SEQUENCE

   IF Empty( aWAData[ WA_CATALOG ] )
      BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
         aWAData[ WA_CATALOG ] := aWAData[ WA_CONNECTION ]:OpenSchema( adSchemaIndexes )
      RECOVER
      END SEQUENCE
   ENDIF

   aWAData[ WA_RECORDSET ] := oRecordSet
   aWAData[ WA_BOF ] := aWAData[ WA_EOF ] := .F.

   UR_SUPER_SETFIELDEXTENT( nWA, nTotalFields := oRecordSet:Fields:Count )

   FOR n := 1 TO nTotalFields
      aField := Array( UR_FI_SIZE )
      aField[ UR_FI_NAME ] := oRecordSet:Fields( n - 1 ):Name
      aField[ UR_FI_TYPE ] := ADO_GETFIELDTYPE( oRecordSet:Fields( n - 1 ):Type )
      aField[ UR_FI_TYPEEXT ] := 0
      aField[ UR_FI_LEN ] := ADO_GETFIELDSIZE( aField[ UR_FI_TYPE ], oRecordSet:Fields( n - 1 ):DefinedSize )
      aField[ UR_FI_DEC ] := 0
#ifdef UR_FI_FLAGS
      aField[ UR_FI_FLAGS ] := 0
#endif
#ifdef UR_FI_STEP
      aField[ UR_FI_STEP ] := 0
#endif
      UR_SUPER_ADDFIELD( nWA, aField )
   NEXT

   nResult := UR_SUPER_OPEN( nWA, aOpenInfo )

   IF nResult == HB_SUCCESS
      ADO_GOTOP( nWA )
   ENDIF

   RETURN nResult

STATIC FUNCTION ADO_CLOSE( nWA )

   LOCAL aWAData := USRRDD_AREADATA( nWA )
   LOCAL oRecordSet := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
      oRecordSet:Close()
      IF ! Empty( aWAData[ WA_CONNOPEN ] )
         IF aWAData[ WA_CONNECTION ]:State != adStateClosed
            IF aWAData[ WA_CONNECTION ]:State != adStateOpen
               aWAData[ WA_CONNECTION ]:Cancel()
            ELSE
               aWAData[ WA_CONNECTION ]:Close()
            ENDIF
         ENDIF
      ENDIF
   RECOVER
   END SEQUENCE

   RETURN UR_SUPER_CLOSE( nWA )

STATIC FUNCTION ADO_GETVALUE( nWA, nField, xValue )

   LOCAL aWAData := USRRDD_AREADATA( nWA )
   LOCAL rs := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   IF aWAData[ WA_EOF ] .OR. rs:EOF .OR. rs:BOF
      xValue := NIL
      IF ADO_GETFIELDTYPE( rs:Fields( nField - 1 ):Type ) == HB_FT_STRING
         xValue := Space( rs:Fields( nField - 1 ):DefinedSize )
      ENDIF
   ELSE
      xValue := rs:Fields( nField - 1 ):Value

      IF ADO_GETFIELDTYPE( rs:Fields( nField - 1 ):Type ) == HB_FT_STRING
         IF ValType( xValue ) == "U"
            xValue := Space( rs:Fields( nField - 1 ):DefinedSize )
         ELSE
            xValue := PadR( xValue, rs:Fields( nField - 1 ):DefinedSize )
         ENDIF
      ELSEIF ADO_GETFIELDTYPE( rs:Fields( nField - 1 ):Type ) == HB_FT_DATE
         /* Null values */
         IF ValType( xValue ) == "U"
            xValue := hb_SToD()
         ENDIF
      ELSEIF ADO_GETFIELDTYPE( rs:Fields( nField - 1 ):Type ) == HB_FT_TIMESTAMP
         /* Null values */
         IF ValType( xValue ) == "U"
            xValue := hb_SToD()
         ENDIF
      ENDIF
   ENDIF

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_GOTO( nWA, nRecord )

   LOCAL nRecNo
   LOCAL rs := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   IF rs:RecordCount > 0
      rs:MoveFirst()
      rs:Move( nRecord - 1, 0 )
   ENDIF
   ADO_RECID( nWA, @nRecNo )

   RETURN iif( nRecord == nRecNo, HB_SUCCESS, HB_FAILURE )

STATIC FUNCTION ADO_GOTOID( nWA, nRecord )

   LOCAL nRecNo
   LOCAL rs := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   IF rs:RecordCount > 0
      rs:MoveFirst()
      rs:Move( nRecord - 1, 0 )
   ENDIF
   ADO_RECID( nWA, @nRecNo )

   RETURN iif( nRecord == nRecNo, HB_SUCCESS, HB_FAILURE )

STATIC FUNCTION ADO_GOTOP( nWA )

   LOCAL aWAData := USRRDD_AREADATA( nWA )
   LOCAL oRecordSet := aWAData[ WA_RECORDSET ]

   IF oRecordSet:RecordCount() != 0
      oRecordSet:MoveFirst()
   ENDIF

   aWAData[ WA_BOF ] := .F.
   aWAData[ WA_EOF ] := .F.

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_GOBOTTOM( nWA )

   LOCAL aWAData := USRRDD_AREADATA( nWA )
   LOCAL oRecordSet := aWAData[ WA_RECORDSET ]

   oRecordSet:MoveLast()

   aWAData[ WA_BOF ] := .F.
   aWAData[ WA_EOF ] := .F.

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_SKIPRAW( nWA, nToSkip )

   LOCAL aWAData := USRRDD_AREADATA( nWA )
   LOCAL oRecordSet := aWAData[ WA_RECORDSET ]
   LOCAL nResult := HB_SUCCESS

   IF ! Empty( aWAData[ WA_PENDINGREL ] )
      IF ADO_FORCEREL( nWA ) != HB_SUCCESS
         RETURN HB_FAILURE
      ENDIF
   ENDIF

   IF nToSkip != 0
      IF aWAData[ WA_EOF ]
         IF nToSkip > 0
            RETURN HB_SUCCESS
         ENDIF
         ADO_GOBOTTOM( nWA )
         ++nToSkip
      ENDIF
      BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
         IF aWAData[ WA_CONNECTION ]:State != adStateClosed
            IF nToSkip < 0 .AND. oRecordSet:AbsolutePosition <= - nToSkip
               oRecordSet:MoveFirst()
               aWAData[ WA_BOF ] := .T.
               aWAData[ WA_EOF ] := oRecordSet:EOF
            ELSEIF nToSkip != 0
               oRecordSet:Move( nToSkip )
               aWAData[ WA_BOF ] := .F.
               aWAData[ WA_EOF ] := oRecordSet:EOF
            ENDIF
         ELSE
            nResult := HB_FAILURE
         ENDIF
      RECOVER
         nResult := HB_FAILURE
      END SEQUENCE
   ENDIF

   RETURN nResult

STATIC FUNCTION ADO_BOF( nWA, lBof )

   LOCAL aWAData := USRRDD_AREADATA( nWA )

   lBof := aWAData[ WA_BOF ]

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_EOF( nWA, lEof )

   LOCAL oRecordSet := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]
   LOCAL nResult := HB_SUCCESS

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
      IF USRRDD_AREADATA( nWA )[ WA_CONNECTION ]:State != adStateClosed
         lEof := ( oRecordSet:AbsolutePosition == -3 )
      ENDIF
   RECOVER
      nResult := HB_FAILURE
   END SEQUENCE

   RETURN nResult

STATIC FUNCTION ADO_DELETED( nWA, lDeleted )

   LOCAL oRecordSet := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
      IF oRecordSet:Status == adRecDeleted
         lDeleted := .T.
      ELSE
         lDeleted := .F.
      ENDIF
   RECOVER
      lDeleted := .F.
   END SEQUENCE

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_DELETE( nWA )

   LOCAL oRecordSet := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   oRecordSet:Delete()

   ADO_SKIPRAW( nWA, 1 )

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_RECNO( nWA, nRecNo )

   LOCAL oRecordSet := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]
   LOCAL nResult := HB_SUCCESS

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
      IF USRRDD_AREADATA( nWA )[ WA_CONNECTION ]:State != adStateClosed
         nRecno := iif( oRecordSet:AbsolutePosition == -3, oRecordSet:RecordCount() + 1, oRecordSet:AbsolutePosition )
      ELSE
         nRecno := 0
         nResult := HB_FAILURE
      ENDIF
   RECOVER
      nRecNo := 0
      nResult := HB_FAILURE
   END SEQUENCE

   RETURN nResult

STATIC FUNCTION ADO_RECID( nWA, nRecNo )

   RETURN ADO_RECNO( nWA, @nRecNo )

STATIC FUNCTION ADO_RECCOUNT( nWA, nRecords )

   LOCAL oRecordSet := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   nRecords := oRecordSet:RecordCount()

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_PUTVALUE( nWA, nField, xValue )

   LOCAL aWAData := USRRDD_AREADATA( nWA )
   LOCAL oRecordSet := aWAData[ WA_RECORDSET ]

   IF ! aWAData[ WA_EOF ] .AND. !( oRecordSet:Fields( nField - 1 ):Value == xValue )
      oRecordSet:Fields( nField - 1 ):Value := xValue
      BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
         oRecordSet:Update()
      RECOVER
      END SEQUENCE
   ENDIF

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_APPEND( nWA, lUnLockAll )

   LOCAL oRecordSet := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   HB_SYMBOL_UNUSED( lUnLockAll )

   oRecordSet:AddNew()

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
      oRecordSet:Update()
   RECOVER
   END SEQUENCE

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_FLUSH( nWA )

   LOCAL oRecordSet := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
      oRecordSet:Update()
   RECOVER
   END SEQUENCE

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_ORDINFO( nWA, nIndex, aOrderInfo )

   LOCAL aWAData := USRRDD_AREADATA( nWA )
   LOCAL oRecordSet := aWAData[ WA_RECORDSET ]
   LOCAL nResult := HB_SUCCESS

   DO CASE
   CASE nIndex == DBOI_EXPRESSION
      IF ! Empty( aWAData[ WA_CATALOG ] ) .AND. ! Empty( aOrderInfo[ UR_ORI_TAG ] ) .AND. ;
            aOrderInfo[ UR_ORI_TAG ] < aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Indexes:Count
         aOrderInfo[ UR_ORI_RESULT ] := aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Indexes( aOrderInfo[ UR_ORI_TAG ] ):Name
      ELSE
         aOrderInfo[ UR_ORI_RESULT ] := ""
      ENDIF
   CASE nIndex == DBOI_NAME
      IF ! Empty( aWAData[ WA_CATALOG ] ) .AND. ! Empty( aOrderInfo[ UR_ORI_TAG ] ) .AND. ;
            aOrderInfo[ UR_ORI_TAG ] < aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Indexes:Count
         aOrderInfo[ UR_ORI_RESULT ] := aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Indexes( aOrderInfo[ UR_ORI_TAG ] ):Name
      ELSE
         aOrderInfo[ UR_ORI_RESULT ] := ""
      ENDIF
   CASE nIndex == DBOI_NUMBER
      aOrderInfo[ UR_ORI_RESULT ] := aOrderInfo[ UR_ORI_TAG ]
   CASE nIndex == DBOI_BAGNAME
      aOrderInfo[ UR_ORI_RESULT ] := ""
   CASE nIndex == DBOI_BAGEXT
      aOrderInfo[ UR_ORI_RESULT ] := ""
   CASE nIndex == DBOI_ORDERCOUNT
      IF ! Empty( aWAData[ WA_CATALOG ] )
         aOrderInfo[ UR_ORI_RESULT ] := aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Indexes:Count
      ELSE
         aOrderInfo[ UR_ORI_RESULT ] := 0
      ENDIF
   CASE nIndex == DBOI_FILEHANDLE
      aOrderInfo[ UR_ORI_RESULT ] := 0
   CASE nIndex == DBOI_ISCOND
      aOrderInfo[ UR_ORI_RESULT ] := .F.
   CASE nIndex == DBOI_ISDESC
      aOrderInfo[ UR_ORI_RESULT ] := .F.
   CASE nIndex == DBOI_UNIQUE
      aOrderInfo[ UR_ORI_RESULT ] := .F.
   CASE nIndex == DBOI_POSITION
      IF aWAData[ WA_CONNECTION ]:State != adStateClosed
         ADO_RECID( nWA, @aOrderInfo[ UR_ORI_RESULT ] )
      ELSE
         aOrderInfo[ UR_ORI_RESULT ] := 0
         nResult := HB_FAILURE
      ENDIF
   CASE nIndex == DBOI_RECNO
      IF aWAData[ WA_CONNECTION ]:State != adStateClosed
         ADO_RECID( nWA, @aOrderInfo[ UR_ORI_RESULT ] )
      ELSE
         aOrderInfo[ UR_ORI_RESULT ] := 0
         nResult := HB_FAILURE
      ENDIF
   CASE nIndex == DBOI_KEYCOUNT
      IF aWAData[ WA_CONNECTION ]:State != adStateClosed
         aOrderInfo[ UR_ORI_RESULT ] := oRecordSet:RecordCount
      ELSE
         aOrderInfo[ UR_ORI_RESULT ] := 0
         nResult := HB_FAILURE
      ENDIF
   ENDCASE

   RETURN nResult

STATIC FUNCTION ADO_RECINFO( nWA, nRecord, nInfoType, uInfo )

   LOCAL nResult := HB_SUCCESS

// LOCAL oRecordSet := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   HB_SYMBOL_UNUSED( nWA )

#ifdef UR_DBRI_DELETED
   DO CASE
   CASE nInfoType == UR_DBRI_DELETED
      uInfo := .F.
   CASE nInfoType == UR_DBRI_LOCKED
      uInfo := .T.
   CASE nInfoType == UR_DBRI_RECSIZE
   CASE nInfoType == UR_DBRI_RECNO
      nResult := ADO_RECID( nWA, @nRecord )
   CASE nInfoType == UR_DBRI_UPDATED
      uInfo := .F.
   CASE nInfoType == UR_DBRI_ENCRYPTED
      uInfo := .F.
   CASE nInfoType == UR_DBRI_RAWRECORD
      uInfo := ""
   CASE nInfoType == UR_DBRI_RAWMEMOS
      uInfo := ""
   CASE nInfoType == UR_DBRI_RAWDATA
      nResult := ADO_GOTO( nWA, nRecord )
      uInfo := ""
   ENDCASE
#else
   HB_SYMBOL_UNUSED( nRecord )
   HB_SYMBOL_UNUSED( nInfoType )
   HB_SYMBOL_UNUSED( uInfo )
#endif

   RETURN nResult

STATIC FUNCTION ADO_FIELDNAME( nWA, nField, cFieldName )

   LOCAL nResult := HB_SUCCESS
   LOCAL oRecordSet := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
      cFieldName := oRecordSet:Fields( nField - 1 ):Name
   RECOVER
      cFieldName := ""
      nResult := HB_FAILURE
   END SEQUENCE

   RETURN nResult

STATIC FUNCTION ADO_FIELDINFO( nWA, nField, nInfoType, uInfo )

   LOCAL nType, nLen
   LOCAL oRecordSet := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   DO CASE
   CASE nInfoType == DBS_NAME
      uInfo := oRecordSet:Fields( nField - 1 ):Name

   CASE nInfoType == DBS_TYPE
      nType := ADO_GETFIELDTYPE( oRecordSet:Fields( nField - 1 ):Type )
      DO CASE
      CASE nType == HB_FT_STRING
         uInfo := "C"
      CASE nType == HB_FT_LOGICAL
         uInfo := "L"
      CASE nType == HB_FT_MEMO
         uInfo := "M"
      CASE nType == HB_FT_OLE
         uInfo := "G"
#ifdef HB_FT_PICTURE
      CASE nType == HB_FT_PICTURE
         uInfo := "P"
#endif
      CASE nType == HB_FT_ANY
         uInfo := "V"
      CASE nType == HB_FT_DATE
         uInfo := "D"
#ifdef HB_FT_DATETIME
      CASE nType == HB_FT_DATETIME
         uInfo := "T"
#endif
      CASE nType == HB_FT_TIMESTAMP
         uInfo := "@"
      CASE nType == HB_FT_LONG
         uInfo := "N"
      CASE nType == HB_FT_INTEGER
         uInfo := "I"
      CASE nType == HB_FT_DOUBLE
         uInfo := "B"
      OTHERWISE
         uInfo := "U"
      ENDCASE

   CASE nInfoType == DBS_LEN
      ADO_FIELDINFO( nWA, nField, DBS_TYPE, @nType )
      IF nType == "N"
         nLen := oRecordSet:Fields( nField - 1 ):Precision
      ELSE
         nLen := oRecordSet:Fields( nField - 1 ):DefinedSize
      ENDIF
      /* Un campo mayor de 1024 lo consideramos un campo memo */
      uInfo := iif( nLen > 1024, 10, nLen )

   CASE nInfoType == DBS_DEC
      ADO_FIELDINFO( nWA, nField, DBS_LEN, @nLen )
      ADO_FIELDINFO( nWA, nField, DBS_TYPE, @nType )
      IF oRecordSet:Fields( nField - 1 ):Type == adInteger
         uInfo := 0
      ELSEIF nType == "N"
         uInfo := Min( Max( 0, nLen - 1 - oRecordSet:Fields( nField - 1 ):DefinedSize ), 15 )
      ELSE
         uInfo := 0
      ENDIF
#ifdef DBS_FLAG
   CASE nInfoType == DBS_FLAG
      uInfo := 0
#endif
#ifdef DBS_STEP
   CASE nInfoType == DBS_STEP
      uInfo := 0
#endif
   OTHERWISE
      RETURN HB_FAILURE
   ENDCASE

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_ORDLSTFOCUS( nWA, aOrderInfo )

   HB_SYMBOL_UNUSED( nWA )
   HB_SYMBOL_UNUSED( aOrderInfo )
/* TODO
   LOCAL nRecNo
   LOCAL aWAData    := USRRDD_AREADATA( nWA )
   LOCAL oRecordSet := aWAData[ WA_RECORDSET ]

   ADO_RECID( nWA, @nRecNo )

   oRecordSet:Close()
   IF aOrderInfo[ UR_ORI_TAG ] == 0
       oRecordSet:Open( "SELECT * FROM " + s_aTableNames[ nWA ] , hb_QWith(), adOpenDynamic, adLockPessimistic )
   ELSE
    // oRecordSet:Open( "SELECT * FROM " + ::oTabla:cTabla + " ORDER BY " + ::OrdKey( uTag ) , QWith(), adOpenDynamic, adLockPessimistic, adCmdUnspecified )
       oRecordSet:Open( "SELECT * FROM " + s_aTableNames[ nWA ], hb_QWith(), adOpenDynamic, adLockPessimistic )
   ENDIF
   aOrderInfo[ UR_ORI_RESULT ] := aOrderInfo[ UR_ORI_TAG ]

   ADO_GOTOP( nWA )
   ADO_GOTO( nWA, nRecNo )
*/

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_PACK( nWA )

// LOCAL oRecordSet := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   HB_SYMBOL_UNUSED( nWA )

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_RAWLOCK( nWA, nAction, nRecNo )

// LOCAL oRecordSet := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   /* TODO */

   HB_SYMBOL_UNUSED( nRecNo )
   HB_SYMBOL_UNUSED( nWA )
   HB_SYMBOL_UNUSED( nAction )

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_LOCK( nWA, aLockInfo )

// LOCAL oRecordSet := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   HB_SYMBOL_UNUSED( nWA )

   aLockInfo[ UR_LI_METHOD ] := DBLM_MULTIPLE
   aLockInfo[ UR_LI_RECORD ] := RecNo()
   aLockInfo[ UR_LI_RESULT ] := .T.

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_UNLOCK( nWA, xRecID )

// LOCAL oRecordSet := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   /* TODO */

   HB_SYMBOL_UNUSED( xRecId )
   HB_SYMBOL_UNUSED( nWA )

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_SETFILTER( nWA, aFilterInfo )

   LOCAL oRecordSet := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   oRecordSet:Filter := SQLTranslate( aFilterInfo[ UR_FRI_CEXPR ] )

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_CLEARFILTER( nWA )

   LOCAL oRecordSet := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
      oRecordSet:Filter := ""
   RECOVER
   END SEQUENCE

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_ZAP( nWA )

   LOCAL aWAData := USRRDD_AREADATA( nWA )
   LOCAL oRecordSet := aWAData[ WA_RECORDSET ]

   IF aWAData[ WA_CONNECTION ] != NIL .AND. aWAData[ WA_TABLENAME ] != NIL
      BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
         aWAData[ WA_CONNECTION ]:Execute( "TRUNCATE TABLE " + aWAData[ WA_TABLENAME ] )
      RECOVER
         aWAData[ WA_CONNECTION ]:Execute( "DELETE * FROM " + aWAData[ WA_TABLENAME ] )
      END SEQUENCE
      oRecordSet:Requery()
   ENDIF

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_SETLOCATE( nWA, aScopeInfo )

   LOCAL aWAData := USRRDD_AREADATA( nWA )

   aScopeInfo[ UR_SI_CFOR ] := SQLTranslate( aWAData[ WA_LOCATEFOR ] )

   aWAData[ WA_SCOPEINFO ] := aScopeInfo

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_LOCATE( nWA, lContinue )

   LOCAL aWAData := USRRDD_AREADATA( nWA )
   LOCAL oRecordSet := aWAData[ WA_RECORDSET ]

   oRecordSet:Find( aWAData[ WA_SCOPEINFO ][ UR_SI_CFOR ], iif( lContinue, 1, 0 ) )
   aWAData[ WA_FOUND ] := ! oRecordSet:EOF
   aWAData[ WA_EOF ] := oRecordSet:EOF

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_CLEARREL( nWA )

   LOCAL aWAData := USRRDD_AREADATA( nWA )
   LOCAL nKeys := 0, cKeyName

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
      nKeys := aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Keys:Count
   RECOVER
   END SEQUENCE

   IF nKeys > 0
      cKeyName := aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Keys( nKeys - 1 ):Name
      IF !( Upper( cKeyName ) == "PRIMARYKEY" )
         aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Keys:Delete( cKeyName )
      ENDIF
   ENDIF

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_RELAREA( nWA, nRelNo, nRelArea )

   LOCAL aWAData := USRRDD_AREADATA( nWA )

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
      IF nRelNo <= aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Keys:Count()
         nRelArea := Select( aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Keys( nRelNo - 1 ):RelatedTable )
      ENDIF
   RECOVER
      nRelArea := 0
   END SEQUENCE

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_RELTEXT( nWA, nRelNo, cExpr )

   LOCAL aWAData := USRRDD_AREADATA( nWA )

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
      IF nRelNo <= aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Keys:Count()
         cExpr := aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Keys( nRelNo - 1 ):Columns( 0 ):RelatedColumn
      ENDIF
   RECOVER
      cExpr := ""
   END SEQUENCE

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_SETREL( nWA, aRelInfo )

   LOCAL aWAData := USRRDD_AREADATA( nWA )
   LOCAL cParent := Alias( aRelInfo[ UR_RI_PARENT ] )
   LOCAL cChild := Alias( aRelInfo[ UR_RI_CHILD ] )
   LOCAL cKeyName := cParent + "_" + cChild

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
      aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Keys:Append( cKeyName, adKeyForeign, ;
         aRelInfo[ UR_RI_CEXPR ], cChild, aRelInfo[ UR_RI_CEXPR ] )
   RECOVER
      /* raise error for can't create relation */
   END SEQUENCE

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_FORCEREL( nWA )

   LOCAL aPendingRel
   LOCAL aWAData := USRRDD_AREADATA( nWA )

   IF ! Empty( aWAData[ WA_PENDINGREL ] )

      aPendingRel := aWAData[ WA_PENDINGREL ]
      aWAData[ WA_PENDINGREL ] := NIL

      RETURN ADO_RELEVAL( nWA, aPendingRel )
   ENDIF

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_RELEVAL( nWA, aRelInfo )

   LOCAL aInfo, nReturn, nOrder, uResult

   nReturn := ADO_EVALBLOCK( aRelInfo[ UR_RI_PARENT ], aRelInfo[ UR_RI_BEXPR ], @uResult )

   IF nReturn == HB_SUCCESS
      /*
       *  Check the current order
       */
      aInfo := Array( UR_ORI_SIZE )
      nReturn := ADO_ORDINFO( nWA, DBOI_NUMBER, @aInfo )

      IF nReturn == HB_SUCCESS
         nOrder := aInfo[ UR_ORI_RESULT ]
         IF nOrder != 0
            IF aRelInfo[ UR_RI_SCOPED ]
               aInfo[ UR_ORI_NEWVAL ] := uResult
               nReturn := ADO_ORDINFO( nWA, DBOI_SCOPETOP, @aInfo )
               IF nReturn == HB_SUCCESS
                  nReturn := ADO_ORDINFO( nWA, DBOI_SCOPEBOTTOM, @aInfo )
               ENDIF
            ENDIF
            IF nReturn == HB_SUCCESS
               nReturn := ADO_SEEK( nWA, .F., uResult, .F. )
            ENDIF
         ELSE
            nReturn := ADO_GOTO( nWA, uResult )
         ENDIF
      ENDIF
   ENDIF

   RETURN nReturn

STATIC FUNCTION ADO_ORDLSTADD( nWA, aOrderInfo )

   LOCAL oRecordSet := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
      oRecordSet:Index := aOrderInfo[ UR_ORI_BAG ]
   RECOVER
   END SEQUENCE

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_ORDLSTCLEAR( nWA )

   LOCAL oRecordSet := USRRDD_AREADATA( nWA )[ WA_RECORDSET ]

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
      oRecordSet:Index := ""
   RECOVER
   END SEQUENCE

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_ORDCREATE( nWA, aOrderCreateInfo )

   LOCAL aWAData := USRRDD_AREADATA( nWA )
   LOCAL oIndex, oError, n, lFound := .F.

   IF aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Indexes != NIL
      FOR n := 1 TO aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Indexes:Count
         oIndex := aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Indexes( n - 1 )
         IF oIndex:Name == iif( ! Empty( aOrderCreateInfo[ UR_ORCR_TAGNAME ] ), aOrderCreateInfo[ UR_ORCR_TAGNAME ], aOrderCreateInfo[ UR_ORCR_CKEY ] )
            lFound := .T.
            EXIT
         ENDIF
      NEXT
   ENDIF

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
      IF aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Indexes == NIL .OR. ! lFound
         oIndex := win_oleCreateObject( "ADOX.Index" )
         oIndex:Name := iif( ! Empty( aOrderCreateInfo[ UR_ORCR_TAGNAME ] ), aOrderCreateInfo[ UR_ORCR_TAGNAME ], aOrderCreateInfo[ UR_ORCR_CKEY ] )
         oIndex:PrimaryKey := .F.
         oIndex:Unique := aOrderCreateInfo[ UR_ORCR_UNIQUE ]
         oIndex:Columns:Append( aOrderCreateInfo[ UR_ORCR_CKEY ] )
         aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Indexes:Append( oIndex )
      ENDIF
   RECOVER
      oError := ErrorNew()
      oError:GenCode := EG_CREATE
      oError:SubCode := 1004
      oError:Description := hb_langErrMsg( EG_CREATE ) + " (" + ;
         hb_langErrMsg( EG_UNSUPPORTED ) + ")"
      oError:FileName := aOrderCreateInfo[ UR_ORCR_BAGNAME ]
      oError:CanDefault := .T.
      UR_SUPER_ERROR( nWA, oError )
   END SEQUENCE

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_ORDDESTROY( nWA, aOrderInfo )

   LOCAL aWAData := USRRDD_AREADATA( nWA ), n, oIndex

   IF aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Indexes != NIL
      FOR n := 1 TO aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Indexes:Count
         oIndex := aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Indexes( n - 1 )
         IF oIndex:Name == aOrderInfo[ UR_ORI_TAG ]
            aWAData[ WA_CATALOG ]:Tables( aWAData[ WA_TABLENAME ] ):Indexes:Delete( oIndex:Name )
         ENDIF
      NEXT
   ENDIF

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_EVALBLOCK( nArea, bBlock, uResult )

   LOCAL nCurrArea

   nCurrArea := Select()
   IF nCurrArea != nArea
      dbSelectArea( nArea )
   ELSE
      nCurrArea := 0
   ENDIF

   uResult := Eval( bBlock )

   IF nCurrArea > 0
      dbSelectArea( nCurrArea )
   ENDIF

   RETURN HB_SUCCESS

STATIC FUNCTION ADO_EXISTS( nRdd, cTable, cIndex, ulConnect )

   // LOCAL n
   LOCAL lRet := HB_FAILURE
   LOCAL aRData := USRRDD_RDDDATA( nRDD )

   HB_SYMBOL_UNUSED( ulConnect )

   IF ! Empty( cTable ) .AND. ! Empty( aRData[ WA_CATALOG ] )
      BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
         // n := aRData[ WA_CATALOG ]:Tables( cTable )
         lRet := HB_SUCCESS
      RECOVER
      END SEQUENCE
      IF ! Empty( cIndex )
         BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
            // n := aRData[ WA_CATALOG ]:Tables( cTable ):Indexes( cIndex )
            lRet := HB_SUCCESS
         RECOVER
         END SEQUENCE
      ENDIF
   ENDIF

   RETURN lRet

STATIC FUNCTION ADO_DROP( nRdd, cTable, cIndex, ulConnect )

   // LOCAL n
   LOCAL lRet := HB_FAILURE
   LOCAL aRData := USRRDD_RDDDATA( nRDD )

   HB_SYMBOL_UNUSED( ulConnect )

   IF ! Empty( cTable ) .AND. ! Empty( aRData[ WA_CATALOG ] )
      BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
         // n := aRData[ WA_CATALOG ]:Tables:Delete( cTable )
         lRet := HB_SUCCESS
      RECOVER
      END SEQUENCE
      IF ! Empty( cIndex )
         BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
            // n := aRData[ WA_CATALOG ]:Tables( cTable ):Indexes:Delete( cIndex )
            lRet := HB_SUCCESS
         RECOVER
         END SEQUENCE
      ENDIF
   ENDIF

   RETURN lRet

STATIC FUNCTION ADO_SEEK( nWA, lSoftSeek, cKey, lFindLast )

   HB_SYMBOL_UNUSED( nWA )
   HB_SYMBOL_UNUSED( lSoftSeek )
   HB_SYMBOL_UNUSED( cKey )
   HB_SYMBOL_UNUSED( lFindLast )

   /* TODO */

   RETURN HB_FAILURE

STATIC FUNCTION ADO_FOUND( nWA, lFound )

   LOCAL aWAData := USRRDD_AREADATA( nWA )

   lFound := aWAData[ WA_FOUND ]

   RETURN HB_SUCCESS

FUNCTION ADORDD_GETFUNCTABLE( pFuncCount, pFuncTable, pSuperTable, nRddID )

   LOCAL aADOFunc[ UR_METHODCOUNT ]

   aADOFunc[ UR_INIT ]         := @ADO_INIT()
   aADOFunc[ UR_NEW ]          := @ADO_NEW()
   aADOFunc[ UR_CREATE ]       := @ADO_CREATE()
   aADOFunc[ UR_CREATEFIELDS ] := @ADO_CREATEFIELDS()
   aADOFunc[ UR_OPEN ]         := @ADO_OPEN()
   aADOFunc[ UR_CLOSE ]        := @ADO_CLOSE()
   aADOFunc[ UR_BOF  ]         := @ADO_BOF()
   aADOFunc[ UR_EOF  ]         := @ADO_EOF()
   aADOFunc[ UR_DELETED ]      := @ADO_DELETED()
   aADOFunc[ UR_SKIPRAW ]      := @ADO_SKIPRAW()
   aADOFunc[ UR_GOTO ]         := @ADO_GOTO()
   aADOFunc[ UR_GOTOID ]       := @ADO_GOTOID()
   aADOFunc[ UR_GOTOP ]        := @ADO_GOTOP()
   aADOFunc[ UR_GOBOTTOM ]     := @ADO_GOBOTTOM()
   aADOFunc[ UR_RECNO ]        := @ADO_RECNO()
   aADOFunc[ UR_RECID ]        := @ADO_RECID()
   aADOFunc[ UR_RECCOUNT ]     := @ADO_RECCOUNT()
   aADOFunc[ UR_GETVALUE ]     := @ADO_GETVALUE()
   aADOFunc[ UR_PUTVALUE ]     := @ADO_PUTVALUE()
   aADOFunc[ UR_DELETE ]       := @ADO_DELETE()
   aADOFunc[ UR_APPEND ]       := @ADO_APPEND()
   aADOFunc[ UR_FLUSH ]        := @ADO_FLUSH()
   aADOFunc[ UR_ORDINFO ]      := @ADO_ORDINFO()
   aADOFunc[ UR_RECINFO ]      := @ADO_RECINFO()
   aADOFunc[ UR_FIELDINFO ]    := @ADO_FIELDINFO()
   aADOFunc[ UR_FIELDNAME ]    := @ADO_FIELDNAME()
   aADOFunc[ UR_ORDLSTFOCUS ]  := @ADO_ORDLSTFOCUS()
   aADOFunc[ UR_PACK ]         := @ADO_PACK()
   aADOFunc[ UR_RAWLOCK ]      := @ADO_RAWLOCK()
   aADOFunc[ UR_LOCK ]         := @ADO_LOCK()
   aADOFunc[ UR_UNLOCK ]       := @ADO_UNLOCK()
   aADOFunc[ UR_SETFILTER ]    := @ADO_SETFILTER()
   aADOFunc[ UR_CLEARFILTER ]  := @ADO_CLEARFILTER()
   aADOFunc[ UR_ZAP ]          := @ADO_ZAP()
   aADOFunc[ UR_SETLOCATE ]    := @ADO_SETLOCATE()
   aADOFunc[ UR_LOCATE ]       := @ADO_LOCATE()
   aADOFunc[ UR_FOUND ]        := @ADO_FOUND()
   aADOFunc[ UR_FORCEREL ]     := @ADO_FORCEREL()
   aADOFunc[ UR_RELEVAL ]      := @ADO_RELEVAL()
   aADOFunc[ UR_CLEARREL ]     := @ADO_CLEARREL()
   aADOFunc[ UR_RELAREA ]      := @ADO_RELAREA()
   aADOFunc[ UR_RELTEXT ]      := @ADO_RELTEXT()
   aADOFunc[ UR_SETREL ]       := @ADO_SETREL()
   aADOFunc[ UR_ORDCREATE ]    := @ADO_ORDCREATE()
   aADOFunc[ UR_ORDDESTROY ]   := @ADO_ORDDESTROY()
   aADOFunc[ UR_ORDLSTADD ]    := @ADO_ORDLSTADD()
   aADOFunc[ UR_ORDLSTCLEAR ]  := @ADO_ORDLSTCLEAR()
   aADOFunc[ UR_EVALBLOCK ]    := @ADO_EVALBLOCK()
   aADOFunc[ UR_SEEK ]         := @ADO_SEEK()
   aADOFunc[ UR_EXISTS ]       := @ADO_EXISTS()
   aADOFunc[ UR_DROP ]         := @ADO_DROP()

   RETURN USRRDD_GETFUNCTABLE( pFuncCount, pFuncTable, pSuperTable, nRddID, ;
      /* NO SUPER RDD */, aADOFunc )

INIT PROCEDURE ADORDD_INIT()

   rddRegister( "ADORDD", RDT_FULL )

   RETURN

STATIC FUNCTION ADO_GETFIELDSIZE( nDBFFieldType, nADOFieldSize )

   LOCAL nDBFFieldSize := 0

   DO CASE
   CASE nDBFFieldType == HB_FT_STRING
      nDBFFieldSize := nADOFieldSize

   CASE nDBFFieldType == HB_FT_INTEGER
      nDBFFieldSize := nADOFieldSize

   CASE nDBFFieldType == HB_FT_DATE
      nDBFFieldSize := 8

   CASE nDBFFieldType == HB_FT_DOUBLE
      nDBFFieldSize := nADOFieldSize

#ifdef HB_FT_DATETIME
   CASE nDBFFieldType == HB_FT_DATETIME
      nDBFFieldSize := 8
#endif

   CASE nDBFFieldType == HB_FT_TIMESTAMP
      nDBFFieldSize := 8

   CASE nDBFFieldType == HB_FT_OLE
      nDBFFieldSize := 10

#ifdef HB_FT_PICTURE
   CASE nDBFFieldType == HB_FT_PICTURE
      nDBFFieldSize := 10
#endif

   CASE nDBFFieldType == HB_FT_LOGICAL
      nDBFFieldSize := 1

   CASE nDBFFieldType == HB_FT_MEMO
      nDBFFieldSize := 10

   ENDCASE

   RETURN nDBFFieldSize

STATIC FUNCTION ADO_GETFIELDTYPE( nADOFieldType )

   LOCAL nDBFFieldType := 0

   DO CASE

   CASE nADOFieldType == adEmpty
   CASE nADOFieldType == adTinyInt
      nDBFFieldType := HB_FT_INTEGER

   CASE nADOFieldType == adSmallInt
      nDBFFieldType := HB_FT_INTEGER

   CASE nADOFieldType == adInteger
      nDBFFieldType := HB_FT_INTEGER

   CASE nADOFieldType == adBigInt
      nDBFFieldType := HB_FT_INTEGER

   CASE nADOFieldType == adUnsignedTinyInt
   CASE nADOFieldType == adUnsignedSmallInt
   CASE nADOFieldType == adUnsignedInt
   CASE nADOFieldType == adUnsignedBigInt
   CASE nADOFieldType == adSingle

   CASE nADOFieldType == adDouble
      nDBFFieldType := HB_FT_DOUBLE

   CASE nADOFieldType == adCurrency
      nDBFFieldType := HB_FT_INTEGER

   CASE nADOFieldType == adDecimal
      nDBFFieldType := HB_FT_LONG

   CASE nADOFieldType == adNumeric
      nDBFFieldType := HB_FT_LONG

   CASE nADOFieldType == adError
   CASE nADOFieldType == adUserDefined
   CASE nADOFieldType == adVariant
      nDBFFieldType := HB_FT_ANY

   CASE nADOFieldType == adIDispatch

   CASE nADOFieldType == adIUnknown

   CASE nADOFieldType == adGUID
      nDBFFieldType := HB_FT_STRING

   CASE nADOFieldType == adDate
#ifdef HB_FT_DATETIME
      nDBFFieldType := HB_FT_DATETIME
#else
      nDBFFieldType := HB_FT_DATE
#endif

   CASE nADOFieldType == adDBDate
#ifdef HB_FT_DATETIME
      nDBFFieldType := HB_FT_DATETIME
#else
      nDBFFieldType := HB_FT_DATE
#endif

   CASE nADOFieldType == adDBTime

   CASE nADOFieldType == adDBTimeStamp
      nDBFFieldType := HB_FT_TIMESTAMP

   CASE nADOFieldType == adFileTime
#ifdef HB_FT_DATETIME
      nDBFFieldType := HB_FT_DATETIME
#endif

   CASE nADOFieldType == adBSTR
      nDBFFieldType := HB_FT_STRING

   CASE nADOFieldType == adChar
      nDBFFieldType := HB_FT_STRING

   CASE nADOFieldType == adVarChar
      nDBFFieldType := HB_FT_STRING

   CASE nADOFieldType == adLongVarChar
      nDBFFieldType := HB_FT_STRING

   CASE nADOFieldType == adWChar
      nDBFFieldType := HB_FT_STRING

   CASE nADOFieldType == adVarWChar
      nDBFFieldType := HB_FT_STRING

   CASE nADOFieldType == adBinary
      nDBFFieldType := HB_FT_OLE

   CASE nADOFieldType == adVarBinary
      nDBFFieldType := HB_FT_OLE

   CASE nADOFieldType == adLongVarBinary
      nDBFFieldType := HB_FT_OLE

   CASE nADOFieldType == adChapter

   CASE nADOFieldType == adVarNumeric
#if 0
   CASE nADOFieldType == adArray
#endif

   CASE nADOFieldType == adBoolean
      nDBFFieldType := HB_FT_LOGICAL

   CASE nADOFieldType == adLongVarWChar
      nDBFFieldType := HB_FT_MEMO

   CASE nADOFieldType == adPropVariant
      nDBFFieldType := HB_FT_MEMO

   ENDCASE

   RETURN nDBFFieldType

PROCEDURE hb_adoSetTable( cTableName )

   t_cTableName := cTableName

   RETURN

PROCEDURE hb_adoSetEngine( cEngine )

   t_cEngine := cEngine

   RETURN

PROCEDURE hb_adoSetServer( cServer )

   t_cServer := cServer

   RETURN

PROCEDURE hb_adoSetUser( cUser )

   t_cUserName := cUser

   RETURN

PROCEDURE hb_adoSetPassword( cPassword )

   t_cPassword := cPassword

   RETURN

PROCEDURE hb_adoSetQuery( cQuery )

   hb_default( @cQuery, "SELECT * FROM " )

   t_cQuery := cQuery

   RETURN

PROCEDURE hb_adoSetLocateFor( cLocateFor )

   USRRDD_AREADATA( Select() )[ WA_LOCATEFOR ] := cLocateFor

   RETURN

STATIC FUNCTION SQLTranslate( cExpr )

   IF Left( cExpr, 1 ) == '"' .AND. Right( cExpr, 1 ) == '"'
      cExpr := SubStr( cExpr, 2, Len( cExpr ) - 2 )
   ENDIF

   cExpr := StrTran( cExpr, '""' )
   cExpr := StrTran( cExpr, '"', "'" )
   cExpr := StrTran( cExpr, "''", "'" )
   cExpr := StrTran( cExpr, "==", "=" )
   cExpr := StrTran( cExpr, ".and.", "AND" )
   cExpr := StrTran( cExpr, ".or.", "OR" )
   cExpr := StrTran( cExpr, ".AND.", "AND" )
   cExpr := StrTran( cExpr, ".OR.", "OR" )

   RETURN cExpr

FUNCTION hb_adoRddGetConnection( nWA )

   IF ! HB_ISNUMERIC( nWA )
      nWA := Select()
   ENDIF

   RETURN USRRDD_AREADATA( nWA )[ WA_CONNECTION ]

FUNCTION hb_adoRddGetCatalog( nWA )

   IF ! HB_ISNUMERIC( nWA )
      nWA := Select()
   ENDIF

   RETURN USRRDD_AREADATA( nWA )[ WA_CATALOG ]

FUNCTION hb_adoRddGetRecordSet( nWA )

   LOCAL aWAData

   IF ! HB_ISNUMERIC( nWA )
      nWA := Select()
   ENDIF

   aWAData := USRRDD_AREADATA( nWA )

   RETURN iif( aWAData != NIL, aWAData[ WA_RECORDSET ], NIL )


Está correto?

Não entendi qual seria o próximo passo ou o que faltaria para funcionar.
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Pedido de ajuda simples no MySql

Mensagempor JoséQuintas » 03 Mai 2014 20:38

Voltando ao princípio:
Pra usar MySql é preciso atenção nos seguintes componentes:

1. Servidor MySql
Precisa instalar o servidor MySql. Não importa se é máquina única ou rede ou internet, é preciso ter o servidor MySql em algum lugar pra poder acessá-lo. O servidor tem um nome/endereço de IP, e vai ter a porta de acesso que precisa estar liberada no firewall. - padrão 3306
Precisa cadastrar usuário/senha, criar a base de dados, garantir direitos de acesso

2. ODBC MySql ou equivalente
Estação que vai acessar o MySql, não importa se é máquina única ou rede ou internet, é preciso ter o ODBC MySql instalado.

3. Aplicativo
O aplicativo vai usar o ODBC MySql pra se conectar.
Vai falhar se indicar versão de ODBC errada, diferente da instalada.
Vai falhar se indicar nome/IP de servidor errado.
Vai falhar se indicar número de porta errado.
Vai falhar se o firewall do Windows ou antivírus bloquearem a conexão.
Vai falhar se usar um banco de dados que não existe.
Vai falhar se não existir usuário cadastrado pra acesso - mesmo se usar a senha de administrador, ela precisa estar liberada pra acesso externo no servidor

Então o ideal é fazer essas etapas passo a passo, pra ter certeza de que cada uma está funcionando.
1. Instale o servidor MySql
Teste pra ver se está ok na própria máquina, crie banco de dados, cadastre usuário, etc.

2. Instale o ODBC mysql
Teste pra ver se está ok acessando da mesma máquina/outra máquina

3. Gere o aplicativo e teste
Preste atenção nas mensagens de erro, porque praticamente são 3 programas diferentes rodando, além do erro poder ser em qualquer dos três programas, ainda pode ser firewall, nome do IP/Servidor, etc.

Estas etapas normalmente a gente esquece.
Depois de instalado e funcionando, demoram anos pra precisar fazer isso de novo, ou às vezes nunca mais.
É bom deixar tudo anotado pra quando for fazer novamente.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Anterior Próximo



Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 8 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro