Como acessar o banco de dados da MQL4 , ORACL , MSSQL, MySQL - página 5

 

Tente isto:

#import "MT4"
int SaveSQL( int x,int y);  
#import

void start()
{
   int rez= SaveSQL(10,2);
   Comment("Результат"+ rez);
}
 
Uma solução estável para trabalhar com um banco de dados mysql (informações de leitura e escrita). O Mysql_wrapper continua a quebrar o terminal.
 

BTRVODKAex

Para este fim, uma dll intermediária em c++\cli é escrita. Não se pode chamar código gerenciado diretamente da mql



 
Graff >> :
O que é uma solução estável para trabalhar com o banco de dados mysql (leitura e escrita de informações)? O Mysql_wrapper continua a travar o terminal.

https://www.mql5.com/ru/code/8623

 
HIDDEN >> :

https://www.mql5.com/ru/code/8623

Ao usar mysql_wrapper o terminal trava. há alguma maneira de consertá-lo? testei na HP e 7 build 7100 - os problemas são os mesmos.

Diário de bordo:

Houve um erro crítico
Hora : 2009.07.03 13:38
Programa : Terminal do cliente
Versão : 4.00 (construção: 224, 15 de maio de 2009)
OS : Windows XP Professional 5.1 Service Pack 3 (Build 2600)
Processadores : 2 x X86 (nível 6)
Memória : 2086128/291388 kb
Exceção : C0000005
Endereço : 7C929267
Tipo de acesso : ler
Endereço de acesso : 00000004

Registros : EAX=0000000000 CS=001b EIP=7C929267 EFLGS=00010217
EBX=000000000000 SS=0023 ESP=0012DD60 EBP=0012DE1C
ECX=022F8900 DS=0023 ESI=022F88F0 FS=003b
EDX=022F8910 ES=0023 EDI=00340000 GS=0000

Stack Trace : 77C1C2DE 0055ED21 00000000 00000000
: 00000000 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000

