Обсуждение статьи "SQL и MQL5: Работаем с базой данных SQLite" - страница 4

 
Andrey Azatskiy:
У меня очень интересная ситуация) буквально вчера все создавалось и работало (правда от чего то в папке "Загрузки") Но, за ночь файл базы перестал создаваться, однако сама база работает как надо для тестов пробовал создать базу размещенную в памяти sqlite3_open(":memory:") - база создается, данные загружаются / считываются. 

Возможно проблема с правами доступа, как считаете? как бы это в виндовс проверить знает кто? 

Это легко проверить, на самом деле. Попробуй для начала в "Мои документы" запихнуть БД. Если получится, значит дело не в правах. А вообще, смотря как ты это всё делал. Я лично недели 2 продолбался, пока создал себе всё что нужно для работы с SQLite3. Пришлось переводить документацию, т.к. на русском языке нет адекватной информации по этому поводу. Как и в этой статье много мусора и левака. Выше я привл один из моментов. Потом я забил и сам изучил вопрос.

У меня есть для этого такой wrapper:

//==================================================================================================================================================================================
// Basic wrapper for 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);
}

А вот и функция stringToUtf8:

//==================================================================================================================================================================================
// Convert a string to a utf-8 byte array. =========================================================================================================================================
void stringToUtf8(const string strToConvert,                     // Строка, которую необходимо преобразовать в массив в кодировке utf-8
                  uchar& utf8[],                                 // Массив в кодировке utf-8, в который будет помещена преобразованная строка strToConvert
                  const bool untilTerminator = true) export {    // Количество символов, которые будут скопированы в массив utf8 и соот-но преобразованны в кодировку utf-8
//---
  int count = untilTerminator ? -1 : StringLen(strToConvert);
  StringToCharArray(strToConvert, utf8, 0, count, CP_UTF8);
}

Она у меня в отдельной библиотеке.

 
Viktar Dzemikhau:

Это легко проверить, на самом деле. Попробуй для начала в "Мои документы" запихнуть БД. Если получится, значит дело не в правах. А вообще, смотря как ты это всё делал. Я лично недели 2 продолбался, пока создал себе всё что нужно для работы с SQLite3. Пришлось переводить документацию, т.к. на русском языке нет адекватной информации по этому поводу. Как и в этой статье много мусора и левака. Выше я привл один из моментов. Потом я забил и сам изучил вопрос.

У меня есть для этого такой wrapper:

А вот и функция stringToUtf8:

Она у меня в отдельной библиотеке.

Да, у меня было 2 ошибки:
1 - кодировка (спасибо огромное за функцию, я уже не знал как перевести нормально в UTF -8) 
2 - права доступа. 


 
Andrey Azatskiy:

Да, у меня было 2 ошибки:
1 - кодировка (спасибо огромное за функцию, я уже не знал как перевести нормально в UTF -8) 
2 - права доступа. 


Да, пожалуйста. Сам вспоминаю, сколько продолбался с этим. С такими горе-статьями.. Вариант один есть. Берёшь читаешь оф. документацию, либо спрашиваешь.. Спрашивать было не у кого. Пришлось изучать самостоятельно. Тут суть в том, что если писать на С++ спросить есть у кого. А когда через прокладку писать и передавать в мкл, тут уже мало кто может помочь. Влом плюсовцам в этом вникать))

 
Viktar Dzemikhau:

Это легко проверить, на самом деле. Попробуй для начала в "Мои документы" запихнуть БД. Если получится, значит дело не в правах. А вообще, смотря как ты это всё делал. Я лично недели 2 продолбался, пока создал себе всё что нужно для работы с SQLite3. Пришлось переводить документацию, т.к. на русском языке нет адекватной информации по этому поводу. Как и в этой статье много мусора и левака. Выше я привл один из моментов. Потом я забил и сам изучил вопрос.

У меня есть для этого такой wrapper:

А вот и функция stringToUtf8:

Она у меня в отдельной библиотеке.

а я использую для преобразования к utf

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

Возможно кому-то будет полезно.


В МТ4 код работает почти без изменений

У меня долго не создавался сам файл БД. Т.е. результаты есть, а файла нет. 


Решение: прописать полный путь к файлу, например так:

  string path2 = TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL4\\Files\\DB.db3";
   
  if(sql3.Connect(path2)!=SQLITE_OK) return;
 

Вопрос


Видимо это особенности кодировки. 

Если записывать русский текст в БД, то в SQLite studio он выглядит криво (ромбики с вопросом). 

А если вбить русский текст вручную, то потом он криво выглядит в МТ4.


Вопрос: как сделать отображение текста в правильной кодировке, чтоб был виден русский текст?