如何从MQL4、ORACL、MSSQL、MySQL访问数据库。 - 页 5

 

试试这个。

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

void start()
{
   int rez= SaveSQL(10,2);
   Comment("Результат"+ rez);
}
 
一个稳定的解决方案,用于与mysql数据库工作(读写信息)。 Mysql_wrapper不断使终端崩溃。
 

BTRVODKAex

为了这个目的,用c++/cli编写了一个中间dll。你不能从mql中直接调用托管代码



 
Graff >> :
使用mysql数据库(读写信息)的稳定解决方案是什么? Mysql_wrapper不断使终端崩溃。

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

 
HIDDEN >> :

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

当使用mysql_wrapper时,终端崩溃了。有什么办法可以解决这个问题吗?我已经在HP和7 build 7100上测试了--问题是一样的。

日志。

出现了一个重要的错误
时间 : 2009.07.03 13:38
程序:客户终端
版本:4.00 (构建:224,2009年5月15日)
操作系统:Windows XP Professional 5.1 Service Pack 3(Build 2600)。
处理器 : 2 x X86 (6级)
内存 : 2086128/291388 kb
异常情况 : C0000005
地址 : 7C929267
访问类型:读
访问地址 : 00000004

寄存器 : 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

堆栈跟踪 : 77C1C2DE 0055ED21 00000000 00000000
: 00000000 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000

模块:
1 : 00400000 002B1000 d:\forex\metatrader - alpari/terminal.exe
2 : 00F70000 00042000 c:program files\splitview 2009\splat.dll
3 : 018F0000 002CD000 c:{windows\system32\xpsp2res.dll
4 : 02050000 00035000 d:\forex\metatrader - alpari\experts\libraries\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:{程序文件\rocketdock\rocketdock.dll
9 : 40080000 001E8000 c:windows\system32\iertutil.dll
10 : 45020000 00131000 c:\windows\system32\urlmon.dll
11 : 5B260000 00038000 c:\windows\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:\windows\system32\msctf.dll
24 : 75310000 0002E000 c:{windows\system32\msctfime.exe
25 : 76350000 00005000 c:{windows\system32\msimg32.dll
26 : 76360000 0001D000 c:\windows\system32\imm32.dll
27 : 76380000 00049000 c:{windows\system32\comdlg32.dll
28 : 76B20000 0002E000 c:\windows\system32\winmm.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:\windows\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:\windows\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 : 7C800000 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\user32.dll

呼叫堆栈:


 

使用libmysql.dll 有什么问题?

它能完美地写入数据库,我还没试着去读它,但我猜它也没有毛病。

 
kombat >> :

使用libmysql.dll有什么问题?

向数据库完美地写入,没有尝试读取,但我认为也没有故障。

对我来说,从数据库中阅读更重要。如果谁有经过验证的用libmysql.dll从数据库中读取的代码,请发给我。

这里谷歌了一下通过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)); 
} 


其执行的结果。

18:01:54 编译'news001'
18:01:54 新闻001 USDCHF,H4: 取消初始化
18:01:54 新闻001 USDCHF,H4: uninit reason 2
18:01:54 新闻001 USDCHF,H4:加载成功
18:01:54 新闻001 USDCHF,H4: 已分配
18:01:54 新闻001 USDCHF,H4: 已连接
18:01:54 新闻001 USDCHF,H4: ¤FџYOFџ℉џUSD
18:01:54 新闻001 USDCHF,H4: MFџPFџnFџUSD
18:01:54 新闻001 USDCHF,H4: GџGџ$GџUSD
18:01:54 新闻001 USDCHF,H4: DGџHGџ_GџUSD
18:01:54 新闻001 USDCHF,H4: |GџЂGџ™GџUSD
18:01:54 新闻001 USDCHF,H4: јGџAGџYGџUSD
18:01:54 新闻001 USDCHF,H4: јGџ
18:01:54 新闻001 USDCHF,H4:,Hџ0HџHџUSD
18:01:54 新闻001 USDCHF,H4: dHџhHџwHџUSD
18:01:54 新闻001 USDCHF,H4: "HџHџ "HџUSD
18:01:54 新闻001 USDCHF,H4: MHџPHџkHџUSD
18:01:54 新闻001 USDCHF,H4: IџIџIџUSD等。


有什么办法可以解决象形文字的问题吗?phpMyAdmin中同一查询的截图



 

将一个 "包装器 "与MS SQL数据库一起工作

ADOLib.mqh包装器和COM服务器本身。

它为你提供了MS SQL(不仅仅是!)ADOLib.dll。

ADOLib.mqh看起来像这样。


// CursorTypeEnum枚举的常量

#define adOpenUnspecified 4294967295 //$FFFFFFFF。
#define adOpenForwardOnly 0 //$000000000000;
#define adOpenKeyset 1 //$00000001;
#define adOpenDynamic 2 //$00000002;
#define adOpenStatic 3 //$00000003;

// LockTypeEnum 枚举的常量

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

// ExecuteOptionEnum 枚举的常量

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

// 枚举CursorLocationEnum的常量

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

// 枚举CommandTypeEnum的常量

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

#import "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 CursorLocation,int CursorType,int LockType,int Options);
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()。
string TableStatus()。
int FieldsCount()。
string FieldName(int I)。
string FieldType(int Name)。
string FieldTypeByPos(int I)。
string GetFieldValue(string Name)。
string GetFieldValueByPos(int I);
int SetFieldValue(string Name)。
int SetFieldValueByPos(int I)。



 

连接到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);
}


示例操作。

int start()
{
//这是为了防止连接被关闭或 "搞砸了"--理由充分
if (createCnn<=0 || IsOpenConnection()==0)
{
createCnn=0;
openCnn=0;

CloseConnection();
Sleep(10);

DestroyConnection() ;
Sleep(10) ;

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

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

CloseConnection();
Sleep(10);

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


//然后将刻度线写进数据库

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

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

}


//+------------------------------------------------------------------+
//| expert deinitializationfunction|
//+------------------------------------------------------------------+
int deinit()
{
CloseConnection();
DestroyConnection() ;

return(0);
}

 

我假设ADOLib.mqh在 "include "目录下,并且

在 "图书馆 "目录下的ADOLib。

现在在 \Library目录中,注册

这个COM对象,并在regsvr32 ADOLib.dll中键入。

按回车键,这个库就会被注册。

所有这些都可以从命令行控制台或。

比方说,总司令。

如果你运行的是Vista,你应该同时运行TC和

控制台必须在一个

"管理员 "账户。

原因: