DatabaseReset

DatabasePrepare()를 호출한 후와 같이 요청을 재설정.

int  DatabaseReset(
   int  request      // DatabasePrepare에서 요청 핸들 수신
   );

매개변수

request

[in] DatabasePrepare()에서 가져온 요청 핸들.

반환 값

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

  • ERR_DATABASE_INVALID_HANDLE (5121) - 유효하지 않은 데이터베이스 핸들;
  • ERR_DATABASE_ERROR(5601)로 시작하는 SQLite 오류 코드.

참고

DatabaseReset() 기능은 매개변수 값이 서로 다른 요청을 여러 번 실행하기 위한 것입니다. 예를 들어 INSERT 명령을 사용하여 테이블에 대량으로 데이터를 추가하는 경우 각 항목에 대해 사용자 지정 필드 값 세트를 구성해야 합니다.

DatabasePrepare()와 달리 DatabaseReset() 호출은 SQL 명령을 사용하여 문자열을 새 요청으로 컴파일하지 않으므로 DatabaseReset()이 DatabasePrepare()보다 훨씬 빠르게 실행됩니다.

DatabaseReset()는 DatabaseBind() 기능 및/또는 DatabaseBindArray()와 함께 DatabaseRead()를 실행한 후 요청 매개변수 값을 변경하는 경우 사용됩니다. 즉, 요청 매개변수의 새 값을 설정하기 전에 (DatabaseBind/DatabaseBindArray 호출의 블룩 전), DatabaseReset()을 호출하여 재설정해야 합니다. 매개변수화 된 요청 자체는 DatabasePrepare()를 사용하여 생성해야 합니다.

DatabasePrepare()와 마찬가지로, DatabaseReset()은 데이터 베이스 요청을 생성하지 않습니다. 직접 요청 실행은 DatabaseRead() 또는 DatabaseReadBind()를 호출할 때 수행됩니다.

DatabaseBind()/DatabaseBindArray()르를 호출하여 설정한 경우에는 DatabaseReset() 호출로 인해 매개변수 값이 재설정되지 않으며 즉, 매개변수가 해당 값을 유지합니다. 따라서 단일 매개변수의 값만 변경할 수 있습니다. There is no need to set all request parameters anew after calling DatabaseReset()을 호출한 후에는 모든 요청 매개변수를 새로 설정할 필요가 없습니다.

DatabaseFinalize()를 사용하여 제거된 요총의 핸들을 DatabaseReset()에 전달할 수 없습니다. 이로 인해 오류가 발행합니다.

예:

//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 기능                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 데이터베이스 열거나 생성
   string filename="symbols.sqlite";
   int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE);
   if(db==INVALID_HANDLE)
     {
      Print("DB: ", filename, " 코드와함께 열기 실패 "GetLastError());
      return;
     }
   else
      Print("데이터베이스: ", filename, " 성공적으로 열림");
//--- SYMBOLS 테이블이 있는 경우 삭제
   if(DatabaseTableExists(db, "SYMBOLS"))
     {
      //--- 테이블 삭제
      if(!DatabaseExecute(db, "DROP TABLE SYMBOLS"))
        {
         Print("코드가 있는 테이블 SYMBOLS을 삭제 실패 "GetLastError());
         DatabaseClose(db);
         return;
        }
     }
//--- SYMBOLS 테이블 생성
   if(!DatabaseExecute(db, "CREATE TABLE SYMBOLS("
                       "NAME           TEXT    NOT NULL,"
                       "DESCRIPTION    TEXT            ,"
                       "PATH           TEXT            ,"
                       "SPREAD         INT             ,"
                       "POINT          REAL    NOT NULL,"
                       "DIGITS         INT     NOT NULL,"
                       "JSON           BLOB );"))
     {
      Print("DB: ", filename, " 코트로 테이블을 생성 실패 "GetLastError());
      DatabaseClose(db);
      return;
     }
//--- SYMBOLS 테이블에 모든 모든 필드 목록 표시
   if(DatabasePrint(db, "PRAGMA TABLE_INFO(SYMBOLS)", 0)<0)
     {
      PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(SYMBOLS)\") failed, error code=%d at line %d"GetLastError(), __LINE__);
      DatabaseClose(db);
      return;
     }
 
//--- 매개변수화된 요청을 생성하여 심볼을 SYMBOLS 테이블에 추가
   string sql="INSERT INTO SYMBOLS (NAME,DESCRIPTION,PATH,SPREAD,POINT,DIGITS,JSON)"
              " VALUES (?1,?2,?3,?4,?5,?6,?7);"// request parameters
   int request=DatabasePrepare(db, sql);
   if(request==INVALID_HANDLE)
     {
      PrintFormat("DatabasePrepare() failed with code=%d"GetLastError());
      Print("SQL 요청: ", sql);
      DatabaseClose(db);
      return;
     }
 
//--- 모든 심볼을 살펴보고 SYMBOLS 테이블에 추가
   int symbols=SymbolsTotal(false);
   bool request_error=false;
   DatabaseTransactionBegin(db);   
   for(int i=0; i<symbols; i++)
     {
      //--- 심볼을 추가하기 전에 매개변수의 값을 설정
      ResetLastError();
      string symbol=SymbolName(i, false);
      if(!DatabaseBind(request, 0, symbol))
        {
         PrintFormat("DatabaseBind() failed at line %d with code=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
      //--- 이전 DatabaseBind() 호출에 성공한 경우 다음 매개변수를 설정합니다
      if(!DatabaseBind(request, 1, SymbolInfoString(symbolSYMBOL_DESCRIPTION)))
        {
         PrintFormat("DatabaseBind() failed at line %d with code=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
      if(!DatabaseBind(request, 2, SymbolInfoString(symbolSYMBOL_PATH)))
        {
         PrintFormat("DatabaseBind() failed at line %d with code=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
      if(!DatabaseBind(request, 3, SymbolInfoInteger(symbolSYMBOL_SPREAD)))
        {
         PrintFormat("DatabaseBind() failed at line %d with code=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
      if(!DatabaseBind(request, 4, SymbolInfoDouble(symbolSYMBOL_POINT)))
        {
         PrintFormat("DatabaseBind() failed at line %d with code=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
      if(!DatabaseBind(request, 5, SymbolInfoInteger(symbolSYMBOL_DIGITS)))
        {
         PrintFormat("DatabaseBind() failed at line %d with code=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
      if(!DatabaseBind(request, 6, GetSymBolAsJson(symbol)))
        {
         PrintFormat("DatabaseBind() failed at line %d with code=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
 
      //--- 진입 입력 요청을 실행하고 오류를 확인
      if(!DatabaseRead(request)&&(GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
        {
         PrintFormat("DatabaseRead() failed with code=%d"GetLastError());
         DatabaseFinalize(request);
         request_error=true;
         break;
        }
      else
         PrintFormat("%d: added %s", i+1, symbol);
      //--- 다음 매개변수 업데이트 전에 요청을 재설정
      if(!DatabaseReset(request))
        {
         PrintFormat("DatabaseReset() failed with code=%d"GetLastError());
         DatabaseFinalize(request);
         request_error=true;
         break;
        }
     } //--- 모든 심볼을 살펴본 후
 
//--- 트랜잭션 상태
   if(request_error)
     {
      PrintFormat("Table SYMBOLS: failed to add %d symbols", symbols);
      DatabaseTransactionRollback(db);
      DatabaseClose(db);
      return;
     }
   else
     {
      DatabaseTransactionCommit(db);
      PrintFormat("Table SYMBOLS: added %d symbols",symbols);
     }
 
//--- SYMBOLS 테이블을 CSV 파일에 저장
   string csv_filename="symbols.csv";
   if(DatabaseExport(db, "SELECT * FROM SYMBOLS", csv_filename,
                     DATABASE_EXPORT_HEADER|DATABASE_EXPORT_INDEX|DATABASE_EXPORT_QUOTED_STRINGS";"))
      Print("데이터베이스: 테이블 SYMBOLS 저장 위치 ", csv_filename);
   else
      Print("데이터베이스: DatabaseExport(\"SELECT * FROM SYMBOLS\") 가 코드로 실패"GetLastError());
 
//--- 데이터베이스 파일을 닫고 이를 알림
   DatabaseClose(db);
   PrintFormat("데이터베이스: %s 생성되고 마감됨", filename);
  }
//+------------------------------------------------------------------+
//| 심볼 사양은 JSON으로 반환                            |
//+------------------------------------------------------------------+
string GetSymBolAsJson(string symbol)
  {
//--- 들여쓰기
   string indent1=Indent(1);
   string indent2=Indent(2);
   string indent3=Indent(3);
//---
   int digits=(int)SymbolInfoInteger(symbolSYMBOL_DIGITS);
   string json="{"+
               "\n"+indent1+"\"ConfigSymbols\":["+
               "\n"+indent2+"{"+
               "\n"+indent3+"\"Symbol\":\""+symbol+"\","+
               "\n"+indent3+"\"Path\":\""+SymbolInfoString(symbolSYMBOL_PATH)+"\","+
               "\n"+indent3+"\"CurrencyBase\":\""+SymbolInfoString(symbolSYMBOL_CURRENCY_BASE)+"\","+
               "\n"+indent3+"\"CurrencyProfit\":\""+SymbolInfoString(symbolSYMBOL_CURRENCY_PROFIT)+"\","+
               "\n"+indent3+"\"CurrencyMargin\":\""+SymbolInfoString(symbolSYMBOL_CURRENCY_MARGIN)+"\","+
               "\n"+indent3+"\"ColorBackground\":\""+ColorToString((color)SymbolInfoInteger(symbolSYMBOL_BACKGROUND_COLOR))+"\","+
               "\n"+indent3+"\"Digits\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_DIGITS))+"\","+
               "\n"+indent3+"\"Point\":\""+DoubleToString(SymbolInfoDouble(symbolSYMBOL_POINT), digits)+"\","+
               "\n"+indent3+"\"TickBookDepth\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_TICKS_BOOKDEPTH))+"\","+
               "\n"+indent3+"\"ChartMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_CHART_MODE))+"\","+
               "\n"+indent3+"\"TradeMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_TRADE_EXEMODE))+"\","+
               "\n"+indent3+"\"TradeCalcMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_TRADE_CALC_MODE))+"\","+
               "\n"+indent3+"\"OrderMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_ORDER_MODE))+"\","+
               "\n"+indent3+"\"CalculationMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_TRADE_CALC_MODE))+"\","+
               "\n"+indent3+"\"ExecutionMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_TRADE_EXEMODE))+"\","+
               "\n"+indent3+"\"ExpirationMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_EXPIRATION_MODE))+"\","+
               "\n"+indent3+"\"FillFlags\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_FILLING_MODE))+"\","+
               "\n"+indent3+"\"ExpirFlags\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_EXPIRATION_MODE))+"\","+
               "\n"+indent3+"\"Spread\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_SPREAD))+"\","+
               "\n"+indent3+"\"TickValue\":\""+StringFormat("%G", (SymbolInfoDouble(symbolSYMBOL_TRADE_TICK_VALUE)))+"\","+
               "\n"+indent3+"\"TickSize\":\""+StringFormat("%G", (SymbolInfoDouble(symbolSYMBOL_TRADE_TICK_SIZE)))+"\","+
               "\n"+indent3+"\"ContractSize\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_TRADE_CONTRACT_SIZE)))+"\","+
               "\n"+indent3+"\"StopsLevel\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_TRADE_STOPS_LEVEL))+"\","+
               "\n"+indent3+"\"VolumeMin\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_VOLUME_MIN)))+"\","+
               "\n"+indent3+"\"VolumeMax\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_VOLUME_MAX)))+"\","+
               "\n"+indent3+"\"VolumeStep\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_VOLUME_STEP)))+"\","+
               "\n"+indent3+"\"VolumeLimit\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_VOLUME_STEP)))+"\","+
               "\n"+indent3+"\"SwapMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_SWAP_MODE))+"\","+
               "\n"+indent3+"\"SwapLong\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_SWAP_LONG)))+"\","+
               "\n"+indent3+"\"SwapShort\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_SWAP_SHORT)))+"\","+
               "\n"+indent3+"\"Swap3Day\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_SWAP_ROLLOVER3DAYS))+"\""+
               "\n"+indent2+"}"+
               "\n"+indent1+"]"+
               "\n}";
   return(json);
  }
//+------------------------------------------------------------------+
//| 공백으로 된 들여쓰기 구성                                    |
//+------------------------------------------------------------------+
string Indent(const int number, const int characters=3)
  {
   int length=number*characters;
   string indent=NULL;
   StringInit(indent, length, ' ');
   return indent;
  }
/*
 결과:
 데이터베이스: symbols.sqlite 성공적으로 열림
  #| cid name        type notnull dflt_value pk
  -+-------------------------------------------
  1|   0 NAME        TEXT       1             0 
  2|   1 DESCRIPTION TEXT       0             0 
  3|   2 PATH        TEXT       0             0 
  4|   3 SPREAD      INT        0             0 
  5|   4 POINT       REAL       1             0 
  6|   5 DIGITS      INT        1             0 
  7|   6 JSON        BLOB       0             0 
 1: EURUSD 추가됨
 2: GBPUSD 추가됨
 3: USDCHF 추가됨
  ...
 82: USDCOP 추가됨
 83: USDARS 추가됨
 84: USDCLP 추가됨
 테이블 SYMBOLS: 심볼 84개 추가
 데이터베이스: 테이블 SYMBOLS이 symbols.csv에 저장됨
 데이터베이스: symbols.sqlite 생성되고 닫힘
*/
 

추가 참조

DatabasePrepare, DatabaseBind, DatabaseBindArray, DatabaseFinalize