Pedido de ajuda simples no MySql
Moderador: Moderadores
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Pedido de ajuda simples no MySql
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.
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)
Alexandre Santos (AlxSts)
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Pedido de ajuda simples no MySql
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.
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 [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Pedido de ajuda simples no MySql
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:

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:

Inacio de Carvalho Neto
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Pedido de ajuda simples no MySql
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.
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 [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Pedido de ajuda simples no MySql
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.
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 [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Pedido de ajuda simples no MySql
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:

Qual arquivo devo executar?
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:

Qual arquivo devo executar?
Inacio de Carvalho Neto
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Pedido de ajuda simples no MySql
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:
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.
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:
Código: Selecionar todos
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
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 [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Pedido de ajuda simples no MySql
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
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Pedido de ajuda simples no MySql
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:
Em post anterior escrevi:
[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:
Eu escrevi:Baixei o MySQL Server deste site: http://dev.mysql.com/downloads/file.php?id=451431.
Voce precisa descompactar o conteúdo na pasta C:\mysql.Voce instalou o MySQL Server?
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 [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Pedido de ajuda simples no MySql
Não sei se te entendi bem, mas vamos lá:
1) Tenho o conteúdo do MySQL Server na pasta c:\mysql, conforme segue:
2) A subpasta BIN está assim:
O que falta?
1) Tenho o conteúdo do MySQL Server na pasta c:\mysql, conforme segue:
Código: Selecionar todos
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
Código: Selecionar todos
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
Inacio de Carvalho Neto
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Pedido de ajuda simples no MySql
Amiguinho,
Voltar 3 posts atrás e executar os passos passados.
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 [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Pedido de ajuda simples no MySql
Vc está falando deste post?
Se for, fiz de novo, mas já dá problema no início, pois não tem o arquivo my.ini.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.
Inacio de Carvalho Neto
Pedido de ajuda simples no MySql
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
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
Pedido de ajuda simples no MySql
Colega,
Baixei o Mysql 5.6 e o instalador Odbc da última versão.
O arquivo adordd.prg está assim:
Está correto?
Não entendi qual seria o próximo passo ou o que faltaria para funcionar.
Baixei o Mysql 5.6 e o instalador Odbc da última versão.
O arquivo adordd.prg está assim:
Código: Selecionar todos
/*
* 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 )
Não entendi qual seria o próximo passo ou o que faltaria para funcionar.
Inacio de Carvalho Neto
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Pedido de ajuda simples no MySql
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.
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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/

