DatabaseBind

요청에 매개변수 값을 설정.

bool  DatabaseBind(
   int  request,      // DatabasePrepare에서 생성된 요청의 핸들
   int  index,        // 요청의 매개변수 인덱스
   T    value         // 단순 유형 매개변수의 값
   );

매개변수

request

[in] DatabasePrepare()에서 생성된 요청 핸들.

index

[in]  요청에서 값을 설정해야 하는 매개변수 인덱스. 번호는 0으로 시작합니다.

value

[in]  설정될 값. 확장 유형: bool, char, uchar, short, ushart, int, uint, color, datetime, long, ulong, float, double, string.

반환 값

성공하면 true를, 그렇지 않으면 false를 반환. 오류 코드를 가져오려면 GetLastError()를 사용해야 하며, 가능한 응답은 다음과 같습니다:

  • ERR_INVALID_PARAMETER (4003)             – 지원되지 않는 유형;
  • ERR_DATABASE_INVALID_HANDLE (5121)  - 유효하지 않은 데이터베이스 핸들;
  • ERR_DATABASE_NOT_READY (5128)         - 현재 기능을 사용하여 요청할 수 없습니다. 요청이 실행 중이거나 이미 완료되었습니다. DatabaseReset()을 호출해야 합니다.

 

참고

함수는 SQL 요청에 "?" 또는 "?N" 가 포함된 경우에 사용되며, 매개변수 가능 값, 여기서 N은 매개변수 인덱스(하나의 값에서 시작)를 의미합니다. 동시에 DatabaseBind()의 파라미터 인덱싱은 0부터 시작합니다.

예를 들어:

     INSERT INTO table VALUES (?,?,?)
     SELECT * FROM table WHERE id=?

DatabasePrepare()에서 매개변수화된 요청이 생성된 후 또는 DatabaseReset()을 사용하여 요청을 재설정한 후 즉시 함수를 호출할 수 있습니다.

이 기능을DatabaseReset()과 함께 사용하면 필요한 횟수만큼 다른 매개변수 값으로 요청을 실행할 수 있습니다.

함수는 단순 유형 매개변수로 작동하도록 고안되었습니다. 배열에 대해 매개변수를 확인해야하는 경우 DatabaseBindArray() 기능을 사용합니다.

예:

//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 기능                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   MqlTick ticks[];
//--- 틱을 받기 전에 시작 시간을 기억
   uint start=GetTickCount();
//--- 일별 틱을 요청
   ulong to=TimeCurrent()*1000;
   ulong from=to-PeriodSeconds(PERIOD_D1)*1000;
   if(CopyTicksRange(_Symbol, ticks, COPY_TICKS_ALL, from, to)==-1)
     {
      PrintFormat("%s: CopyTicksRange(%s - %s) failed, error=%d",
                  _SymbolTimeToString(datetime(from/1000)), TimeToString(datetime(to/1000)), _LastError);
      return;
     }
   else
     {
      //--- 얼마나 많은 틱이 수신되었고 얼마나 많은 시간이 걸렸는지
      PrintFormat("%s: CopyTicksRange received %d ticks in %d ms (from %s to %s)",
                  _SymbolArraySize(ticks), GetTickCount()-start,
                  TimeToString(datetime(from/1000)), TimeToString(datetime(to/1000)));
     }
 
//--- 데이터베이스 저장을 위한 파일 이름 설정
   string filename=_Symbol+" "+TimeToString(datetime(from/1000))+" - "+TimeToString(datetime(to/1000))+".sqlite";
   StringReplace(filename, ":""."); // ":" character is not allowed in file names
//--- 공용 터미널 폴더에서 데이터베이스 열기/생성
   int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE | DATABASE_OPEN_COMMON);
   if(db==INVALID_HANDLE)
     {
      Print("데이터 베이스: ", filename, " 코드로 여는데 실패 "GetLastError());
      return;
     }
   else
      Print("데이터베이스: ", filename, " 성공적으로 열림");
 
//--- TICKS 테이블 생성
   if(!DatabaseExecute(db, "CREATE TABLE TICKS("
                       "SYMBOL             CHAR(10),"
                       "TIME               INT NOT NULL,"
                       "BID                REAL,"
                       "ASK                REAL,"
                       "LAST               REAL,"
                       "VOLUME             INT,"
                       "TIME_MSC           INT,"
                       "VOLUME_REAL        REAL);"))
     {
      Print("DB: ", filename, " create table TICKS failed with code "GetLastError());
      DatabaseClose(db);
      return;
     }
//--- TICKS 테이블에 모든 필드 목록 표시
   if(DatabasePrint(db, "PRAGMA TABLE_INFO(TICKS)", 0)<0)
     {
      PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(TICKS)\") failed, error code=%d at line %d"GetLastError(), __LINE__);
      DatabaseClose(db);
      return;
     }
