Graziani Garcia  

Boa tarde.

Estou implementando meu primeiro robô integrando ele ao banco de dados sqlite. Utilizando a seguinte função para realizar a inserção das informações:

void insereSinais(string sDesPar, string sDirOpe, float nTaxOpe){
   DatabaseTransactionBegin(bd);
   sSql = StringFormat("Insert into Sinais "
                              "(DesPar, DirOpe, TaxOpe) "
                       "Values ('%s','%s', %G)",
                              sDesPar, sDirOpe, nTaxOpe);
   DatabaseTransactionCommit(bd);                       
   if(!DatabaseExecute(bd, sSql)){
      Print("Erro ao inserir no banco. ", GetLastError(), " - ", sSql);
      DatabaseClose(bd);
   }
}

Onde os campos sDesPar, sDirOpe e n TaxOpe são respectivamente: Paridade, direção da operação (call/put) e o preço.


Algumas paridades são armazenadas no banco de dados corretamente, porém, em alguns casos (que eu não soube identificar) ocorre o erro 5605 -  Database file locked.


Caso alguém já tiver passado por esta mesma mensagem e puder compartilhar a solução ficaria agradecido.


Obrigado!

Ruy Christian Hoffmann  
Graziani Garcia:

Boa tarde.

Estou implementando meu primeiro robô integrando ele ao banco de dados sqlite. Utilizando a seguinte função para realizar a inserção das informações:

Onde os campos sDesPar, sDirOpe e n TaxOpe são respectivamente: Paridade, direção da operação (call/put) e o preço.


Algumas paridades são armazenadas no banco de dados corretamente, porém, em alguns casos (que eu não soube identificar) ocorre o erro 5605 -  Database file locked.


Caso alguém já tiver passado por esta mesma mensagem e puder compartilhar a solução ficaria agradecido.


Obrigado!

Olá Graziani,

Esse erro ocorre geralmente quando você tenta modificar um registro já em uso, ou principalmente quando você tenta abrir uma nova sessão mas a anterior não foi encerrada.

No tempo que usava SQLite o bichinho era meio tinhoso para encerrar sessão. Faz alguns bons anos que não mexo com o SQLite, mas lembro-me que eu contornava os problemas com o Close usando o .Dispose() em vez do .Close. E ainda as vezes usava via timeout (se não tiver enganado no nome) com um tempo bem curtinho, como redundante caso a conexão ainda tivesse ficado aberta.

Dá umas olhadas nesta direção acima, acho que vale a pena.

Graziani Garcia  

Boa tarde Ruy,

Obrigado pela atenção, mas onde eu informo esta função .Dispose() no código acima?

Ruy Christian Hoffmann  
Graziani Garcia:

Boa tarde Ruy,

Obrigado pela atenção, mas onde eu informo esta função .Dispose() no código acima?

Graziani,

Dei agora uma folheada na documentação do MQL5 para sqlite achei pobre demais sobre o sqlite. Também não achei nada sobre o Dispose.

Mas observei que em todos os exemplos eles só realmente só fazem o close como você já está fazendo.

Mas achei algo interessante aqui nesse link https://www.mql5.com/pt/articles/69 além do .close e depois apagar as tabelas temporárias, ele tem um tratamento de erro, veja:

   conn.Close();

   delete tran;
   delete cmd;
   delete conn;




if(CheckAdoError())
     {
      ResetAdoError();
      return false;
     }

Nos exemplos eu não achei essas duas funções o que fazem: CheckAdoError()ResetAdoError(). Mas tem os arquivos.ZIP no final desse artigo e lá deve ter essas duas funções.  É bem provável que apague as temporárias, reindexa e fecha e pode ser por ai a solução de seu problema. Dá uma olhada lá pode ter coisa boa pra você.

Graziani Garcia  

Obrigado novamente pela atenção.


Vou ler e testar o que me disse, se der certo posto aqui os resultados.