Discussão do artigo "SQL e MQL5: Trabalhando com Banco de Dados SQLite" - página 4

 

Serhii Shevchuk:

Sei que você é um homem difícil de ser ajudado.

Como posso ajudá-lo se você não me disser como chegou ao seu problema?

Talvez você esteja executando em um Mac ou tenha uma pasta com permissões de somente leitura.

Não sei qual é o seu sistema de arquivos.

Do fórum sobre carros:

xxx: motor crepitando após a substituição das tampas de óleo. Ajuda para entender as causas e quais podem ser as consequências

uuu: Pode haver muitas causas, mas as consequências podem ser diferentes.

xxx: Obrigado.



Ainda não sei o motivo.

Quando você descobrir, me avise.

 
Não li o artigo inteiro, pois essas bibliotecas são uma bagunça. No entanto, peguei algumas coisas para mim, pois foi a primeira coisa que vi sobre esse assunto. Depois, percebi que precisava ler a documentação oficial, pois não é possível aprender nada com um artigo como esse. De fato, eu diria que as informações sobre as funções sqlite3_bind_xxx não estão corretas. O autor do artigo está induzindo ao erro. A finalidade dessas funções é completamente diferente. Se o próprio autor do artigo não estudou o assunto ou não quis apenas escrever sobre ele, seria melhor não escrever. Depois que li essa bobagem sobre essa funcionalidade no artigo, tive que pensar sobre tudo isso por mais de uma hora. Exatamente. Comecei a trabalhar com DBMS há apenas uma semana. Estou pegando o jeito. Por isso não foi fácil entender. E quando percebi para que servem as funções sqlite3_bind_xxx, fiquei surpreso. Não esperava tal coisa do autor do artigo. Eu achava que ele era um profissional.
 
Não testei o material anexado ao artigo, mas tenho um erro semelhante nas vantagens. Não consigo abrir/criar uma base no caminho passado, ela sempre é criada no diretório do projeto ou no caminho especificado a partir do diretório do projeto (/nova pasta/myDB.db)...

Importeias funções de criação e fechamento da base e tentei criá-la. Como resultado, tenho o banco de dados criado nos downloads.
 
---:

Pode haver muitas causas e muitas consequências.

Obrigado, isso ajudou. Problema resolvido, pergunta removida.

 
Tenho uma situação muito interessante) ontem mesmo tudo foi criado e funcionou (embora a partir de algo na pasta "Downloads"). Mas, da noite para o dia, o arquivo de base parou de ser criado, mas a base em si funciona como deveria. Para testes, tentei criar uma base colocada na memória sqlite3_open(":memory:""") - a base é criada, os dados são carregados/lidos.

Talvez um problema com os direitos de acesso, o que você acha?
 
Andrey Azatskiy:
Eu tenho uma situação muito interessante) ontem mesmo tudo foi criado e funcionou (embora a partir de algo na pasta "Downloads") Mas, da noite para o dia, o arquivo de base parou de ser criado, mas a base em si funciona como deveria para testes tentou criar uma base colocada na memória sqlite3_open(":memory:""") - a base é criada, os dados são carregados / lidos.

Talvez um problema com direitos de acesso, o que você acha? como verificar isso no Windows sabe quem?

Na verdade, é fácil de verificar. Para começar, tente colocar o banco de dados em "Meus documentos". Se funcionar, então não é uma questão de direitos. Mas, em geral, depende de como você fez isso. Pessoalmente, passei duas semanas até criar tudo o que precisava para trabalhar com o SQLite3. Tive que traduzir a documentação, porque em russo não há informações adequadas sobre esse assunto. Assim como neste artigo, há muita besteira e levak. Acima, eu atraí um dos momentos. Então parei e estudei o assunto por conta própria.

Eu tenho um invólucro para isso:

//==================================================================================================================================================================================
// Wrapper básico para sqlite3_open_v2. ==============================================================================================================================================
int SQLite3 :: sqlite3_open(const string& filename, intptr_t& dbHandle, int flags) {
  uchar utf8_filename[];
  stringToUtf8(filename, utf8_filename);
  return sqlite3_open_v2(utf8_filename, dbHandle, flags, 0);
}

Aqui está a função stringToUtf8:

//==================================================================================================================================================================================
// Converta uma string em uma matriz de bytes utf-8. =========================================================================================================================================
void stringToUtf8(const string strToConvert,                     // String a ser convertida em uma matriz na codificação utf-8
                  uchar& utf8[],                                 // Matriz na codificação utf-8, na qual a string convertida strToConvert será colocada
                  const bool untilTerminator = true) export {    // Número de caracteres que serão copiados para a matriz utf8 e convertidos para a codificação utf-8.
//---
  int count = untilTerminator ? -1 : StringLen(strToConvert);
  StringToCharArray(strToConvert, utf8, 0, count, CP_UTF8);
}

Eu a tenho em uma biblioteca separada.

 
Viktar Dzemikhau:

Na verdade, é fácil verificar. Para começar, tente colocar o banco de dados em "Meus documentos". Se funcionar, então não é uma questão de direitos. Mas, em geral, depende de como você fez tudo isso. Pessoalmente, passei duas semanas até criar tudo o que precisava para trabalhar com o SQLite3. Tive que traduzir a documentação, porque em russo não há informações adequadas sobre esse assunto. Assim como neste artigo, há muita besteira e levak. Acima, eu atraí um dos momentos. Então desisti e estudei o assunto por conta própria.

Tenho um invólucro para isso:

E aqui está a função stringToUtf8:

Eu a tenho em uma biblioteca separada.

Sim, tive dois erros:
1 - codificação (muito obrigado pela função, eu não sabia como traduzir normalmente para UTF -8)
2 - permissões.


 
Andrey Azatskiy:

Sim, tive dois erros:
1 - codificação (muito obrigado pela função, eu não sabia como traduzir normalmente para UTF -8)
2 - permissões.


Sim, de nada. Eu me lembro dos problemas que tive com isso. Com artigos tão ruins. Há uma opção. Ou você lê a documentação oficial ou pergunta. Não havia ninguém para perguntar. Tive que estudá-la sozinho. A questão é que, se você escreve em C++, há alguém a quem perguntar. Mas quando você escreve através de uma junta e transfere para o µl, há poucas pessoas que podem ajudá-lo. É muito difícil para os usuários Plus entrarem no assunto)))

 

Acho que encontrei um vazamento de memória:

Na linha 250 do arquivo SQLite3Base.mqh

::sqlite3_finalize(stmt); // limpo

Deveria ser:

::sqlite3_finalize(pstmt); // limpo
 
Viktar Dzemikhau:

Na verdade, é fácil verificar. Para começar, tente colocar o banco de dados em "Meus documentos". Se funcionar, então não é uma questão de direitos. Mas, em geral, depende de como você fez tudo isso. Pessoalmente, passei duas semanas até criar tudo o que precisava para trabalhar com o SQLite3. Tive que traduzir a documentação, porque em russo não há informações adequadas sobre esse assunto. Assim como neste artigo, há muita besteira e levak. Acima, eu atraí um dos momentos. Então desisti e estudei o assunto por conta própria.

Tenho um invólucro para isso:

E aqui está a função stringToUtf8:

Eu a tenho em uma biblioteca separada.

e eu a utilizo para converter para utf

int u2a(string txt,uchar &out[]){ return(StringToCharArray(txt,out))};