//--- 매개변수화된 요청을 생성하여 TICKS 테이블에 틱 추가
   string sql="INSERT INTO TICKS (SYMBOL,TIME,BID,ASK,LAST,VOLUME,TIME_MSC,VOLUME_REAL)"
              " VALUES (?1,?2,?3,?4,?5,?6,?7,?8)"// 매개변수 요청
   int request=DatabasePrepare(db, sql);
   if(request==INVALID_HANDLE)
     {
      PrintFormat("DatabasePrepare() failed with code=%d"GetLastError());
      Print("SQL 요청: ", sql);
      DatabaseClose(db);
      return;
     }
//--- 첫 번째 요청 매개변수의 값을 설정
   DatabaseBind(request, 0, _Symbol);
//--- TICKS 테이블에 틱 추가 전 시작 시간을 기억table
   start=GetTickCount();
   DatabaseTransactionBegin(db);
   int total=ArraySize(ticks);
   bool request_error=false;
   for(int i=0; i<total; i++)
     {
      //--- 항목을 추가하기 전에 나머지 매개변수의 값을 설정
      ResetLastError();
      if(!DatabaseBind(request, 1, ticks[i].time))
        {
         PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
         PrintFormat("Tick #%d line=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
      //--- 이전 DatabaseBind() 호출에 성공한 경우 다음 매개변수를 설정합니다       
      if(!request_error && !DatabaseBind(request, 2, ticks[i].bid))
        {
         PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
         PrintFormat("Tick #%d line=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
      if(!request_error && !DatabaseBind(request, 3, ticks[i].ask))
        {
         PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
         PrintFormat("Tick #%d line=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
      if(!request_error && !DatabaseBind(request, 4, ticks[i].last))
        {
         PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
         PrintFormat("Tick #%d line=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
      if(!request_error && !DatabaseBind(request, 5, ticks[i].volume))
        {
         PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
         PrintFormat("Tick #%d line=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
      if(!request_error && !DatabaseBind(request, 6, ticks[i].time_msc))
        {
         PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
         PrintFormat("Tick #%d line=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
      if(!request_error && !DatabaseBind(request, 7, ticks[i].volume_real))
        {
         PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
         PrintFormat("Tick #%d line=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
 
      //--- 진입 입력 요청을 실행하고 오류를 확인
      if(!request_error && !DatabaseRead(request) && (GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
        {
         PrintFormat("DatabaseRead() failed with code=%d"GetLastError());
         DatabaseFinalize(request);
         request_error=true;
         break;
        }
      //--- 다음 매개변수 업데이트 전에 요청을 재설정
      if(!request_error && !DatabaseReset(request))
        {
         PrintFormat("DatabaseReset() failed with code=%d"GetLastError());
         DatabaseFinalize(request);
         request_error=true;
         break;
        }
     } //--- 모든 틱을 다 거쳐 완료
 
//--- 트랜잭션 상태
   if(request_error)
     {
      PrintFormat("Table TICKS: failed to add %d ticks "ArraySize(ticks));
      DatabaseTransactionRollback(db);
      DatabaseClose(db);
      return;
     }
   else
     {
      DatabaseTransactionCommit(db);
      PrintFormat("Table TICKS: added %d ticks in %d ms",
                  ArraySize(ticks), GetTickCount()-start);
     }
 
//--- 데이터베이스 파일을 닫고 이를 알림
   DatabaseClose(db);
   PrintFormat("데이터베이스: %s 생성되고 마감됨", filename);
  }
/*
 결과:
 EURUSD: CopyTicksRange는 268061틱을 47 ms 내 수신 (2020.03.18 12:40부터 2020.03.19 12:40까지)
 데이터베이스: EURUSD 2020.03.18 12.40 - 2020.03.19 12.40.sqlite 열기 성공
 #| cid 이름        유형     notnull dflt_value pk
  -+-----------------------------------------------
  1|   0 SYMBOL      CHAR(10)       0             0 
  2|   1 TIME        INT            1             0 
  3|   2 BID         REAL           0             0 
  4|   3 ASK         REAL           0             0 
  5|   4 LAST        REAL           0             0 
  6|   5 VOLUME      INT            0             0 
  7|   6 TIME_MSC    INT            0             0 
  8|   7 VOLUME_REAL REAL           0             0 
 TICKS 표: 268061 틱이 797 ms 내 추가됨
 데이터베이스: EURUSD 2020.03.18 12.40 - 2020.03.19 12.40.sqlite 생성 및 마감
  OnCalculateCorrelation=0.87 2020.03.19 13:00:  EURUSD vs GBPUSD  PERIOD_M30 
*/

추가 참조

DatabasePrepare, DatabaseReset, DatabaseRead, DatabaseBindArray