기고글 토론 "MQL5(MQL4)에서 MySQL 데이터베이스에 액세스하는 방법" - 페이지 7

 

좋아, 나는 당신이이 목적을 위해 전문가 조언을 작성했으며, 내가 기사에 게시 한 권장 사항없이 작성된 것을 보았습니다.

그럼 단계별로 진행해 보겠습니다.

1. " DB = cMySqlConnect(호스트, 사용자, 비밀번호, 데이터베이스, 포트, 소켓, 클라이언트플래그); "의 호출은 OnInit() 내부에서 이루어져야 합니다. 표준 함수 내에서 호출해야 합니다.

2. cMySqlConnect를 사용하고 있습니다 - DLL에서 가져온 함수이므로, 대신 cMySqlConnect 함수 !

3. OnDeinit() 스턴다드 함수 내에서 MySqlDisconnect 함수를 호출해야 합니다.

4. OnTick() 표준 함수 내에서 데이터베이스 연결 식별자를 확인하여 연결이 성공했는지 확인해야 합니다.

마지막으로 다음과 같이 보입니다.

... your code
int DB = -1; // 데이터베이스 식별자//--
... your code
int OnInit()
{
   DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); 

   if (DB != -1)
    {
    // 연결에 성공했습니다!
    // 여기에 테이블 생성 로직을 정의해야 합니다.
   }
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
 {
 MySqlDisconnect(DB);
 }

void OnTick()
{
 // 첫 번째 명령.
 if (DB==-1) return; // 연결되지 않은 경우 아무 작업도 수행하지 않습니다.

 // 여기에 cMySqlConnect 호출이 없는 코드가 있습니다.
}
You have to rebuild your code based on the requirements of project, as I see the currently there is no clear logic, everything messed up.
 
elugovoy:

좋아, 나는 당신이이 목적을 위해 전문가 조언을 작성했으며, 내가 기사에 게시 한 권장 사항없이 작성된 것을 보았습니다.

그럼 단계별로 진행해 보겠습니다.

1. " DB = cMySqlConnect(호스트, 사용자, 비밀번호, 데이터베이스, 포트, 소켓, 클라이언트플래그); "의 호출은 OnInit() 내부에서 이루어져야 합니다. 표준 함수 내에서 호출해야 합니다.

2. cMySqlConnect를 사용하고 있습니다 - DLL에서 가져온 함수이므로, 대신 cMySqlConnect 함수 !

3. OnDeinit() 스턴다드 함수 내에서 MySqlDisconnect 함수를 호출해야 합니다.

4. OnTick() 표준 함수 내에서 데이터베이스 연결 식별자를 확인하여 연결이 성공했는지 확인해야 합니다.

마지막으로 다음과 같이 보입니다.

감사합니다, 다시 시도해서 결과를 알려드리겠습니다.
 
elugovoy:

좋아, 나는 당신이이 목적을 위해 전문가 조언을 작성했으며, 내가 기사에 게시 한 권장 사항없이 작성된 것을 보았습니다.

그럼 단계별로 진행해 보겠습니다.

1. " DB = cMySqlConnect(호스트, 사용자, 비밀번호, 데이터베이스, 포트, 소켓, 클라이언트플래그); "의 호출은 OnInit() 내부에서 이루어져야 합니다. 표준 함수 내에서 호출해야 합니다.

2. cMySqlConnect를 사용하고 있습니다 - DLL에서 가져온 함수이므로, 대신 cMySqlConnect 함수 !

3. OnDeinit() 스턴다드 함수 내에서 MySqlDisconnect 함수를 호출해야 합니다.

4. OnTick() 표준 함수 내에서 데이터베이스 연결 식별자를 확인하여 연결이 성공했는지 확인해야 합니다.

마지막으로 다음과 같이 보입니다.

단계별로 변경했지만 4 개 이상의 기호에 대해 하나의 mt4에서 전문가를 사용할 때 문제가 여전히 존재합니다. " 액세스 위반이 읽었습니다. 0x0000000B '... .MQLMySQL.dll'
"

다음 코드를 따릅니다.

<--


#include <MQLMySQL.mqh

int MySqlErrorNumber; // 최근 MySQL 오류 번호

string MySqlErrorDescription; // 오류 설명


//+------------------------------------------------------------------+

//| 전문가 초기화 함수 nbsp; |

//+------------------------------------------------------------------+

int OnInit()

OnInit(); int OnInit()

EventSetTimer(timeSeconds);

DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); if( DB == -1 )

if( DB == -1 )

{

Print("데이터베이스가 연결되지 않았습니다 ..."); if( DB == -1 ) { print("데이터베이스가 연결되지 않았습니다 ..."); } "); }

}

return(INIT_SUCCEED); }

}

//+------------------------------------------------------------------+

//| 전문가 초기화 함수 ||

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{

MySqlDisconnect(DB);

EventKillTimer();

ObjectsDeleteAll();

}


void OnTimer()

{

//Alert(TimeCurrent());

OnTick();

}


//+------------------------------------------------------------------+

//| 전문가 틱 함수 nbsp; |

//+------------------------------------------------------------------+

void OnTick()

{

if( DB == -1 )

{

Alert("데이터베이스가 연결되지 않았습니다 ... "); return; { Alert("데이터베이스가 연결되지 않았습니다 ...")

return; }

}

if( IsExpertEnabled() && IsConnected() && AccountNumber() > 0 && DB ! = -1 )

{

int account = AccountNumber();

string symbol = Symbol(); if( cmd !

if( cmd ! = "" && cmd ! = NULL )

{

symbol = cmd; }

}

symbolOrder = 심볼 + "_table";

double spread = (Ask - Bid); } symbolOrder = symbol + "_table"; }

입장료 = spread*MathPow(10, Digits).

//int DB = cMySqlConnect(호스트, 사용자, 비밀번호, 데이터베이스, 포트, 소켓, 클라이언트플래그);

Query = "SELECT * FROM " + 기호 + " where AccountNumber = " + (문자열)AccountNumber();

//Print(Query);

int Cursor1 = MySqlCursorOpen(DB, Query);

if (Cursor1 >= 0)

{

int Rows1 = MySqlCursorRows(Cursor1); int Cursor1 = MySqlCursorOpen(DB, Query); if (Cursor1 >= 0)

int dataRows1 = Rows1;

//Alert(dataRows);

if( dataRows1 > 0 )

{

Query = "update " + 기호 + " set Bid = " + (문자열)Bid + ", Ask = " + ( 문자열)Ask

+ ", Spread = " + DoubleToStr(spread, Digits)

+ ", Time = '" + TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS ) + "' 여기서 계정번호 = "

+ (문자열)계정; // + "' 및 기호 = '" + 기호 + "'".

MySqlExecute(DB, Query);

MySqlCursorClose(Cursor1);

}

else if( dataRows1 == 0 )

{

Query = "CREATE TABLE IF NOT EXISTS " + symbol + " (id int NOT NULL AUTO_. INCREMENT PRIMARY KEY, AccountNumber int, "

+ "기호 문자(20), 입찰가 2배, 매도 2배, 스프레드 2배,"

+ "메모 문자(50), "

+ "시간 날짜 시간) 엔진=메모리 기본 문자 집합=utf8 ";

MySqlExecute(DB, Query);

Query = "INSERT INTO " + 기호 + "(계정번호, 기호, 매수, 매도, 스프레드. Memo, Time) VALUES ("

+ (문자열)계정 + ", '" + 기호 + "', "+(문자열)입찰가+","+ (문자열)질문 + ", "

+ DoubleToStr(스프레드, 숫자)

+ ", '" + (문자열)AccountCompany()

+ "', \'"+TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\')""";

if(MySqlExecute(DB, Query) ! = true )

{

//쿼리 = "`데이터_테이블`이 존재하면 테이블 삭제";

//MySqlExecute(DB, Query);

Query = "CREATE TABLE IF NOT EXISTS " + symbol + "(id int NOT NULL AUTO_INCREMENT PRIMARY KEY, AccountNumber int, "

+ "기호 문자(20), 입찰가 2배, 매도 2배, 스프레드 double,"

+ "메모 문자(50), "

+ "시간 날짜 시간) 엔진=메모리 기본 문자 집합= utf8 ";

MySqlExecute(DB, Query);

}

}

