SQLITE - INSERT FAILED WITH CODE 5601

 

Estou testando o sqlite seguindo o artigo https://www.mql5.com/pt/articles/7463, mas estou recebendo o erro "INSERT FAILED WITH CODE 5601 ". Sei que tem algum erro com a linha que insere dados, mas já estou a dois dias procurando o erro.  Procurei na internet outros exemplos, li a documentação, mas não encontrei onde está o erro. Alguém pode, por gentileza, me indicar o problema ou me passar um exemplo de como resolver?


//+------------------------------------------------------------------+
//|                                         criar_banco_de_dados.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string filename="teste2.sqlite";
//--- criamos o banco de dados e abrimos para leitua e gravação
   int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE);
   if(db==INVALID_HANDLE)
     {
      Print("DB: ", filename, " open failed with code ", GetLastError());
      return;
     }
     
  //--- criamos a tabela do ativo 
   if(!DatabaseExecute(db, "CREATE TABLE TAEE11F("
                       "ID INT PRIMARY             KEY            NOT NULL,"
                       "bid_unit                   REAL           NOT NULL,"
                       "volume_bid_unit            REAL           NOT NULL,"
                       "ask_unit                   REAL           NOT NULL,"
                       "volume_ask_unit            REAL           NOT NULL,"
                       "rentabilidade_compra_unit  REAL);"))         
     {
      Print("DB: ", filename, " create table failed with code ", GetLastError());
      DatabaseClose(db);
      return;
     }
   //--- insere dados na tabela 
     //string ativo = "TAEE11F";
     if(!DatabaseExecute(db, "INSERT INTO TAEE11F (ID, bid_unit, volume_bid_unit, ask_unit, volume_ask_unit, rentabilidade_compra_unit) VALUES (1','2','3','5,'6);"))                
     {
      Print("DB: ", filename, " insert failed with code ", GetLastError());
      DatabaseClose(db);
      return;
     }
     
  
//--- fechamos o banco de dados
   DatabaseClose(db);
  }
//+------------------------------------------------------------------+
SQLite: trabalho nativo com bancos de dados SQL em MQL5
SQLite: trabalho nativo com bancos de dados SQL em MQL5
  • www.mql5.com
O desenvolvimento de estratégias de negociação está associado ao processamento de grandes quantidades de dados. Agora, em MQL5, você pode trabalhar com bancos de dados usando consultas SQL baseadas no SQLite. Uma vantagem importante desse mecanismo é que todo o banco de dados está contido em um único arquivo, localizado no computador do usuário.
 

Quando fiz isso, lembro que segui no ajuda do MT5 e funcionou perfeitamente.

Olhando o seu código verifiquei que vc cria a tabela e fecha ela, após fechar vc insere os dados...acho que vc nao pode fechar a tabela se for querer inserir algum dado, verifique isso...só feche a tabela após inserir os dados, ou senão antes de inserir abra.

Pois o comando de abrir o banco de dados tem as opções de somente leitura, leitura/gravação...como nessas linhas que vc colou não aparece como vc está abrindo o arquivo, o problema deve ser isso

 
O Banco de dados foi aberto como leitura e gravação. Conforme linha abaixo. Creio que não seja isso, pois a tabela ele consegue criar com sucesso.

int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE);

Não localizei nenhuma linha que indique o fechamento da tabela. Apenas comando pra fechar o BD se der erro ou no final.

Mas obrigado pelas tentativas, como é um erro genérico está difícil acha-lo. Mas deve ser algum erro bem bobo que estou comentando. No mais o código do artigo funciona. O que não funciona é a pequena alteração que estou tentando fazer pra assimilar o conteúdo.
 

realmente eu tinha entendido errado o codigo, mas só fecha a tabela em caso de erro, vc está certo.


Outra coisa que acabei de ver é que vc tem 6 parametros e está passando 5 valores

ID, bid_unit, volume_bid_unit, ask_unit, volume_ask_unit, rentabilidade_compra_unit) VALUES (1','2','3','5,'6);"

Bem provavel que seja isso, pq vc nao criou nada auto incremento, então tem que passar todos os valores

 
Putz! Deve ser isso mesmo! Vou testar daqui a pouco. Obrigado.
 

Descobri o erro. Eram 2 na verdade, além da quantidade de itens, faltou coloca-los todos com sinal de '. O código ficou assim:


   //--- criamos a tabela do ativo 
   if(!DatabaseExecute(db, "CREATE TABLE TAEE11F("
                       "ID INTEGER PRIMARY KEY AUTOINCREMENT         NOT NULL,"
                       "bid_unit                   REAL           NOT NULL,"
                       "volume_bid_unit            REAL           NOT NULL,"
                       "ask_unit                   REAL           NOT NULL,"
                       "volume_ask_unit            REAL           NOT NULL,"
                       "rentabilidade_compra_unit  REAL           NOT NULL);"))         
     {
      Print("DB: ", filename, " create table failed with code ", GetLastError());
      DatabaseClose(db);
      return;
     }
     
   //--- insere dados na tabela 
     //string ativo = "TAEE11F";
     if(!DatabaseExecute(db, "INSERT INTO TAEE11F "
                        "(bid_unit, volume_bid_unit, ask_unit, volume_ask_unit, rentabilidade_compra_unit)"
                        "VALUES ('1','2','3','4','5');"))  


Segui sua sugestão e coloquei o ID como Autoincrement. Vou tentar agora inserir algumas variável na tabela. Você sabe me dizer se preciso primeiro criar um string com o comando SQL que quero executar ou tem alguma forma mais fácil?

 

Deu certo!!!

   //--- insere dados na tabela 
     string ativo = "TAEE11F";
     double bid_unit = 1.00;
     double volume_bid_unit = 100;
     double ask_unit = 1.00;
     double volume_ask_unit = 100;
     double rentabilidade_compra_unit = 0.78;

     string insere_cotacao = "INSERT INTO "+ativo+" "
                             "(bid_unit, volume_bid_unit, ask_unit, volume_ask_unit, rentabilidade_compra_unit)"
                             "VALUES ('"+bid_unit+"','"+volume_bid_unit+"','"+ask_unit+"','"+volume_ask_unit+"','"+rentabilidade_compra_unit+"');"; 

     if(!DatabaseExecute(db, insere_cotacao))                     
     {
      Print("DB: ", filename, " insert failed with code ", GetLastError());
      DatabaseClose(db);
      return;
     }
 

Boa garoto!!

Eu sabia que vc conseguiria rsrs!!

Razão: