Página 1 de 1

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

Enviado: 28 Mar 2013 20:27
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.

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

Enviado: 31 Mar 2013 18:34
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.

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

Enviado: 31 Mar 2013 23:10
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...

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

Enviado: 31 Mar 2013 23:29
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.

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

Enviado: 01 Abr 2013 05:59
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.

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

Enviado: 01 Abr 2013 17:57
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

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

Enviado: 02 Abr 2013 20:20
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?

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

Enviado: 02 Abr 2013 20:46
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"

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

Enviado: 02 Abr 2013 21:53
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.

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

Enviado: 03 Abr 2013 13:12
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 "

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

Enviado: 03 Abr 2013 13:27
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.

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

Enviado: 04 Abr 2013 12:42
por alxsts
Olá!

Obrigado Quintas. Funcionou.

Mas muitas coisas ainda me intrigam. E dá-lhe pesquisa...

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

Enviado: 04 Abr 2013 14:21
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.