Descrição:
Classe de bulkinsert via insertInto. Os dados são recebidos pela aplicação, que sabe o momento certo de disparar o insert no bancoque realiza a inserção de diversos registros no banco de dados em bloco. Desta forma, ao invés de ser enviada uma instrução de insert para cada linha inserida é enviado um único comando de insert para a quantidade de registros definidos no buffer.
Dica | ||
---|---|---|
| ||
A utilização da classe FWBulk comparada com um processo que envolva diversos inserts no banco chega a ser de 30% a 40% mais performática. |
Informações | ||
---|---|---|
| ||
Para a sua utilização é necessário possuir DBAccess com versão maior ou igual a 20181212 e versão de lib maior ou igual a 20201009. |
...
Métodos:
...
New()
Sintaxe:
FwBulk():New()
...
Método de inicialização da classe
Parâmetros:
Nome | Tipo | Descrição | Obrigatório |
cTable | Carácter | tabela que será utilizada no processo de bulkinsert | X |
nLimit | Numérico | Quantidade de registro que será utilizado no flush dos dados. Opcional. Default 600 |
Retorno:
Objeto da classe FWBulk
...
Indica para a classe FWBulk quais os campos serão utilizados no processo
Parâmetros:
Nome | Tipo | Descrição | Obrigatório |
aFields | Array | Array dos campos, onde {{Campo},{Campo}}. Pode-se enviar como conteúdo o retorno da função dbstruct. | X |
Importante!
A ordem desse array deve ser a mesma dos dados informados no método AddData.
...
Indica o nome da tabela no banco de dados
Parâmetros:
Nome | Tipo | Descrição | Obrigatório |
cTable | Carácter | Nome da tabela do banco de dados | X |
AddData( aData )
Sintaxe:
FWBulk():AddData( aData )
...
Adiciona dados ao bulk. Caso o limite de dados seja alcançado, também faz o flush dos dados.
Parâmetros:
Nome | Tipo | Descrição | Obrigatório |
aData | Array | Array dos dados que serão persistidos no banco de dados, onde {valor,valor} | X |
Importante!
A ordem desse array deve ser a mesma dos dados informados no método SetFields.
...
lCanUse lógico, se verdadeiro, o bulk está disponível para uso.
SetCanBulk( lSet )
Sintaxe:
FWBulk():SetCanBulk( lSet )
Descrição:
Troca a variável de controle para permitir ou não o uso do Bulk
Parâmetros:
...
Importante!
Devido o banco de dados SQLite não permitir o bulk, existe uma trava para a utilização no mesmo.
Retorno:
lOldCanUse lógico, Retorna o estado anterior(bulk ligado, desligado ou nilObs.: Este método não depende da classe FWBulk ser inicializada por New, por este motivo, deve-se utilizar FWBulk():CanBulk()
...
Exemplo:
Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
User Function myBulk() Local oBulk as object Local aStruct as array Local nX as numeric Local lCanUseBulk as logical aStruct := {} aAdd( aStruct, { 'FIELD1', 'C', 10, 0 } ) aAdd( aStruct, { 'FIELD2', 'N', 10, 2 } ) aAdd( aStruct, { 'FIELD3', 'M', 10, 0 } ) aAdd( aStruct, { 'FIELD4', 'D', 8, 0 } ) aAdd( aStruct, { 'FIELD5', 'L', 1, 0 } ) FWDBCreate( 'BULKTBL', aStruct , 'TOPCONN' , .T.) oBulk := FwBulk():New('BULKTBL',2) lCanUseBulk := FwBulk():CanBulk() // Este método não depende da classe FWBulk ser inicializada por NEW if lCanUseBulk oBulk:SetFields(aStruct) endif For nX := 1 to 5 if lCanUseBulk oBulk:AddData({cValToChar(nX),(nX,nX),cValToChar(nX),Date(),mod(nX,2)==0}) else RecLock("BULKTBL",.T.) BULKTBL->FIELD1 := cValToChar(nX) BULKTBL->FIELD2 Next := (nX,nX) BULKTBL->FIELD3 oBulk :Close= cValToChar(nX) BULKTBL->FIELD4 oBulk :Destroy= Date() BULKTBL->FIELD5 := mod(nX,2)==0 MsUnLock() endif Next if lCanUseBulk oBulk:Close() oBulk:Destroy() oBulk := nil endif Return |