DatabaseBindArray

배열을 매개변수 값으로 설정.

bool  DatabaseBind(
   int  request,      // DatabasePrepare에서 생성된 요청의 핸들
   int  index,        // 요청의 매개변수 인덱스
   T&   array[]       // 배열로서 매개변수의 값
   );

매개변수

request

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

index

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

array[]

[in]  요청 매개변수 값으로 설정할 배열.

반환 값

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

  • ERR_INVALID_PARAMETER (4003)              – 지원되지 않는 유형;
  • ERR_ARRAY_BAD_SIZE (4011)                    - 배열 크기(바이트)가 INT_MAX를 초과합니다;
  • ERR_DATABASE_INVALID_HANDLE (5121)  - 유효하지 않은 데이터베이스 핸들;
  • ERR_DATABASE_NOT_READY (5128)    - 현재 이 기능을 사용하여 요청을 만들 수 없습니다(요청이 실행 중이거나 이미 완료된 경우, DatabaseReset을 호출해야 함).

참고

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

예를 들어:

     INSERT INTO table VALUES (?,?,?)

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

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

예:

//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 기능                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- DAT 확장자를 사용하여 파일을 선택할 수 있는 대화 상자 열기
   string selected_files[];
   if(!FileSelectDialog("다운로드할 파일을 선택"NULL,
                       "Data files (*.dat)|*.dat|All files (*.*)|*.*",
                       FSD_ALLOW_MULTISELECT, selected_files, "tester.dat")>0)
     {
      Print("파일이 선택되지 않음. Exit");
      return;
     }
//--- 파일의 사이즈를 가져오기
   ulong filesize[];
   int filehandle[];
   int files=ArraySize(selected_files);
   ArrayResize(filesize, files);
   ZeroMemory(filesize);
   ArrayResize(filehandle, files);
   double total_size=0;
   for(int i=0; i<files; i++)
     {
      filehandle[i]=FileOpen(selected_files[i], FILE_READ|FILE_BIN);
      if(filehandle[i]!=INVALID_HANDLE)
        {
         filesize[i]=FileSize(filehandle[i]);
         //PrintFormat("%d, %s handle=%d %d bytes", i, selected_files[i], filehandle[i], filesize[i]);
         total_size+=(double)filesize[i];
        }
     }
//--- 파일의 공통 크기를 확인
   if(total_size==0)
     {
      PrintFormat("총 파일의 크기가 0입니다. Exit");
      return;
     }
 
//--- 공통 터미널 폴더에서 데이터베이스 생성 또는 열기
   string filename="dat_files.sqlite";
   int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE);
   if(db==INVALID_HANDLE)
     {
      Print("DB: ", filename, " 코드와함께 열기 실패 "GetLastError());
      return;
     }
   else
      Print("데이터베이스: ", filename, " 성공적으로 열림");
//--- FILES 테이블이 있는 경우 삭제
   if(DatabaseTableExists(db, "FILES"))
     {
      //--- 테이블 삭제
      if(!DatabaseExecute(db, "DROP TABLE FILES"))
        {
         Print("코드가 있는 테이블 FILES을 삭제하는데 실패 "GetLastError());
         DatabaseClose(db);
         return;
        }
     }
//--- FILES 테이블을 생성
   if(!DatabaseExecute(db, "CREATE TABLE FILES("
                       "NAME           TEXT NOT NULL,"
                       "SIZE           INT  NOT NULL,"
                       "PERCENT_SIZE   REAL NOT NULL,"
                       "DATA           BLOB NOT NULL);"))
     {
      Print("DB: 코드가 있는 FILES을 생성하지 못했습니다 "GetLastError());
      DatabaseClose(db);
      return;
     }
//--- 코드가 있는 FILES 테이블 파일을 생성하지 못했습니다
   if(DatabasePrint(db, "PRAGMA TABLE_INFO(FILES)", 0)<0)
     {
      PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(FILES)\") failed, error code=%d at line %d"GetLastError(), __LINE__);
      DatabaseClose(db);
      return;
     }
 
//--- 매개변수화된 요청을 생성하여 FILES 테이블에 추가
   string sql="INSERT INTO FILES (NAME,SIZE,PERCENT_SIZE,DATA)"
              " VALUES (?1,?2,?3,?4);"// 매개변수 요청
   int request=DatabasePrepare(db, sql);
   if(request==INVALID_HANDLE)
     {
      PrintFormat("DatabasePrepare() failed with code=%d"GetLastError());
      Print("SQL 요청: ", sql);
      DatabaseClose(db);
      return;
     }
 
//--- 모든 파일을 살펴본 후 FILES 테이블에 추가
   bool request_error=false;
   DatabaseTransactionBegin(db);
   int count=0;
   uint size;
   for(int i=0; i<files; i++)
     {
      if(filehandle[i]!=INVALID_HANDLE)
        {
         char data[];
         size=FileReadArray(filehandle[i], data);
         if(size==0)
           {
            PrintFormat("FileReadArray(%s) failed with code %d", selected_files[i], GetLastError());
            continue;
           }
 
         count++;
         //--- 테이블에 파일을 추가하기 전에 매개변수의 값을 설정
         if(!DatabaseBind(request, 0, selected_files[i]))
           {
            PrintFormat("DatabaseBind() failed at line %d with code=%d"__LINE__GetLastError());
            request_error=true;
            break;
           }
         if(!DatabaseBind(request, 1, size))
           {
            PrintFormat("DatabaseBind() failed at line %d with code=%d"__LINE__GetLastError());
            request_error=true;
            break;
           }
         if(!DatabaseBind(request, 2, double(size)*100./total_size))
           {
            PrintFormat("DatabaseBind() failed at line %d with code=%d"__LINE__GetLastError());
            request_error=true;
            break;
           }
         if(!DatabaseBindArray(request, 3, data))
           {
            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. %s: %d bytes", count, selected_files[i],size);
         //--- 다음 매개변수 업데이트 전에 요청을 재설정
         if(!DatabaseReset(request))
           {
            PrintFormat("DatabaseReset() failed with code=%d"GetLastError());
            DatabaseFinalize(request);
            request_error=true;
            break;
           }
        }
     }
//--- 트랜잭션 상태
   if(request_error)
     {
      PrintFormat("테이블 FILES: %d 파일 추가 실패", count);
      DatabaseTransactionRollback(db);
      DatabaseClose(db);
      return;
     }
   else
     {
      DatabaseTransactionCommit(db);
      PrintFormat("테이블 FILES: %d 파일 추가", count);
     }
 
//--- 데이터베이스 파일을 닫고 이를 알림
   DatabaseClose(db);
   PrintFormat("데이터베이스: %s 생성되고 마감됨", filename);
  }

추가 참조

DatabasePrepare, DatabaseReset, DatabaseRead, DatabaseBind