Amiguinhos,
O coração deste tópico esta liberado para juntar-se aos exemplos que se seguem e vamos enriquecer este topico afim de conseguirmos tirar o maximo do conjunto de funções:
ADOxb.prg
****************************************************************************************
*
* CursorType
*
* adOpenForwardOnly 0 O cursor so navega para frente. Bom para listar dados
* adOpenKeyset 1 Nao permite ver os registro adicionados e eliminados
* adOpenDynamic 2 Aceita todas operacoes do utilizador e dos outros
* adOpenStatic 3 Serve apenas para procurar dados ou gerar relatorios
*
* LockTypeEnum - Contantes de Seguranca
*
* adLockReadOnly 1 Apenas pode ler os registros
* adLockPessimistic 2 O fornecedor dos dados fecha o registro apos edicao
* adLockOptimistic 3 O fornecedor dos dados fecha o registro apos chamar o update
* adLockBatchOptimistic 4 O mesmo que Optmistic mas para sequencia de comandos
*
* SortOrdEnum - Contantes de Ordenacao
*
* adSortAscending 1 Ordem ascendente
* adSortDescending 2 Ordem descendente
*
****************************************************************************************
#include "adoxb.ch"
#ifndef _ADO_xHarbour_
#define _ADO_Harbour_
#endif
*
*---------------------------------------------------------
Function ADOSetRDD( cRDDName )
public cADORDD := iif( cRDDName=NIL, "DBF", cRDDName )
PUBLIC aRecordSet, oRecordSet, nConnection, nRecordSet, aIndexOrder, nIndexOrder, ;
StrConnection, aADOConection, oADOConection, oADOErrDescription, oADOIndex, ;
oADOCatalog, oADOTable, oADOStream
nConnection := 1
aADOConection := {}
oADOConection := Array(10)
return cADORDD
*
*---------------------------------------------------------
#ifdef _ADO_Harbour_
Function ADOConnect( StrDriver )
//PUBLIC aRecordSet, oRecordSet, nRecordSet, aIndexOrder, nIndexOrder, StrConnection, oADOConection, oADOErrDescription, oADOIndex, oADOCatalog, oADOTable
aRecordSet := {}
oRecordSet := Array(50)
oADOIndex := Array(10)
nRecordSet := 0
aIndexOrder := {}
nIndexOrder := 1
StrConnection := StrDriver
AADD( aADOConection, StrDriver ) // Controla numero de conexoes
nConnection := len( aADOConection )
oADOConection[nConnection] := TOLEAUTO():New("ADODB.connection")
oADOStream := TOLEAUTO():New("ADODB.Stream")
oADOErrDescription := TOLEAUTO():New("ADODB.Err")
oADOIndex := TOLEAUTO():New("ADOX.Index")
oADOCatalog := TOLEAUTO():New("ADOX.Catalog")
oADOConection[nConnection]:CommandTimeOut := 200
oADOConection[nConnection]:ConnectionTimeOut := 10
oADOConection[nConnection]:CursorLocation := adUseClient
oADOConection[nConnection]:Mode := adModeShareDenyNone // adModeRead 1, adModeWrite 2, adModeReadWrite 3
oADOConection[nConnection]:Open( StrConnection )
return 'connected'
#endif _ADO_Harbour_
*
*---------------------------------------------------------
#ifdef _ADO_Harbour_
Function ADODBCREATE( cDatabase )
oADOCreateCatalog := TOLEAUTO():New("ADOX.Catalog")
StrConnection := "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + cDatabase
oADOCreateCatalog:Create( StrConnection )
return .t.
Function ADOCREATE( cTable, aFields )
//local oADOTable := TOLEAUTO():New("ADOX.Table")
//oADOCatalog:ActiveConnection := StrConnection
//oADOTable:Name := cTable
//for i = 1 to len( aFields )
// oADOTable:Columns:Append( aFields[i][1], GetFieldType(aFields[i][2]), aFields[i][3] )
//next
//oADOCatalog:Tables:Append( oADOTable )
//oADOTable:Close()
//oADOTable:End()
//
//oADOCreateCatalog := TOLEAUTO():New("ADOX.Catalog")
//oADOCreateTable := TOLEAUTO():New("ADOX.Table")
//oADOCreateCatalog:Create( StrConnection )
//oADOCreateTable:Name := cTable
//for i = 1 to len( aFields )
// oADOCreateTable:Columns:Append( aFields[i][1], GetFieldType(aFields[i][2]) ) //, aFields[i][3] )
//next
//oADOCreateCatalog:Tables:Append( cTable )
//return .t.
#endif _ADO_Harbour_
*
*---------------------------------------------------------
#ifdef _ADO_Harbour_
Function ADOIndex( cTable, cIDXField, cIDXName, cIDXAscend )
local adSortAscending := 1, adSortDescending := 2
local oADOTable := TOLEAUTO():New("ADOX.Table")
cIDXAscend := iif( cIDXAscend = nil, .t., cIDXAscend )
if .not. ADOFILE( "INDEXES" )
oADOCatalog:ActiveConnection := StrConnection
oADOTable:Name := "INDEXES"
oADOTable:Columns:Append( "NumField", adInteger, 20 )
oADOTable:Columns:Append( "TextField", adVarWChar, 20 )
oADOCatalog:Tables:Append( oADOTable )
endif
AADD( aIndexOrder, cTable )
nIndexOrder := len( aIndexOrder )
oADOIndex[nIndexOrder] := TOLEAUTO():New("ADOX.Index")
oADOIndex[nIndexOrder]:Name := cIDXName
oADOIndex[nIndexOrder]:Columns:Append( cIDXField )
oADOIndex[nIndexOrder]:Columns( cIDXField ):SortOrder = iif( cIDXAscend, adSortAscending, adSortDescending )
//oADOIndex[nIndexOrder]:PrimaryKey := .t.
//oADOIndex[nIndexOrder]:Unique := .t.
oADOIndex[nIndexOrder]:IndexNulls := adIndexNullsAllow
// Adciona o indice criado ao catalogo
//oADOCatalog:Tables( cTable ) //:Indexes:Append( oADOIndex[nIndexOrder] )
oADOTable:Indexes:Append( oADOIndex )
oADOCatalog:Tables:Append( oADOTable )
oADOTable:Close()
oADOTable:End()
return .t.
#endif _ADO_Harbour_
*
*---------------------------------------------------------
#ifdef _ADO_Harbour_
Function ADOUse( cDatabase, lShared )
local oError
if cADORDD = "XML"
cDatabase := cDatabase + ".xml"
endif
if cADORDD = "XLS"
cDatabase := "[" + cDatabase + "$]"
endif
if cDatabase = NIL
oRecordSet[nRecordSet]:Close()
oRecordSet[nRecordSet]:End()
else
AADD( aRecordSet, cDatabase )
cRecordSet := cDatabase
nRecordSet := len( aRecordSet )
oRecordSet[nRecordSet] := TOleAuto():New( "ADODB.Recordset" )
if cADORDD = "XML"
oRecordSet[nRecordSet]:Open( cDatabase, StrConnection, 1, 3 )
else
oRecordSet[nRecordSet]:CacheSize := 50
oRecordSet[nRecordSet]:CursorLocation := adUseClient
if lShared = .t.
oRecordSet[nRecordSet]:CursorType := adOpenDynamic
oRecordSet[nRecordSet]:LockType := adLockOptimistic
else
oRecordSet[nRecordSet]:CursorType := adOpenStatic
oRecordSet[nRecordSet]:LockType := adLockPessimistic
endif
oRecordSet[nRecordSet]:Open( "Select * from " + cDatabase, StrConnection, iif(lShared=.t.,3,1), 3 )
endif
ADOGOTOP() // oRecordSet[nRecordSet]:MoveFirst()
endif
* CursorType
*
* adOpenForwardOnly 0 O cursor so navega para frente. Bom para listar dados
* adOpenKeyset 1 Nao permite ver os registro adicionados e eliminados
* adOpenDynamic 2 Aceita todas operacoes do utilizador e dos outros
* adOpenStatic 3 Serve apenas para procurar dados ou gerar relatorios
*
* LockTypeEnum - Contantes de Seguranca
*
* adLockReadOnly 1 Apenas pode ler os registros
* adLockPessimistic 2 O fornecedor dos dados fecha o registro apos edicao
* adLockOptimistic 3 O fornecedor dos dados fecha o registro apos chamar o update
* adLockBatchOptimistic 4 O mesmo que Optmistic mas para sequencia de comandos
return .t.
#endif _ADO_Harbour_
*
*---------------------------------------------------------
#ifdef _ADO_Harbour_
Function ADOConnectRemote( StrDSN, StrServer )
PUBLIC aRecordSet, oRecordSet, nRecordSet, aIndexOrder, nIndexOrder, StrConnection, oADOConection, oADOErrDescription, oADOIndex, oADOCatalog
aRecordSet := {}
oRecordSet := Array(50)
oADOIndex := Array(10)
nRecordSet := 0
aIndexOrder := {}
nIndexOrder := 1
StrConnection := StrDriver
oADOConection := TOLEAUTO():New("RDS.DataControl")
oADOConection:ExecuteOptions := adcExecAsync
oADOConection:Connect := "DSN=" + StrDriver
oADOConection:Server := StrServer
oADOConection:Refresh()
return .t.
#endif _ADO_Harbour_
*
*---------------------------------------------------------
Function ADOConnected()
if !(valtype(oADOConection[nConnection]) = "O")
return .f. // Nao foi definido o Objecto
endif
if valtype(oADOConection) = "L"
return .f. // Se ja existe a variavel mas nao foi definida como Objeto
endif
cADOConectionState := oADOConection[nConnection]:State
return iif( cADOConectionState=1, .t., .f. )
*
*---------------------------------------------------------
Function MsgAlert( cMsg )
Alert( cMsg )
return .t.
*
*---------------------------------------------------------
Function ADOSetDriver( StrDatabase, StrSenha, StrUsuario, StrServer, StrPort )
public cADORDD := iif( cRDDName=NIL, "DBASE", cRDDName )
StrConnection := ""
StrDriver := ADORDDDefault()
if StrDriver = "DBASE"
StrConnection := "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+StrDatabase+";Extended Properties=dBASE IV;"
endif
if StrDriver = "ACCESS" // ADOMDB
StrConnection := "Provider= MicroSoft.Jet.OLEDB.4.0;Data Source="+StrDatabase+";"
endif
if StrDriver = "FIREBIRD" // ADOGDB
StrConnection := "DRIVER=Firebird/InterBase(r) driver; UID="+StrSenha+"; PWD="+StrUsuario+"; DBNAME="+StrDatabase
endif
if StrDriver = "MYSQL" // ADOMySQL
StrConnection := "driver={MySQL ODBC 3.51 Driver};database=" + StrDatabase + ;
";server=" + StrServer + ;
";uid=" + StrUsuario + ;
";pwd=" + StrSenha + ;
";option=35"
endif
if StrDriver = "PARADOX" // ADOPX
StrConnection := "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+StrDatabase+";Extended Properties=Paradox 5.x;"
endif
if StrDriver = "SQL"
StrConnection := "Provider=MSDASQL;Data Source=SQLExpress;User ID=Administrador;Password=konectiva;"
endif
if ADORDDDefault() = "XMLDB" // ADOXML
StrConnection := "Provider=MSPersist"
endif
if ADORDDDefault() = "XML" // ADOXML
StrConnection := "Provider=MSDAOSP;Data Source=MSXML2.DSOControl.2.6"
endif
if StrDriver = "XLS" // ADOXLS
StrConnection := [Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\adoxls.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"]
endif
if StrDriver = "REMOTE" // ADORDS
StrConnection := "Provider=MS Remote;Remote Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+StrDatabase+";Remote Server=" + StrServer
endif
return StrConnection
*
*---------------------------------------------------------
Function ADORDDDefault(qADORDD)
default cADORDD := "Nenhum RDD especificado."
//if (qADORDD = nil)
// cADORDD := qADORDD
//endif
return cADORDD
*
*---------------------------------------------------------
Function ADOFile( cFile )
if cADORDD = "XML" .or. cADORDD = "XLS"
return file( cFile )
else
oADOCatalog := oADOConection[nConnection]:OpenSchema(adSchemaTables)
do while .not. oADOCatalog:EOF()
if upper(alltrim(oADOCatalog:Fields( "TABLE_NAME" ):Value)) = upper(alltrim(cFile))
return .t.
endif
oADOCatalog:MoveNext()
enddo
endif
return .f.
*
*---------------------------------------------------------
Function ADOAlias()
if nRecordSet < 1
return ""
else
return aRecordSet[nRecordSet]
endif
*
*---------------------------------------------------------
Function ADOFCount()
if nRecordSet < 1
return ""
else
return aRecordSet[nRecordSet]:Fields:Count()
endif
*
*---------------------------------------------------------
Function ADOBEGINTRANSACTION()
oADOConection[nConnection]:BeginTrans()
return .t.
*
*---------------------------------------------------------
Function ADOCOMMITTRANSACTION()
oADOConection[nConnection]:CommitTrans()
return .t.
*
*---------------------------------------------------------
Function GetFieldType(FieldType)
do Case
Case FieldType = "C"
return adVarWChar
Case FieldType = "N"
return adInteger
Case FieldType = "M"
return adText
Case FieldType = "L"
return adBoolean
Case FieldType = "D"
return adDate
Endcase
*
*---------------------------------------------------------
Function ADOSetOrder( nIDXOrder )
oRecordSet[nRecordSet]:Index = oADOIndex[nIDXOrder]:Name
return .t.
*
*---------------------------------------------------------
Function ADODISConnect()
oADOConection[nConnection]:Close()
oADOErrDescription:Close()
oADOIndex:Close()
oADOCatalog:Close()
oADOConection[nConnection]:End()
oADOErrDescription:End()
oADOIndex:End()
oADOCatalog:End()
return .t.
*
*---------------------------------------------------------
Function ADOAppend()
oRecordSet[nRecordSet]:AddNew()
return .t.
*
*---------------------------------------------------------
Function ADOEdit()
oRecordSet[nRecordSet]:Edit()
return .t.
*
*---------------------------------------------------------
Function ADOCommit( lSave )
lSave := iif( lSave = nil, .f., lSave )
oRecordSet[nRecordSet]:Update()
if lSave
oRecordSet[nRecordSet]:Save( alltrim(aRecordSet[nRecordSet]), adPersistXML )
endif
marca := oRecordSet[nRecordSet]:BookMark
oRecordSet[nRecordSet]:Requery()
oRecordSet[nRecordSet]:BookMark = marca
return .t.
*
*---------------------------------------------------------
Function ADORequery()
oRecordSet[nRecordSet]:Requery()
return .t.
*
*---------------------------------------------------------
Function ADOReSync()
oRecordSet[nRecordSet]:ReSync()
return .t.
*
*---------------------------------------------------------
Function ADOUpdateBatch()
oRecordSet[nRecordSet]:UpdateBatch()
return .t.
*
*---------------------------------------------------------
Function ADOCommitAll()
for i = 1 to len(aRecordSet)
oRecordSet[nRecordSet]:Update()
next
return .t.
*
*---------------------------------------------------------
Function ADOSave( cfile )
oRecordSet[nRecordSet]:Save( cFile, adPersistXML )
return .t.
*
*---------------------------------------------------------
Function ADOReglock()
//oRecordSet[nRecordSet]:CursorLocation := 2
//oRecordSet[nRecordSet]:CursorType := 0
//oRecordSet[nRecordSet]:LockType := 3
return .t.
*
*---------------------------------------------------------
Function ADOSkip( nSkip )
LOCAL nRec := oRecordSet[nRecordSet]:AbsolutePosition()
oRecordSet[nRecordSet]:Move( iif( nSkip = nil, 1, nSkip ) )
IF oRecordSet[nRecordSet]:EOF(); oRecordSet[nRecordSet]:MoveLast() ; ENDIF
IF oRecordSet[nRecordSet]:BOF(); oRecordSet[nRecordSet]:MoveFirst(); ENDIF
return oRecordSet[nRecordSet]:AbsolutePosition() - nRec
*
*---------------------------------------------------------
Function ADODelete()
oRecordSet[nRecordSet]:Delete()
oRecordSet[nRecordSet]:Move( -1 )
if cADORDD = "XML" // ".XML" $ upper(aRecordSet[nRecordSet])
oRecordSet[nRecordSet]:Save( alltrim(aRecordSet[nRecordSet]), adPersistXML )
endif
return .t.
*
*---------------------------------------------------------
Function ADOGoTo( nRec )
//oRecordSet[nRecordSet]:BookMark := nRec
return .t.
*
*---------------------------------------------------------
Function ADOGoTop()
if .not. ADOBof()
if ADORecCount() > 0
oRecordSet[nRecordSet]:MoveFirst()
endif
endif
return .t.
*
*---------------------------------------------------------
Function ADOGoBottom()
if .not. ADOEof()
if ADORecCount() > 0
oRecordSet[nRecordSet]:MoveLast()
endif
endif
return .t.
*
*---------------------------------------------------------
Function ADORecno()
if nRecordSet < 0
return 0
else
return oRecordSet[nRecordSet]:AbsolutePosition()
endif
*
*---------------------------------------------------------
Function ADORecCount()
if nRecordSet < 1
return 0
else
nRecord := oRecordSet[nRecordSet]:AbsolutePosition()
nRecord := iif(nRecord=nil,-1,nRecord)
if nRecord < 1 //.or. .not. ( oRecordSet[nRecordSet]:EOF() = oRecordSet[nRecordSet]:BOF() )
return 0
else
return oRecordSet[nRecordSet]:RecordCount()
endif
endif
*
*---------------------------------------------------------
Function ADOSetFilter( xpr )
if xpr = NIL
oRecordSet[nRecordSet]:Filter := 0
else
oRecordSet[nRecordSet]:Filter := xpr
endif
return .t.
*
*---------------------------------------------------------
Function ADODeleted( criterio )
if oRecordSet[nRecordSet]:Status = adRecDeleted
return .t.
endif
return .f.
*
*---------------------------------------------------------
Function ADOClose()
_RecordSet := len( aRecordSet )
ADEL( aRecordSet, nRecordSet )
ASIZE( aRecordSet, _RecordSet-1 )
oRecordSet[nRecordSet]:End()
return .t.
*
*---------------------------------------------------------
Function ADOCloseAll()
for i = 1 to len(aRecordSet)
oRecordSet[nRecordSet]:End()
next
aRecordSet := {}
nRecordSet := 0
return .t.
*
*---------------------------------------------------------
Function ADOExecute( cSql )
aADODefines := {}
AADD( aADODefines, { "VOID(" , "0(" } )
AADD( aADODefines, { "BYTE(" , "1(" } )
AADD( aADODefines, { "CHAR(" , "2(" } )
AADD( aADODefines, { "WORD(" , "3(" } )
AADD( aADODefines, { "INT(" , "7(" } )
AADD( aADODefines, { "BOOLEAN(", "5(" } )
AADD( aADODefines, { "HDC(" , "6(" } )
AADD( aADODefines, { "LONG(" , "7(" } )
AADD( aADODefines, { "STRING(" , "8(" } )
AADD( aADODefines, { "LPSTR(" , "9(" } )
AADD( aADODefines, { "PTR(" ,"10(" } )
AADD( aADODefines, { "DOUBLE(" ,"11(" } )
AADD( aADODefines, { "DWORD(" ,"12(" } )
for i = 1 to len( aADODefines )
cSql := StrTran( cSql, aADODefines[i][2], aADODefines[i][1] )
next
//adolog( cSql )
oADOConection[nConnection]:Execute( cSql )
return .t.
Function ADOInsertInto( cSql )
cSql := StrTran( cSql, '"', "'" )
cSql := "INSERT INTO " + cSql
//? cSql
oADOConection[nConnection]:Execute( cSql )
return .t.
*
*---------------------------------------------------------
Function ADOBOF()
return iif( ADORecCount() > 0, oRecordSet[nRecordSet]:Bof, .t. )
*
*---------------------------------------------------------
Function ADOEOF()
return iif( ADORecCount() > 0, oRecordSet[nRecordSet]:Eof, .t. )
*
*---------------------------------------------------------
Function ADOFOUND()
return !oRecordSet[nRecordSet]:Eof
*
*---------------------------------------------------------
Function ADOFind( criterio )
ADOLocate( criterio )
return .t.
*
*---------------------------------------------------------
Function ADOLocate( criterio )
local _nBookMark := oRecordSet[nRecordSet]:Bookmark
oRecordSet[nRecordSet]:MoveFirst()
oRecordSet[nRecordSet]:Find( criterio )
if oRecordSet[nRecordSet]:Eof()
oRecordSet[nRecordSet]:BookMark := _nBookmark
return .f.
else
return .t.
endif
*
*---------------------------------------------------------
Function ADOSort( cField, nModo )
if valtype(cField)='N'
cField := oRecordSet[nRecordSet]:Fields( cStrField ):Name
endi
if cField = Nil
Return upper(oRecordSet[nRecordSet]:Sort)
else
oRecordSet[nRecordSet]:Sort := cField + iif( nModo = NIL, " ASC", " DESC" )
oRecordSet[nRecordSet]:MoveFirst()
endif
return .t.
*
*---------------------------------------------------------
Function ADOFiles( cTable )
return iif(oRecordSet[nRecordSet]:Table(cTable)==cTable,.t.,.f.)
*
*---------------------------------------------------------
Function ADOAREAS()
return nRecordSet
*
*---------------------------------------------------------
Function ADOSelect( cRecordSet )
if cRecordSet = nil
else
if cADORDD = "XLS"
cRecordSet := "[" + cRecordSet + "$]"
endif
nRecordSet := ASCAN( aRecordSet, cRecordSet )
nRecordSet := iif( nRecordSet = 0, 1, nRecordSet )
endif
//ADOGotop()
return nRecordSet
*
*---------------------------------------------------------
Function ADOLOG( cMensagem )
local nHandle
if .not. file( "ADOERRO.TXT" )
nHandle := fcreate("ADOERRO.TXT",0)
else
nHandle := fopen("ADOERRO.TXT",1)
length := fseek(nHandle,0,2)
fseek(nHandle,length)
endif
fwrite(nHandle, cMensagem )
fclose(nHandle)
return NIL
*
*---------------------------------------------------------
Function ADOReplace( cCampo, xDado )
LOCAL uVal,xValor,nTipo,cType,nLong,cQuery,lRepassa := .f., lBlob := .f.,;
StrFileName
uVal := oRecordSet[nRecordSet]:Fields( cCampo ):Value
nTipo := oRecordSet[nRecordSet]:Fields( cCampo ):Type
cType := TypeDat(nTipo,cCampo)
nLong := oRecordSet[nRecordSet]:Fields( cCampo ):DefinedSize
if ! Empty( xDado )
if ValType( xDado ) = 'D'
if nTipo= 7 .or. nTipo=133 .or. nTipo=135
if empty( xDado )
xDado := date()
endif
lRepassa := .t.
endif
endif
if ValType( xDado ) = 'N'
if nTipo=17 .or. nTipo= 14 .or. nTipo= 5 .or. nTipo= 3 .or. nTipo=131 .or. nTipo= 2 .or. nTipo= 6 .or. ;
nTipo= 4 .or. nTipo=020 .or. nTipo=018 .or. nTipo=019 .or. nTipo= 21 .or. nTipo=138 .or. nTipo=139
lRepassa := .t.
endif
endif
if ValType( xDado ) = 'C'
if nTipo=202 .or. nTipo=130 .or. nTipo=200 .or. nTipo=201 .or. nTipo=129 .or. nTipo= 72
xDado := substr( xDado, 1, nLong )
lRepassa := .t.
endif
if nTipo=201 .or. nTipo=203 .or. nTipo=205 .or. nTipo=128
StrFileName := Alltrim(StrZero(Random(99999999),8))+".APL"
MemoWrit( StrFileName, xDado )
lRepassa := .t.
lBlob := .t.
endif
endif
if ValType( xDado ) = 'L'
if nTipo= 11 .or. nTipo= 16
lRepassa := .t.
endif
endif
if ValType( xDado ) = 'M' .or. ValType( xDado ) = 'I'
if nTipo=201 .or. nTipo=203 .or. nTipo=205 .or. nTipo=128
lRepassa := .t.
lBlob := .t.
endif
endif
if lRepassa
if lBlob // adolog( ccampo+"-"+ctype+"-"+strzero(ntipo,3)+"-"+ValType( xDado ) )
oADOStream:Type := 1 // adTypeBinary
oADOStream:Open()
oADOStream:LoadFromFile( StrFileName )
oRecordSet[nRecordSet]:Fields( cCampo ):Value := oADOStream:Read()
oADOStream:Close()
else
oRecordSet[nRecordSet]:Fields( cCampo ):Value := xDado
endif
endif
endif
return .t.
*
*---------------------------------------------------------
Function ADOField( cStrField )
LOCAL uVal,nTipo,cType,nLong,xValor:=nil,StrFileName
if valtype(cStrField)='C'
cStrField := upper(alltrim(cStrField))
endif
if nRecordSet > 0
uVal := oRecordSet[nRecordSet]:Fields( cStrField ):Value
nTipo := oRecordSet[nRecordSet]:Fields( cStrField ):Type
cType := TypeDat(nTipo,cStrField)
nLong := oRecordSet[nRecordSet]:Fields( cStrField ):DefinedSize
do case
case cType='C'; xValor:=if(empty(uVal),spac(nLong),uVal+spac(nLong-len(uVal)))
case cType='D'; xValor:=if(empty(uVal),ctod('') ,uVal)
case cType='N'; xValor:=if(empty(uVal),0 ,uVal)
case cType='L'; xValor:=if(empty(uVal),.f. ,uVal)
case cType='M' .or. cType='I'
StrFileName := Alltrim(StrZero(Random(99999999),8))+".APL"
oADOStream:Type := 1 // adTypeBinary
oADOStream:Open()
oADOStream:Write( oRecordSet[nRecordSet]:Fields( cStrField ) )
oADOStream:LoadFromFile( oRecordSet[nRecordSet]:Fields( StrFileName ), 2 ) // adSaveCreateOverWrite
oADOStream:Close()
xValor := MemoRead( StrFileName )
otherwise ; xValor:= uVal
endcase
endif
RETURN xValor
*
*---------------------------------------------------------
Function ADOFieldBlank( cStrField )
LOCAL uVal,nTipo,cType,nLong,xValor:=nil
if valtype(cStrField)='C'
cStrField := upper(alltrim(cStrField))
endif
if nRecordSet > 0
uVal := oRecordSet[nRecordSet]:Fields( cStrField ):Value
nTipo := oRecordSet[nRecordSet]:Fields( cStrField ):Type
cType := TypeDat(nTipo,cStrField)
nLong := oRecordSet[nRecordSet]:Fields( cStrField ):DefinedSize
do case
case cType='C'; xValor:=space(nLong)
case cType='D'; xValor:=ctod(' / / ')
case cType='N'; xValor:=0
case cType='L'; xValor:=.f.
otherwise ; xValor:=''
endcase
endif
RETURN xValor
*
*---------------------------------------------------------
Function TypeDat(nTipo,cField)
do case
case nTipo=8.or.nTipo=12.or.nTipo=72.or.nTipo=129.or.nTipo=130.or.(nTipo>=200.and.nTipo<=203)
// adBSTR 8
// adGUID 72
// adChar 129
// adWChar 130
// adVarChar 200
// adLongVarChar 201
// adVarWChar 202
// adLongVarWChar 203
return 'C'
case nTipo= 17.or.nTipo= 16.or.nTipo= 14.or.nTipo= 5.or.nTipo= 3.or.nTipo=131.or.nTipo= 2 .or.nTipo= 6.or.;
nTipo= 4.or.nTipo=020.or.nTipo=018.or.nTipo=019.or.nTipo= 21.or.nTipo=138.or.nTipo=139
// adSmallInt 2
// adInteger 3
// adSingle 4
// adDouble 5
// adCurrency 6
// adDecimal 14
// adTinyInt 16
// adUnsignedTinyInt 17
// adUnsignedSmallInt 18
// adUnsignedInt 19
// adBigInt 20
// adUnsignedBigInt 21
// adNumeric 131
// adPropVariant 138
// adVarNumeric 139
return 'N' // Numerico
case nTipo= 7.or.nTipo=64.or.nTipo=133.or.nTipo=134.or.nTipo=135
// adDate 7
// adFileTime 64
// adDBDate 133
// adDBTime 134
// adDBTimeStamp 135
return 'D' // Data
case nTipo= 11
// adBoolean 11
return 'L' // Logico
case nTipo=203.or.nTipo=128
// adLongVarWChar 203
// adPropVariant 138
return 'M' // Memo
case nTipo=128.or.nTipo=204.or.nTipo=205
// adBinary 128
// adVarBinary 204
// adLongVarBinary 205
return 'I' // Imagem
otherwise
alert('Tipo de dado invalido: Campo '+cField+' Type='+str(nTipo))
endcase
return 'U'
*
*---------------------------------------------------------
Function isRSEmpty()
return ((oRecordSet[nRecordSet]:BOF()=.t.) .and. (oRecordSet[nRecordSet]:EOF()=.t.))
*
*---------------------------------------------------------
Function ADOGetSQL( sqlFileName )
sqlFileName = sqlFileName + ".SQL"
if file(sqlFileName)
cSql := MemoRead( sqlFileName )
oADOConection:Execute( cSql )
endif
return nil
*
*---------------------------------------------------------
Function ADOUseRemote( cDatabase, lShared )
local oError
if cDatabase = NIL
oRecordSet[nRecordSet]:Close()
else
AADD( aRecordSet, cDatabase )
cRecordSet := cDatabase
nRecordSet := len( aRecordSet )
oRecordSet[nRecordSet] := oADOConection
if cADORDD = "XML" // ".XML" $ upper(cDatabase)
oRecordSet[nRecordSet]:Open( cDatabase, StrConnection, 1, 3 )
else
oRecordSet[nRecordSet]:CacheSize := 50
oRecordSet[nRecordSet]:CursorLocation := adUseClient
if lShared = .t.
oRecordSet[nRecordSet]:CursorType := 1 // adOpenKeySet
oRecordSet[nRecordSet]:LockType := adLockBatchOptimistic
else
oRecordSet[nRecordSet]:CursorType := adOpenStatic
oRecordSet[nRecordSet]:LockType := adLockPessimistic
endif
oRecordSet[nRecordSet]:Sql( "Select * from " + cDatabase, StrConnection )
endif
oRecordSet[nRecordSet]:MoveFirst()
endif
return .t.
function Random( nMaximo )
static nRandom
local nTemporal
nMaximo = if( nMaximo == NIL, 65535, nMaximo )
if nRandom == NIL
nRandom = seconds()
endif
nTemporal = ( nRandom * seconds() ) % ( nMaximo + 1 )
nRandom = nTemporal + seconds()
RETURN int( nTemporal )