Harbour+ADO+SQL Server 2008 + Automação OLE - Como fazer?

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Harbour+ADO+SQL Server 2008 + Automação OLE - Como fazer?

Mensagem por alxsts »

Olá!

Estou fazendo alguns testes de acesso a banco de dados com ADO. O código abaixo, removidos os comentários das linhas onde tem CreateObject() e removendo as linhas TOleAuto(), funciona perfeitamente em xHarbour.

Quero fazer o mesmo teste mas compilando com Harbour. Aí recebo o erro: " undefined reference to `HB_FUN_TOLEAUTO'" durante a linkedição.

Onde estou errando? Precisa de alguma lib a mais?

Outra coisa? Essa TOleAuto() é a melhor opção ou existe algo mais novo? Vi algo de HBWin... Depois quero fazer o mesmo teste usando um form + grid HMG.

Aliás, estou tentando compilar isso com o Harbour (HBMk2.Exe) que veio com a HMG 3.0.46:

Código: Selecionar todos

D:\TestesHB>harbour /build
Harbour 3.2.0dev (Rev. 18443)
Copyright (c) 1999-2012, http://harbour-project.org/

Harbour Build Info
---------------------------
Version: Harbour 3.2.0dev (Rev. 18443)
Compiler: MinGW GNU C 4.6.1 (32-bit)
Platform: Windows 7 6.1.7601 Service Pack 1
PCode version: 0.3
ChangeLog last entry: 2012-11-05 12:32 UTC+0100 Viktor Szakats (harbour syenar.net)
ChangeLog ID: ChangeLog 18443 2012-11-05 11:37:36Z vszakats
Built on: Nov  6 2012 00:42:50
Build options: (Clipper 5.3b) (Clipper 5.x undoc)
---------------------------
Segue o código:

Código: Selecionar todos

#include "ado.ch"
#include "set.ch"
#include "hbcompat.ch"

PROCEDURE Main()

   LOCAL oCn, oRs, oErr, aRs, cSql

   Try
      Set( _SET_DATEFORMAT, "dd/mm/yyyy" )

      // oCn := CreateObject( "ADODB.Connection" )
      oCn := TOLEAUTO():New("ADODB.Connection")

      // Oracle XE
      //oCn:ConnectionString := "Provider=OraOLEDB.Oracle;Data Source=XE;User ID=system;Password=abc100;FetchSize=100;CacheType=Memory;"

      // SQL Server 2008 R2
      oCn:ConnectionString := "Provider=SQLNCLI10;Server=172.16.30.8;Database=MyDb;UID=MyUID;Pwd=MyPWD;"

      oCn:Open()

      // oRs := CreateObject("ADODB.RecordSet")
      oRs := TOLEAUTO():New("ADODB.RecordSet")

      cSql := "SELECT idOrder, Convert(Char(10), dtOrder,103) dtOrder, vlTotalOrder / 100 vlTotalOrder " ;
      cSql += "  FROM dbo.tbOrder (NOLOCK) " ;
      cSql += " WHERE Convert(Char(10), dtOrder,103) = '27/03/2013'"
      
      With Object oRs

         :cursorType := adOpenForwardOnly  //adOpenForward //adOpenDynamic adOpenStatic //
         :activeConnection( oCn )
         :cursorLocation = adUseServer
         :maxRecords = 100000
         :cacheSize = 100
         :source := cSql

         :open()

         :moveFirst()

         If ! :Eof()
            aRs := :GetRows
         Else
            ? "RS vazio"
         Endif

         :moveFirst()

         While ! :eof()
            QOut( :Fields( "idOrder" ):value, "-", ;
                  :Fields( "dtOrder" ):Value, "-", ;
                  Transform( :Fields( "vlTotalOrder" ):Value, "@E 999,999.99" ) )

            :MoveNext()
         Enddo

         ? LTrim( Str( Len( aRs ) ) ), " Records"
      End With

   Catch oErr
       Alert( "Error: " + oErr:Operation + " -> " + oErr:Description )

//   Finnaly
   End

   oCn:Close()
   oCn := Nil
   oRs := Nil

 RETURN
//--------------------------------------------------------------------------------
Agradeço a ajuda antecipadamente.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Harbour+ADO+SQL Server 2008 + Automação OLE - Como fazer?

Mensagem por rochinha »

Amiguinho,

Para acesso via OLE voce pode usar:

Em xHarbour o oCn := CreateObject( "ADODB.Connection" )
Em Harbour o oCn := TOLEAUTO():New("ADODB.Connection")

Se bem que acrescentando os bibliotecas corretas de cada versão voce poderá usar as duas opções ao mesmo tempo.

Verifique e agregue as bibliotecas do seu Harbour que contenham ...ole... no nome.
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.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Harbour+ADO+SQL Server 2008 + Automação OLE - Como fazer?

Mensagem por alxsts »

Olá!

Grato por responder Rochinha.