Módulos :
1 : 00400000 002B1000 d:\forexmetatrader - alpari/terminal.exe
2 : 00F70000 00042000 c:program files\splitview 2009\splat.dll
3 : 018F0000 002CD000 c:{windows\system32\xpspsp2res.dll
4 : 02050000 00035000 d:\forexmetatrader - alpari`specialistas -mysql_wrapper.dll
5 : 02090000 00244000 c:{windows\system32\libmysql.dll
6 : 02560000 00009000 c:{windows\system32\amhooker.dll
7 : 08000000 00008000 c:program files³yandex³punto switcher³pshook.dll
8 : 10000000 00012000 c:{program files\\rocketdock\rocketdock.dll
9 : 40080000 001E8000 c:windows\system32\siertutil.dll
10 : 45020000 00131000 c:\system32\urlmon.dll
11 : 5B260000 00038000 c:\system32/uxtheme.dll
12 : 5BD50000 00056000 c:{windows\system32/netapi32.dll
13 : 61EC0000 0000E000 c:{windows\system32\mfc42loc.dll
14 : 698B0000 00058000 c:{windows\system32\hnetcfg.dll
15 : 71A30000 00040000 c:{windows\system32\mswsock.dll
16 : 71A70000 00008000 c:{windows\system32\wshtcpip.dll
17 : 71A80000 00008000 c:{windows\system32\ws2help.dll
18 : 71A90000 00017000 c:{windows\system32\ws2_32.dll
19 : 71AB0000 0000A000 c:{windows\system32\wsock32.dll
20 : 72CD0000 00008000 c:{windows\system32\msacm32.drv
21 : 72CE0000 00009000 c:{windows\system32\wdmaud.drv
22 : 73D90000 000FE000 c:{windows\system32\mfc42.dll
23 : 746E0000 0004C000 c:\system32\sctf.dll
24 : 75310000 0002E000 c:{windows\system32}msctfime.ime
25 : 76350000 00005000 c:{windows\system32\msimg32.dll
26 : 76360000 0001D000 c:\system32\imm32.dll
27 : 76380000 00049000 c:{windows\system32\comdlg32.dll
28 : 76B20000 0002E000 c:\system32winmm.dll
29 : 76BE0000 0000B000 c:{windows\system32\psapi.dll
30 : 76C20000 0002E000 c:{windows\system32}wintrust.dll
31 : 76C80000 00028000 c:{windows\system32\imagehlp.dll
32 : 76F10000 00027000 c:{windows\\system32\dnsapi.dll
33 : 76F50000 0002D000 c:{windows\system32\wldap32.dll
34 : 76FA0000 00008000 c:{windows\system32\winrnr.dll
35 : 76FB0000 00006000 c:{windows\system32\rasadhlp.dll
36 : 76FC0000 0007F000 c:{windows\system32\clbcatq.dll
37 : 77040000 000C7000 c:\system32\comres.dll
38 : 77110000 0008B000 c:{windows\system32/oleaut32.dll
39 : 773C0000 00103000 c:\windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\comctl32.dll
40 : 774D0000 0013E000 c:\system32\ole32.dll
41 : 77910000 000F4000 c:{windows\system32/setupapi.dll
42 : 77A70000 00096000 c:{windows\system32\crypt32.dll
43 : 77B10000 00012000 c:{windows\system32/msasn1.dll
44 : 77B30000 00022000 c:{windows\system32/apphelp.dll
45 : 77BC0000 00007000 c:{windows\system32\midimap.dll
46 : 77BD0000 00015000 c:{windows\system32\msacm32.dll
47 : 77BF0000 00008000 c:{windows\system32/version.dll
48 : 77C00000 00058000 c:{windows\system32\msvcrt.dll
49 : 77DC0000 000AC000 c:{windows\system32\advapi32.dll
50 : 77E70000 00092000 c:{windows\system32\rpcrt4.dll
51 : 77F10000 00049000 c:{windows\system32\gdi32.dll
52 : 77F60000 00076000 c:{windows\system32\shlwapi.dll
53 : 77FE0000 00011000 c:{windows\system32\secur32.dll
54 : 7C800000000 000F8000 c:{windows\system32/kernel32.dll
55 : 7C900000 000B3000 c:{windows\system32/ntdll.dll
56 : 7C9C0000 0081B000 c:{windows\system32\shell32.dll
57 : 7E360000 00091000 c:{windows\system32\suser32.dll

Chamada em pilha :


 

O que há de errado com o uso da libmysql.dll?

Ele escreve para o banco de dados perfeitamente, não tentei lê-lo, mas suponho que também não seja um buggy.

 
kombat >> :

O que há de errado com o uso da libmysql.dll?

Escreve para o banco de dados perfeitamente, não tentou ler, mas presumo que também sem falhas.

Para mim, ler a partir do banco de dados é mais importante. Se alguém tiver verificado o código para leitura do banco de dados com libmysql.dll, por favor, envie-o para mim.

Aqui no Google o código para ler a partir da base via libmysql.dll:

//+------------------------------------------------------------------+
//|                                                      news001.mq4 |
//|                                          Copyright © 2009, Graff |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Graff"
#property link      ""

#property indicator_chart_window

#define DELIM ";" 
//#include <mysql.mqh> 

#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); 
void mysql_close(int TMSQL); 

int mysql_store_result(int TMSQL); 
string mysql_fetch_row(int result); 
int mysql_num_rows(int result); 
void mysql_free_result(int result); 

//#import 

int mysql; 

int mTicket, mType; 
string mSymbol; 
double mLots, mOpen, mClose, mStopLoss, mTakeProfit;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   string row; 
   connect(); 
   string query="Select currency, title from calendar WHERE currency = 'USD'"; 
   int length=StringLen( query); 
   mysql_real_query( mysql, query, length); 
   int result = mysql_store_result( mysql); 
   int numOfRows = mysql_num_rows( result); 
   for (int i=0; i< numOfRows; i++) { 
      row = mysql_fetch_row( result); 
      Print( row); 
      //Print("Ticket=", mTicket, ",Symbol=", mSymbol);
     // decodeTrade(row); 
      //Comment("Ticket=", mTicket, ",Symbol=", mSymbol, ",Type=", mType, ",Lots=", mLots, ",Open=", mOpen, ",Close=", mClose, ",SL=", mStopLoss, ",TakeProfit=", mTakeProfit); 
   } 
   mysql_free_result( result);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
 mysql_close( mysql);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

void connect() { 

   mysql = mysql_init( mysql); 
   if ( mysql!=0) Print("allocated"); 
   string host="localhost"; 
   string user="*****"; 
   string password="****"; 
   string DB="forex"; 
   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"); 
   else Print("error=", mysql," ", mysql_errno( mysql)," "); 

} 

void decodeTrade(string trade) { 
   int begin = StringFind( trade, DELIM)+1; 
   int end = StringFind( trade, DELIM, begin); 
   mTicket = StrToInteger(StringSubstr( trade, begin, end- begin)); 
   begin = end+1; 
   end = StringFind( trade, DELIM, begin); 
   mSymbol = StringSubstr( trade, begin, end- begin); 
   begin = end+1; 
   end = StringFind( trade, DELIM, begin); 
   mType = StrToInteger(StringSubstr( trade, begin, end- begin)); 
   begin = end+1; 
   end = StringFind( trade, DELIM, begin); 
   mLots = StrToDouble(StringSubstr( trade, begin, end- begin)); 
   begin = end+1; 
   end = StringFind( trade, DELIM, begin); 
   mOpen = StrToDouble(StringSubstr( trade, begin, end- begin)); 
   begin = end+1; 
   end = StringFind( trade, DELIM, begin); 
   mClose = StrToDouble(StringSubstr( trade, begin, end- begin)); 
   begin = end+1; 
   end = StringFind( trade, DELIM, begin); 
   mStopLoss = StrToDouble(StringSubstr( trade, begin, end- begin)); 
   begin = end+1; 
   end = StringLen( trade); 
   mTakeProfit = StrToDouble(StringSubstr( trade, begin, end- begin)); 
} 


Resultado de sua execução:

18:01:54 Compilação de "notícias001
18:01:54 news001 USDCHF,H4: desinicializado
18:01:54 news001 USDCHF,H4: razão uninit 2
18:01:54 news001 USDCHF,H4: carregado com sucesso
18:01:54 notícias001 USDCHF,H4: alocado
18:01:54 notícias001 USDCHF,H4: conectado
18:01:54 news001 USDCHF,H4: ¤FџYOFџ°FџUSD
18:01:54 news001 USDCHF,H4: MFџPFџnFџUSD
18:01:54 news001 USDCHF,H4: GџGџ$GџUSD
18:01:54 news001 USDCHF,H4: DGџHGџ_GџUSD
18:01:54 news001 USDCHF,H4: |GџЂGџ™GџUSD
18:01:54 news001 USDCHF,H4: јGџAGџYGџUSD
18:01:54 news001 USDCHF,H4: јGџ
18:01:54 news001 USDCHF,H4:,Hџ0HџHџUSD
18:01:54 news001 USDCHF,H4: dHџhHџwHџUSD
18:01:54 news001 USDCHF,H4: "HџHHџ "HџUSD
18:01:54 news001 USDCHF,H4: MHџPHџkHџUSD
18:01:54 news001 USDCHF,H4: IџIџIџUSD etc.


Existe alguma maneira de resolver o problema hieroglífico? Tela da mesma consulta em phpMyAdmin



 

Colocar um "invólucro" para trabalhar com o banco de dados MS SQL

ADOLib.mqh wrapper e o próprio servidor COM,

que lhe fornece MS SQL (e não só!) ADOLib.dll.

ADOLib.mqh tem este aspecto:


// Constantes para enum CursorTypeEnum

#define adOpenUnspecified 4294967295 //$FFFFFFFFFFFFFF;
#define adOpenForwardOnly 0 //$0000000000000000;
#define adOpenKeyset 1 //$00000001;
#define adOpenDynamic 2 //$00000002;
#define adOpenStatic 3 //$00000003;

// Constantes para enumerar LockTypeEnum

#define adLockUnspecified 4294967295 //$FFFFFFFFFFFFFFFF;
#define adLockRead 1 //$00000001
#define adLockPessimistic 2 //$00000002;
#define adLockOptimistic 3 //$00000003;
#define adLockBatchOptimistic 4 //$00000004;

// Constantes para enumeração ExecuteOptionEnum

#define adOptionUnspecified 4294967295 //$FFFFFFFFFFFFFFFFFF;
#define adAsyncExecute 16 //$00000010;
#define adAsyncFetch 32 //$00000020;
#define adAsyncFetchNonBlocking 64 //$00000040;
#define adExecuteNoRecords 128 //$00000080;
#define adExecuteStream 296 //$00000400;
#define adExecuteRecord 2048 //$00000800;

// Constantes para enum CursorLocationEnum

#define adUseNone 1 //$00000001;
#define adUseServer 2 //$00000002;
#define adUseClient 3 //$00000003;
#define adUseClientBatch 3 //$00000003;

// Constantes para enumerar o CommandTypeEnum

#define adCmdUnspecified 4294967295 //$FFFFFFFFFFFFFFFFFF;
#define adCmdUnknown 8 //$00000008;
#define adCmdText 1 //$00000001;
#define adCmdTable 2 //$00000002;
#define adCmdStoredProc 4 //$00000004;
#define adCmdFile 256 //$00000100;
#define adCmdTableDirect 512 //$00000200;

#importar "ADOLib.dll".
int CreateConnection();
int DestroyConnection();
int OpenConnection(string ConnectionString,int CursorLocation,int CommandTimeout);
int CloseConnection();
int IsOpenConnection();
int Execute(string CommandText,int ExecuteOption);
int BeginTrans();
int CommitTrans();
int RollbackTrans();
int OpenTable(string Qry,int CursorLocal,int CursorType,int LockType,int Opções);
int CloseTable();
int Requery();
int Update();
int UpdateBatch();
int Cancel();
int CancelBatch();
int CancelUpdate();
int Find(string Criteria,int SearchDirection,int Start);
int Filter(string Criteria);
int BOF();
int EOF();
int MoveFirst();
int MoveLast();
int MoveNext();
TabelaStatus();
int FieldsCount();
string FieldName(int I);
string FieldType(int Nome);
string FieldTypeByPos(int I);
string GetFieldValue(string Name);
string GetFieldValueByPos(int I);
int SetFieldValue(string Name);
int SetFieldValueByPos(int I);



 

Exemplo de conexão ao banco de dados MS SQL 2005 "dbForex".

int createCnn=0;
int openCnn=0;
int Insert=0;

string StringConnection="DSN=dbForex;UID=sa;PWD=;";


int init()
{


CloseConnection();
DestroyConnection();

int createCnn=CreateConnection();
Sleep(10);

int openCnn=OpenConnection(StringConnection,adUseClient,0);
Sleep(10);


return(0);
}


Exemplo de operação:

int start()
{
//this is in case the connection is closed or "messed up" -reason enough
if (createCnn<=0 ||| IsOpenConnection()==0)
{
createCnn=0;
openCnn=0;

CloseConnection();
Sleep(10);

DestroyConnection();
Sleep(10);

createCnn=CreateConnection();
Sleep(30);
}

if (createCnn>0 &&(openCnn<=0 || IsOpenConnection()==0 ||| Insert==0))
{
openCnn=0;

CloseConnection();
Sleep(10);

openCnn=OpenConnection(StringConnection,adUseClient,0);
Sleep(30);
}


// e depois escrever carrapatos no banco de dados

string Company=AccountCompany();
string Symb=Symbol();

string CommandText="INSERT INTO Rates (TimeCurrent,AccountCompany,Symb,DateTimeRate,Ask,Bid) "+
"VALUES("+TimeCurrent()+", "+Companhia+", "+Symb+"", "+DateTimeRate+"", "+Ask+", "+Bid+")";
Execute(CommandText,adAsyncFetch);
Sleep(15);

}


//+
+
//| função de desinicialização especializada | //+------------------------------------------------------------------+
int deinit()
{
CloseConnection();
DestroyConnection();

return(0);
}

 

Presumo que ADOLib.mqh esteja no diretório "incluir" e

ADOLib no diretório "Biblioteca".

Agora no diretório da biblioteca, registre-se

este objeto COM e digite o comando regsvr32 ADOLib.dll,

pressione Enter e esta biblioteca será registrada,

tudo isso pode ser feito tanto a partir do console de linha de comando quanto do console de linha de comando,

digamos Comandante Total.

Se você estiver executando o Vista, você deve executar tanto o TC quanto

deve ser executado sob um

Conta "Administrador".