MySqlCursorClose(Cursor1); // 절대 커서 닫는 것을 잊지 마세요 !!!!

}

}

}

-->

 
elugovoy:

좋아, 나는 당신이이 목적을 위해 전문가 조언을 작성했으며, 내가 기사에 게시 한 권장 사항없이 작성된 것을 보았습니다.

그럼 단계별로 진행해 보겠습니다.

1. " DB = cMySqlConnect(호스트, 사용자, 비밀번호, 데이터베이스, 포트, 소켓, 클라이언트플래그); "의 호출은 OnInit() 내부에서 이루어져야 합니다. 표준 함수 내에서 호출해야 합니다.

2. cMySqlConnect를 사용하고 있습니다 - DLL에서 가져온 함수이므로, 대신 cMySqlConnect 함수 !

3. OnDeinit() 스턴다드 함수 내에서 MySqlDisconnect 함수를 호출해야 합니다.

4. OnTick() 표준 함수 내에서 데이터베이스 연결 식별자를 확인하여 연결이 성공했는지 확인해야 합니다.

마지막으로 다음과 같이 보일 것입니다.

문제는 하나의 mt4에서 두 개 이상의 심볼에 사용할 수 없으며, 하나의 심볼에서만 사용하면 정상입니다. 4개 이상에서 사용하면 정상적으로 실행되지만 몇 분 후에 "OnTick()"이라는 문제가 인쇄됩니다. 몇 분 후에는 '...MQLMySQL.db에서 0x0000000B로 읽은 액세스 위반'이라는 문제를 출력합니다. .MQLMySQL.dll'"이라는 문제를 출력합니다.

예제는 모두 스크립트이며 한 번만 실행되며 한 명의 전문가가 하나 또는 두 개의 mt4에서 4 개 이상의 기호로 dll을 호출하면 문제를 찾을 수 있습니다.

dll에 밈 릴리스 또는 가베 컬렉션이 필요합니까?

 
MFC는 정적 데이터 소멸 후
CRT가 누수를 덤프할 때까지 기다리지 않고 종료 시 누수를 조기에 덤프하며, 이로 인해 MFC 가 초기화되기 전에 메모리를 할당하여 MFC 종료 후 소멸된 객체에 대한 허위 누수 보고서가 발생합니다. MFC
가 초기화되기 전에 메모리를 할당하여 MFC 종료 후 소멸된 객체에 대한
허위 누출 보고가 발생합니다. 이는
C++ 런타임 DLL을사용하는 프로그램에서 MFC DLL을 사용할 때 일반적으로 관찰되는
문제입니다 .
 

다시 한 번 안녕하세요.

제공해주신 코드를 보니 MQL을 처음 사용하시는 것 같습니다.

죄송하지만 가르쳐 드릴 시간이 없지만 제가 개발한 소프트웨어를 테스트할 시간이 있습니다.

죄송하지만 가르쳐 드릴 시간은 없지만 제가 개발한 소프트웨어를 테스트할 시간은 있습니다. 그래서 여기에 로그가 첨부되어 있습니다.

각 통화쌍에 대해 정의된 각 테이블과 다른 계좌에 대한 온라인 시장 데이터를 보관할 수 있는 로직에 따라 테스트 EA를 빌드해 보세요.

로그를 검사할 수 있으며 "액세스 위반..."이라는 오류는 발생하지 않았습니다. 로그를 검사할 수 있으며 "액세스 위반..." 오류가 발생하지 않았습니다.

문제는 MQLMySQL 라이브러리에 있지 않습니다.

EA 테스트.

//+------------------------------------------------------------------+
//|& nbsp; &nbsp DFTest.mq4 |
//|& 저작권 2014, 메타쿼츠 소프트웨어 주식회사 | |
//|& nbsp; &nbsp http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
#include <MQLMySQL.mqh>