Em meus testes, o exemplo funcionou perfeitamente com CreateObject() em xHarbour. Tentei usar com TOleAuto() em Harbour e obtive o erro mencionado. Depois disso, nos exemplos da HMG, vi alguns com CreateObject().

Não quero usar a IDE da HMG e sim criar scripts e compilar com HbMk2...

O problema é exatamente esse: quais libs usar? Onde encontrá-las? Como saber qual deve ser usada em Harbour? O Harbour que vem com a HMG não tem arquivos .lib e sim .a na pasta lib...
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Harbour+ADO+SQL Server 2008 + Automação OLE - Como fazer?

Mensagem por rochinha »

Amiguinho,

Se voce pretende usar HMG com certeza terá de usar o Harbour que vem com ela e o compilador que neste caso é o MingW, ele tem bibliotecas com extensão .a e gera objetos .o(me corrijam)

Se você possuir um HMGScript compilado e rodando você pode criar somente os scripts em HMG para tarefas desejadas e continuar com seu Harbour em outras aplicações.

O ultimo build do Harbour 3.2 que usa o Borland C++ que encontrei era o 17431.
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.
marcosgambeta
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 16 Jun 2005 22:53

Harbour+ADO+SQL Server 2008 + Automação OLE - Como fazer?

Mensagem por marcosgambeta »

Ao usar OLE, leve em conta o seguinte:

No xHarbour, faz parte do 'core' e podemos usar as funções abaixo:

CreateObject( cString, cLicense ) ou TOleAuto():New( cString, , cLicense )
GetActiveObject( cString ) ou TOleAuto():GetActiveObject( cString )

No Harbour, faz parte da biblioteca hbwin (contrib\hbwin) e as funções são:

win_oleCreateObject ( cOleName | cCLSID [, cIID ] )
win_oleGetActiveObject ( cOleName | cCLSID [, cIID ] )

O nome da classe é win_oleauto, no Harbour.

Esta diferença entre estar no núcleo e estar numa biblioteca extra, vem do fato de, no projeto Harbour, todo o código exclusivo para Windows (que não é multiplataforma) ter sido removido do núcleo e movido para bibliotecas extras.
Atenciosamente,
Marcos Antonio Gambeta
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Harbour+ADO+SQL Server 2008 + Automação OLE - Como fazer?

Mensagem por JoséQuintas »

Eu uso assim, com recordset estático

Código: Selecionar todos

LOCAL cnConexao, rs, cSql

cnConexao := win_OleCreateObject( "string" )
// mais as configurações adicionais
cSql := "SELECT * FROM ARQUIVO"
rs := cnConexao:Execute( cSql )
DO WHILE .NOT. rs:Eof()
   ? rs:Fields( "CAMPO" ):Value
   rs:MoveNext()
ENDDO
rs:Close()
cnConexao:Close()
RETURN NIL
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/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Harbour+ADO+SQL Server 2008 + Automação OLE - Como fazer?

Mensagem por alxsts »

Olá!

Obrigado pelas respostas amigos.

Sei que o ADO funciona perfeitamente. Tanto em xHarbour quanto em Harbour + HMG. Fiz testes com o SQL Server 2012. Perfeito.

O que pretendo é utilizar HMG (e depois testar a HWGUI e HbQt) apenas para criação dos arquivos .FMG, de formulários, que pretendo usar sem embutir no código dos .PRG, apenas carregando os forms. Essa será a camada UIL (user interface layer). Haverá também a BLL a DAL e talvez uma DTO. Pretendo ter scripts para compilação através do HbMk2 e é aí que estou com problemas para identificar as libs envolvidas. Quero entender isto.

Na versão que tenho do Harbour (como dito anteriormente, veio junto com a HMG) não existe pasta contrib. As pastas D:\hmg.3.0.46\LIB e D:\hmg.3.0.46\HARBOUR\lib\win\mingw só tem arquivos com extensão .a (???) Onde estariam as libs? Interessante que num batch de compilação da HMG (HMG.Hbc, chamado pelo Buid.Bat) essas libs são referenciadas:

Código: Selecionar todos

# paths

incpaths=/.
incpaths=include
libpaths=lib

# main hmg libs

libs=hmg
libs=crypt
libs=edit
libs=editex
libs=graph
libs=hfcl
libs=ini
libs=report

# system libs

libs=msvfw32
libs=vfw32

# harbour contrib libs

libs=hbct
libs=hbwin
libs=hbmzip
libs=minizip
libs=hbmemio
libs=hbmisc
libs=hbmysql
libs=mysql
libs=hbtip
libs=sqlite3
libs=hbsqlit3
libs=sddodbc
libs=rddsql
libs=sddmy
libs=hbodbc
libs=odbc32
libs=hbhpdf
libs=hbfimage
libs=hbpgsql
libs=hbnetio
libs=xhb
libs=png
libs=libhpdf
libs=hbvpdf

# link compiled resources

sources=${hb_curdir}_temp.o
JoséQuintas escreveu:Eu uso assim, com recordset estático
Eu também uso assim mas com adOpenForwardOnly. O que preciso saber é qual Harbour você usa e como faz para compilar com HbMk2. Tem os scripts?
[]´s
Alexandre Santos (AlxSts)
marcosgambeta
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 16 Jun 2005 22:53

Harbour+ADO+SQL Server 2008 + Automação OLE - Como fazer?

Mensagem por marcosgambeta »

alxsts escreveu:Na versão que tenho do Harbour (como dito anteriormente, veio junto com a HMG) não existe pasta contrib. As pastas D:\hmg.3.0.46\LIB e D:\hmg.3.0.46\HARBOUR\lib\win\mingw só tem arquivos com extensão .a (???) Onde estariam as libs?
As bibliotecas são estes arquivos com extensão .a, sendo que seguem o padrão abaixo, onde ABC seria o nome da biblioteca:

libABC.a

No hbmk2, não precisa colocar o prefixo "lib" e nem a extensão ".a".

Conferi minha instalação e a biblioteca hbwin está presente:

"C:\hmg.3.0.46\HARBOUR\lib\win\mingw\libhbwin.a"

Note que a HMG tem uma classe chamada TOLEAUTO, derivada da classe WIN_OLEAUTO (presente na hbwin). E também tem as funções CreateObject e GetActiveObject. Veja o arquivo abaixo para mais detalhes:

"C:\hmg.3.0.46\SOURCE\h_tole.prg"
Atenciosamente,
Marcos Antonio Gambeta
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Harbour+ADO+SQL Server 2008 + Automação OLE - Como fazer?

Mensagem por JoséQuintas »

.LIB = extensão pra LIB em msvc
.OBJ = extensão pra OBJ em msvc
.a = extensão pra LIB em mingw
.o = extensão pra OBJ em mingw

Os formatos internos são diferentes, por isso extensões diferentes.
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/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Harbour+ADO+SQL Server 2008 + Automação OLE - Como fazer?

Mensagem por alxsts »

Olá!

Obrigado Marcos. Obrigado Quintas.

Vocês explicaram o que realmente eu precisava saber. Acho impossível para alguém adivinhar estas coisas. Onde isto está documentado?

Mesmo com estas informações, ainda não consegui gerar este executável com Harbour + Mingw. Tanto faz TOleAuto() ou CreateObject(), sempre acusa a respectiva referência como indefinida. O que poderia ser?

Código: Selecionar todos

#include "ado.ch"
#include "set.ch"
#include "hbcompat.ch"

PROCEDURE Main()

   LOCAL oCn, oRs, oErr, aRs, cSql

   Try
      Set( _SET_DATEFORMAT, "dd/mm/yyyy" )

      // oCn := CreateObject( "ADODB.Connection" )
      oCn := TOLEAUTO():New("ADODB.Connection")

      // Oracle XE
      //oCn:ConnectionString := "Provider=OraOLEDB.Oracle;Data Source=XE;User ID=system;Password=abc100;FetchSize=100;CacheType=Memory;"

      // SQL Server 2008 R2
      oCn:ConnectionString := "Provider=SQLNCLI10;Server=172.16.30.8;Database=MyDb;UID=MyUID;Pwd=MyPWD;"

      oCn:Open()

      // oRs := CreateObject("ADODB.RecordSet")
      oRs := TOLEAUTO():New("ADODB.RecordSet")

      cSql := "SELECT TOP 10 idOrder, Convert(Char(10), dtOrder,103) dtOrder, vlTotalOrder / 100 vlTotalOrder "
Anexos
Mensagens da compilação
Mensagens da compilação
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Harbour+ADO+SQL Server 2008 + Automação OLE - Como fazer?

Mensagem por JoséQuintas »

Na 3.0 tinha CreateObject() e win_OleCreateObject()
Provavelmente desativaram a primeira.

Então é só usar win_OleCreateObject() e a LIB hbwin.

Acrescentar:
-lhbwin

Não sei se precisa desses includes pra alguma outra coisa que não aparece no fonte que postou.
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/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Harbour+ADO+SQL Server 2008 + Automação OLE - Como fazer?

Mensagem por alxsts »

Olá!

Obrigado Quintas. Funcionou.

Mas muitas coisas ainda me intrigam. E dá-lhe pesquisa...
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Harbour+ADO+SQL Server 2008 + Automação OLE - Como fazer?

Mensagem por JoséQuintas »

Só pra lembrar:
base SQL pode aceitar campo nulo, principalmente em campo de data.

No VB tinha que usar no final set rs = nothing ou set cnConexao = nothing
No VB.NET inventaram o rs.Destroy() ou algo assim.

No Harbour não precisa, porque ele trata direito as variáveis, mesmo se as variáveis forem pra uso do ADO.
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/
Responder