как в MQL4 прочитать результат функции mysql_fetch_row ?
У меня в данный момент идет разработка скрипта по для работы с базой данный MySQL чтение, вставка, удаление и модификация.
Скрипт объёмный, но суть работы с базой данных будет понятна думаю из одной функции.
Правда в данном примере возвращается ID записи из таблицы, но переделать проблем не составит, помнится я и текст и цифры возвращал из базы, все работало.
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+#import "libmysql.dll"int mysql_init(int db);
int mysql_errno(int TMYSQL);
int mysql_real_connect(int TMYSQL, string host, string user, string password, string DB,int port,int socket,int clientflag);
int mysql_real_query(int TMSQL, string query, int length);
int mysql_store_result(int TMSQL);
string mysql_fetch_row(int result);
int mysql_num_rows(int result);
void mysql_free_result(int result);
void mysql_close(int TMSQL);
int mysql_insert_id(int result);
#import//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int mysql; string query = ""; int myerr;
int CompanyID = 0;
int SymbolID = 0;
int LastRecordQuotesID = 0;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+bool connect() {
mysql = mysql_init(mysql);
if (mysql!=0) Print("allocated");
string host="IP adress"; // меняем на своёstring user="Login"; // меняем на своёstring password="Password"; // меняем на своёstring DB="db_base"; // меняем на своёint clientflag=0;
int port=3306;
string socket="";
int res=mysql_real_connect(mysql,host,user,password,DB,port,socket,clientflag);
int err=GetLastError();
if (res==mysql){
Print("connected");
return(true);
} else {
Print("error=",mysql," ",mysql_errno(mysql)," ");
return(false);
}
return(false);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int start(){
if(!connect()) return(0);
//----
CompanyID = CompanyID(AccountCompany(), AccountServer());
//----
mysql_close(mysql);
return(0);
}
//+--------------------------------------------------------------------------------------------+//| Функция поиска и вставки названия компании и сервера для связи. |//+--------------------------------------------------------------------------------------------+//| Переменные: |//| string AccCompany - AccountCompany() |//| string AccServer - AccountServer() |//+--------------------------------------------------------------------------------------------+int CompanyID(string AccCompany = "", string AccServer = ""){
int count_records, result;
string row = "";
query = StringConcatenate("SELECT id FROM Company WHERE Company = \'",AccCompany,"\' AND `Server` = \'",AccServer,"\'");
mysql_real_query(mysql,query,CountLength(query));
myerr = mysql_errno(mysql);
if(myerr > 0) Print("error=",myerr);
result = mysql_store_result(mysql);
count_records = Number_Of_Rows(result);
if (count_records > 0){
row = mysql_fetch_row(result);
mysql_free_result(result);
return( StrToInteger(StringSubstr(row, 8, StringLen(row)-1) ) );
} else {
query = StringConcatenate( "INSERT INTO `Company` (`Company`, `Server`) VALUES (\'",AccCompany ,"\', \'",AccServer,"\')");
mysql_real_query(mysql,query,CountLength(query));
myerr = mysql_errno(mysql);
if(myerr > 0) Print("CompanyID(): error=",myerr);
mysql_free_result(result);
return(mysql_insert_id(mysql));
}
}
//+--------------------------------------------------------------------------------------------+//| Вспомогательная Функция подсчёта колличества символов в передаваемом запросе. |//+--------------------------------------------------------------------------------------------+//| Переменные: |//| string query - Текстовая страка |//+--------------------------------------------------------------------------------------------+int CountLength(string query){
return(StringLen(query));
}
//+--------------------------------------------------------------------------------------------+//| Вспомогательная Функция подсчёта колличества результатов из базы данных |//+--------------------------------------------------------------------------------------------+//| Переменные: |//| int result - Результат запроса |//+--------------------------------------------------------------------------------------------+int Number_Of_Rows(int result){
return(mysql_num_rows(result));
}
1. При запросе "SELECT id FROM table" функция fetch_row возвращает (адрес)(адрес) 1 (адрес)(адрес) 2 2. При запросе "SELECT user FROM table" функция fetch_row возвращает (адрес)(адрес) aaa (адрес)(адрес) bbb
вобщем то с этим можно работать, жаль только что возврат идёт в string
3. Если запросить два поля "SELECT id, user FROM table" то функция возвращает (адрес)(адрес)(адрес) 1 (адрес)(адрес)(адрес) 2 4. Если поменять местами поля "SELECT user, id FROM table" то функция возвращает (адрес)(адрес)(адрес) aaa (адрес)(адрес)(адрес) bbb
получается, что явно видно только одно первое поле из строки и добавился еще один 4-байтовый адрес.
1. При запросе "SELECT id FROM table" функция fetch_row возвращает (адрес)(адрес) 1 (адрес)(адрес) 2 2. При запросе "SELECT user FROM table" функция fetch_row возвращает (адрес)(адрес) aaa (адрес)(адрес) bbb
вобщем то с этим можно работать, жаль только что возврат идёт в string
3. Если запросить два поля "SELECT id, user FROM table" то функция возвращает (адрес)(адрес)(адрес) 1 (адрес)(адрес)(адрес) 2 4. Если поменять местами поля "SELECT user, id FROM table" то функция возвращает (адрес)(адрес)(адрес) aaa (адрес)(адрес)(адрес) bbb
получается, что явно видно только одно первое поле из строки и добавился еще один 4-байтовый адрес.
Как же это потом забирать в программу?
Я ведь собираюсь в основном записывать числа с плавающей точкой и читать их.
У меня в данный момент идет разработка скрипта по для работы с базой данный MySQL чтение, вставка, удаление и модификация.
Скрипт объёмный, но суть работы с базой данных будет понятна думаю из одной функции.
Правда в данном примере возвращается ID записи из таблицы, но переделать проблем не составит, помнится я и текст и цифры возвращал из базы, все работало.
Это интересный пример, но из него не видно как читать числовые данные.
В принципе, я всего для двух действий хочу использовать базу с таблицей из трёх колонок:
1) Прочитать первые две колонки (индекс и первую числовую колонку)
Затем, выбрав, самое подходящее число из числовой колонки внутри программы MQ4
2) Прочитать по индексу этого числа число из второй колонки.
Какие функции для этого мне следует использовать? И нормально ли они работают в указаной DLL?
Если поможете написать конвертер анси в юникод для МКЛ5, код которого приведен в предыдущем посте. Отправлю Вам рабочий код для МКЛ4, так же это поможет при написании класса для МКЛ5.
В импорте функций объявляйте не строки, а массивы типа uchar
проблема к сожалению в том, что эти строки возвращаются как результат функции, а не в один из её & параметров.
mysql_fetch_row возвращает указатель на массив строк - char**
--------
может кто знает - есть ли какие-то низкоуровневые функции из kernel, которые могут выдать из массива char** - строку char* ? (типа strcpy, strcat...)
и аналогично из массива int* - какая-то либная функция для получения его конкретного элемента ? пусть даже сама функция и не предназначена напрямую на эту операцию :)
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
как в MQL4 прочитать результат функции mysql_fetch_row ?
У меня в данный момент идет разработка скрипта по для работы с базой данный MySQL чтение, вставка, удаление и модификация.
Скрипт объёмный, но суть работы с базой данных будет понятна думаю из одной функции.
Правда в данном примере возвращается ID записи из таблицы, но переделать проблем не составит, помнится я и текст и цифры возвращал из базы, все работало.
провёл небольшой следственный эксперимент
создал таблицу с двумя полями
INT id; TEXT user
в таблице две строки
id user
1 aaa
2 bbb
1. При запросе "SELECT id FROM table" функция fetch_row возвращает (адрес)(адрес) 1 (адрес)(адрес) 2
2. При запросе "SELECT user FROM table" функция fetch_row возвращает (адрес)(адрес) aaa (адрес)(адрес) bbb
вобщем то с этим можно работать, жаль только что возврат идёт в string
3. Если запросить два поля "SELECT id, user FROM table" то функция возвращает (адрес)(адрес)(адрес) 1 (адрес)(адрес)(адрес) 2
4. Если поменять местами поля "SELECT user, id FROM table" то функция возвращает (адрес)(адрес)(адрес) aaa (адрес)(адрес)(адрес) bbb
получается, что явно видно только одно первое поле из строки и добавился еще один 4-байтовый адрес.
провёл небольшой следственный эксперимент
создал таблицу с двумя полями
INT id; TEXT user
в таблице две строки
id user
1 aaa
2 bbb
1. При запросе "SELECT id FROM table" функция fetch_row возвращает (адрес)(адрес) 1 (адрес)(адрес) 2
2. При запросе "SELECT user FROM table" функция fetch_row возвращает (адрес)(адрес) aaa (адрес)(адрес) bbb
вобщем то с этим можно работать, жаль только что возврат идёт в string
3. Если запросить два поля "SELECT id, user FROM table" то функция возвращает (адрес)(адрес)(адрес) 1 (адрес)(адрес)(адрес) 2
4. Если поменять местами поля "SELECT user, id FROM table" то функция возвращает (адрес)(адрес)(адрес) aaa (адрес)(адрес)(адрес) bbb
получается, что явно видно только одно первое поле из строки и добавился еще один 4-байтовый адрес.
Как же это потом забирать в программу?
Я ведь собираюсь в основном записывать числа с плавающей точкой и читать их.
У меня в данный момент идет разработка скрипта по для работы с базой данный MySQL чтение, вставка, удаление и модификация.
Скрипт объёмный, но суть работы с базой данных будет понятна думаю из одной функции.
Правда в данном примере возвращается ID записи из таблицы, но переделать проблем не составит, помнится я и текст и цифры возвращал из базы, все работало.
Это интересный пример, но из него не видно как читать числовые данные.
В принципе, я всего для двух действий хочу использовать базу с таблицей из трёх колонок:
1) Прочитать первые две колонки (индекс и первую числовую колонку)
Затем, выбрав, самое подходящее число из числовой колонки внутри программы MQ4
2) Прочитать по индексу этого числа число из второй колонки.
Какие функции для этого мне следует использовать? И нормально ли они работают в указаной DLL?
Это интересный пример, но из него не видно как читать числовые данные.
вы хоть одну строку кода написали, чтоб увидеть что и как возвращается ?
HIDDEN уже привел полное решение для чтения одного поля из базы. вы его запустили ?
Если поможете написать конвертер анси в юникод для МКЛ5, код которого приведен в предыдущем посте. Отправлю Вам рабочий код для МКЛ4, так же это поможет при написании класса для МКЛ5.
В MQL5 есть функции для конвертации юникода. Посмотрите /ru/docs/convert/chararraytostring и /ru/docs/convert/stringtochararray
В импорте функций объявляйте не строки, а массивы типа uchar
В импорте функций объявляйте не строки, а массивы типа uchar
проблема к сожалению в том, что эти строки возвращаются как результат функции, а не в один из её & параметров.
mysql_fetch_row возвращает указатель на массив строк - char**
--------
может кто знает - есть ли какие-то низкоуровневые функции из kernel, которые могут выдать из массива char** - строку char* ?
(типа strcpy, strcat...)
и аналогично из массива int* - какая-то либная функция для получения его конкретного элемента ?
пусть даже сама функция и не предназначена напрямую на эту операцию :)
Полная реализация кода....
SQL дамп базы
Результат работы