input string Host = "localhost";
input string User = "root";
input string Password = "ioctrl";
input string Database = "mysql";
input int Port = 3306;
input string Socket = "";
input int ClientFlag = 0;

input int Timer = 1; // 타이머(초) 현재 사용되지 않음

int DB;

int OnInit()
{
 SQLTrace = true; //를 입력하면 모든 쿼리가 데이터베이스로 전송되는 것을 확인할 수 있습니다.
       EventSetTimer(Timer);
       DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); 
       if( DB == -1 )
       {
            Print("Database is not connected! Error: ", MySqlErrorDescription);
            return (INIT_FAILED);
       }
       
 // 존재하지 않는 경우 테이블 생성
 string cmd;
 cmd = "CREATE TABLE IF NOT EXISTS `" + Symbol() + "` (id int NOT NULL AUTO_INCREMENT PRIMARY KEY, AccountNumber int, "
       + "Symbol char(20), Bid double, Ask double, Spread double, " 
       + "Memo char(50), " 
       + "Time datetime) ENGINE=MEMORY DEFAULT CHARSET=utf8";
 if (!MySqlExecute(DB, cmd))
    {
     Print ("Table creation error: ",MySqlErrorDescription);
     return (INIT_FAILED);
    }
                      

       return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
      MySqlDisconnect(DB); 
      EventKillTimer();
}


void OnTimer()
{
 // 온타이머에서 온틱을 호출해서는 안 되며 그 반대도 마찬가지입니다.
 // 이 두 함수의 대상은 다릅니다.
}

void OnTick()
{
 int account;
 string symbol;
 double spread;
 string Query, cmd;
 int Cursor;
 int Rows;
 
 if (DB == -1)
    {
    Comment("Database is not connected ... ");
    return;
    }

 if ( IsExpertEnabled() && IsConnected() && AccountNumber() > 0 )
    {
     account = AccountNumber();
     symbol = "`"+Symbol()+"`"; // 테이블 이름으로 사용해야 하는 경우 MySQL 데이터베이스의 모범 사례로 따옴표를 사용해야 합니다.
     
 
 spread = (Ask - Bid);
 
 // 다음과 같이 사용하는 것이 더 나을 수 있습니다: admission = MarketInfo(symbol, MODE_SPREAD);
 Query = "SELECT * FROM " + symbol + " where AccountNumber = " + (string)account;
 Cursor = MySqlCursorOpen(DB, Query);
 if (Cursor >= 0)
    {
      Rows = MySqlCursorRows(Cursor);
      if ( Rows > 0 )
         {
          cmd = "update " + symbol + " set Bid = "+(string)Bid + ", Ask = " + (string)Ask
                       + ", Spread = " + DoubleToStr(spread, Digits)  
                       + ", Time = '" + TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS) +"' where AccountNumber = " + (string)account;
         }
      else
         {
          cmd = "INSERT INTO " + symbol + "(AccountNumber, Symbol, Bid, Ask, Spread, Memo, Time) VALUES (" 
                + (string)account + ", \'" + symbol + "\', "+DoubleToStr(Bid,Digits)+","+ DoubleToStr(Ask,Digits) + ","  + DoubleToStr(spread, Digits) 
                + ", \'" + AccountCompany() +"\', \'"+TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\')";
         }
      if (!MySqlExecute(DB, cmd))
         {
          Print("Updating error: ",MySqlErrorDescription);
          Print (cmd);
         }

      MySqlCursorClose(Cursor);
     }
  }

} 

 

이것은 라이브러리 사용의 올바른 로직입니다.

최적화로 인해 SELECT 문을 사용하지 않고 UPDATE 문을 실행하는 것보다 (MySqlRowsAffected()==0) 행이 하나도 없는지 확인하는 것이 좋습니다. 100%의 업데이트가 있으므로 INSERT 문을 적용합니다.

업데이트가 ~100%이므로 이 해결 방법을 사용하면 성능이 향상되고 네트워크 트래픽이 감소할 수 있습니다.

그리고 마지막에 프로젝트의 전체 소스 코드(DLL 개발 포함)가 첨부되어 있으므로 직접 변경할 수 있습니다.

어쨌든 MqlMySQL.DLL에서 문제가 발생하면 디버깅하여 직접 수정할 수 있습니다.

행운을 빕니다, 유진

Eugene

파일:
logs.zip  302 kb
 

수고하셨습니다, 정말 감사합니다 Eugeniy.

귀하의 코드는 저에게 많은 도움이되며 많은 시간을 절약 할 수 있습니다. 삽입, 선택, 업데이트 및 삭제 쿼리를 성공적으로 수행하려고했습니다. 내가 틀리지 않았다면 "커서"는 SELECT 쿼리에만 필요합니까 ??

= 페드마

//+------------------------------------------------------------------+
//|MySQL-006.mq4 |
//|저작권 2014, 유진 루고보이 |
//| http://www.fxcodexlab.com |
//| 쿼리 선택, 삽입, 업데이트 및 삭제|
//| 에 의해 수정되었습니다: pedma|
//+------------------------------------------------------------------+

#property copyright "Copyright 2014, Eugene Lugovoy."
#property link      "http://www.fxcodexlab.com"
#property version   "1.00"
#property strict

#include <MQLMySQL.mqh>

string INI;
//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 함수|
//+------------------------------------------------------------------+
void OnStart() {
 string Host, User, Password, Database, Socket; // 데이터베이스 자격 증명
 int Port,ClientFlag;
 int DB; // 데이터베이스 식별자
 
 Print (MySqlVersion());

 INI = "C:\\This\\Must\\be\\Real\\Path\\To\\MyConnection.ini";
 
 // INI 파일에서 데이터베이스 자격 증명 읽기
 Host = ReadIni(INI, "MYSQL", "Host");
 User = ReadIni(INI, "MYSQL", "User");
 Password = ReadIni(INI, "MYSQL", "Password");
 Database = ReadIni(INI, "MYSQL", "Database");
 Port     = StrToInteger(ReadIni(INI, "MYSQL", "Port"));
 Socket   = ReadIni(INI, "MYSQL", "Socket");
 /// ClientFlag = StrToInteger(ReadIni(INI, "MYSQL", "ClientFlag")); 
 ClientFlag = CLIENT_MULTI_STATEMENTS;

 Print ("Host: ",Host, ", User: ", User, ", Database: ",Database);
 
 // 데이터베이스 연결 열기
 Print ("Connecting...");
 
 DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);
 
 if (DB == -1) { Print ("Connection failed! Error: "+MySqlErrorDescription); return; } else { Print ("Connected! DBID#",DB);}
 
 // SELECT 문 실행
 string Query0,Query1,Query2,Query3,Query4,Query5,Query6,Query7;
 int    i,Cursor1,Cursor3,Cursor5,Cursor7,Rows,total;
 
 int      vId;
 string   vCode;
 datetime vStartTime;
 
 Query0 = "DROP TABLE IF EXISTS `test_table`";
 MySqlExecute(DB, Query0);
 
 Query0 = "CREATE TABLE `test_table` (id int, code varchar(50), start_date datetime)";
 if (MySqlExecute(DB, Query0))  {
     Print ("Table `test_table` created.");
 }
 else  {
     Print ("Table `test_table` cannot be created. Error: ", MySqlErrorDescription);
 }
 
 //--- 데이터 삽입
 Query0 = "INSERT INTO `test_table` (id, code, start_date) VALUES ("+(string)AccountNumber()+",\'ACCOUNT\',\'"+TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\')";
  if (MySqlExecute(DB, Query0))   {
      Print ("Succeeded: ", Query0);
  }
  else  {
      Print ("Error: ", MySqlErrorDescription);
      Print ("Query: ", Query0);
  }
  
  // 다중 삽입
  Query0 =          "INSERT INTO `test_table` (id, code, start_date) VALUES (1,\'EURUSD\',\'2014.01.01 00:00:01\');";
  Query0 = Query0 + "INSERT INTO `test_table` (id, code, start_date) VALUES (2,\'EURJPY\',\'2014.01.02 00:02:00\');";
  Query0 = Query0 + "INSERT INTO `test_table` (id, code, start_date) VALUES (3,\'USDJPY\',\'2014.01.03 03:00:00\');";
  if (MySqlExecute(DB, Query0))   {
      Print ("Succeeded! 3 rows has been inserted by one query.");
  }
  else  {
      Print ("Error of multiple statements: ", MySqlErrorDescription);
  }

 //--- 쿼리 선택, 커서 필요 ----
 Query1 = "SELECT id, code, start_date FROM `test_table`";
 Print ("SQL> ", Query1);
 Cursor1 = MySqlCursorOpen(DB, Query1);
 
 if (Cursor1 >= 0)  {
     Rows = MySqlCursorRows(Cursor1);
     Print (Rows, " row(s) selected.");
     for (i=0; i<Rows; i++) {
         if (MySqlCursorFetchRow(Cursor1))   {
             vId = MySqlGetFieldAsInt(Cursor1, 0); // id
             vCode = MySqlGetFieldAsString(Cursor1, 1); // 코드
             vStartTime = MySqlGetFieldAsDatetime(Cursor1, 2); // start_time
             Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
         }
         total += vId;
     }
     //--- 쿼리 기반 데이터 삽입
     Query2 = "INSERT INTO `test_table` (id, code, start_date) VALUES ("+(string)total+",\'ABCDEF\',\'"+TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\');  ";
     if (MySqlExecute(DB, Query2))  {
         Print ("Succeeded! 1 new row has been inserted.");
     }
     else  {
         Print ("Error inserting data based on SELECT query : ", MySqlErrorDescription);
     }
     //---
     MySqlCursorClose(Cursor1); // 커서를 닫는 것을 잊지 마세요 !!!
 }
 else  {
     Print ("Cursor1 opening failed. Error: ", MySqlErrorDescription);
 }
     
 //--- 새 선택 커서 --- --- 
 Query3 = "SELECT id, code, start_date FROM `test_table`";
 Print ("SQL> ", Query3);
 Cursor3 = MySqlCursorOpen(DB, Query3);
 if (Cursor3 >= 0)  {
     Rows = MySqlCursorRows(Cursor3);
     Print (Rows, " row(s) selected.");
     for (i=0; i<Rows; i++) {
         if (MySqlCursorFetchRow(Cursor3))   {
             vId = MySqlGetFieldAsInt(Cursor3, 0); // id
             vCode = MySqlGetFieldAsString(Cursor3, 1); // 코드
             vStartTime = MySqlGetFieldAsDatetime(Cursor3, 2); // start_time
             Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
         }
     }
     //--- 데이터 업데이트 ----
     Query4 = "UPDATE `test_table` SET id=8,code='PQRXYZ',start_date=\'"+TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\' WHERE code='ABCDEF';  ";
     if (MySqlExecute(DB, Query4))  {
         Print ("Succeeded! last row has been updated (code ABCDEF => PQRXYZ & new id=8.");
     }
     else  {
         Print ("Error updating data of last row : ", MySqlErrorDescription);
     }
     //---
     MySqlCursorClose(Cursor3); // 커서를 닫는 것을 잊지 마세요 !!!
 }
 else  {
     Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription);
 }
 
 //--- 업데이트 후 결과 표시 , 새 커서가 필요합니다 ---- 
 Query5 = "SELECT id, code, start_date FROM `test_table`";
 Print ("SQL> ", Query5);
 Cursor5 = MySqlCursorOpen(DB, Query5);
 if (Cursor5 >= 0)  {
     Rows = MySqlCursorRows(Cursor5);
     Print (Rows, " row(s) selected.");
     for (i=0; i<Rows; i++) {
         if (MySqlCursorFetchRow(Cursor5))   {
             vId = MySqlGetFieldAsInt(Cursor5, 0); // id
             vCode = MySqlGetFieldAsString(Cursor5, 1); // 코드
             vStartTime = MySqlGetFieldAsDatetime(Cursor5, 2); // start_time
             Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
         }
     }
     //--- 쿼리 삭제 ---
     Query6 = "DELETE FROM `test_table` WHERE id=3;  ";
     if (MySqlExecute(DB, Query6))  {
         Print ("Succeeded! 1 row (id=3) has been deleted.");
     }
     else  {
         Print ("Error deleting 1 row : ", MySqlErrorDescription);
     }
     //---
     MySqlCursorClose(Cursor5); // 커서를 닫는 것을 잊지 마세요 !!!
 }
 else  {
     Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription);
 }
 
 //--- 삭제 후 결과 표시, 다른 커서가 필요합니다 --- --- 
 Query7 = "SELECT id, code, start_date FROM `test_table`";
 Print ("SQL> ", Query7);
 Cursor7 = MySqlCursorOpen(DB, Query7);
 if (Cursor7 >= 0)  {
     Rows = MySqlCursorRows(Cursor7);
     Print (Rows, " row(s) selected.");
     for (i=0; i<Rows; i++) {
         if (MySqlCursorFetchRow(Cursor7))   {
             vId = MySqlGetFieldAsInt(Cursor7, 0); // id
             vCode = MySqlGetFieldAsString(Cursor7, 1); // 코드
             vStartTime = MySqlGetFieldAsDatetime(Cursor7, 2); // start_time
             Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
         }
     }
     //---
     MySqlCursorClose(Cursor7); // 커서를 닫는 것을 잊지 마세요 !!!
 }
 else  {
     Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription);
 }
 //----- 끝에 ---- 
 MySqlDisconnect(DB);
 Print ("Disconnected. Script done!");
}
//+------------------------------------------------------------------+




 
pedma:

수고하셨습니다, 정말 감사합니다 Eugeniy.

귀하의 코드는 저에게 많은 도움이되며 많은 시간을 절약 할 수 있습니다. 삽입, 선택, 업데이트 및 삭제 쿼리를 성공적으로 수행하려고했습니다. 내가 틀리지 않았다면 "커서"는 SELECT 쿼리에만 필요합니까 ??

= 페드마




정확히 맞습니다!

커서는 SQL 명령을 데이터베이스에 보내는 것이 아니라 DB에서 MQL 변수로 데이터를 수신해야하기 때문에 데이터 선택에만 사용됩니다.

제 솔루션이 도움이 되어서 다행입니다.

행운을 빕니다,

Eugene

 

안녕하세요 유진,

제가 판매할 EA에 통합된 원격 거래 복사기를 만들려고 하는데 여전히 유료 개발 프로젝트를 하고 계신지 궁금해서요.

Upwork를 살펴보니 최근에 프리랜서 프로젝트를 완료한 적이 없는 것 같습니다.

제가 만든 라이브러리를 사용하여 직접 시도해 보았지만 그다지 좋은 결과를 얻지 못했습니다. 프로그래밍 능력이 있는 사람이라면 쉽게 만들 수 있을 것 같지만요!

미리 감사드립니다,

James

 
James Beach:

안녕하세요 유진,

제가 판매할 EA에 통합된 원격 거래 복사기를 만들려고 하는데 여전히 유료 개발 프로젝트를 하고 계신지 궁금해서요.

Upwork를 살펴보니 최근에 프리랜서 프로젝트를 완료한 적이 없는 것 같습니다.

제가 만든 라이브러리를 사용하여 직접 시도해 보았지만 그다지 좋은 결과를 얻지 못했습니다. 프로그래밍 능력이 있는 사람이라면 쉽게 만들 수 있을 것 같지만요!

미리 감사드립니다,

James

안녕하세요 제임스,

저는 현재 Upwork에서 하나의 큰 프로젝트만 진행하고 있습니다. 그래서 요즘은 여유 시간이 별로 없어요. 라이브러리에 어떤 문제가 있나요? 어떻게 도와드릴까요?