DatabaseBind

İstekte bir parametre değeri ayarlar.

bool  DatabaseBind(
   int  request,      // DatabasePrepare'da oluşturulan isteğin tanıtıcı değeri
   int  index,        // istekteki parametre indeksi
   T    value         // basit tipteki parametrenin değeri
   );

Parametreler

request

[in] DatabasePrepare()'da oluşturulan isteğin tanıtıcı değeri.

index

[in]  İstekte değerin ayarlanacağı parametre indeksi. Numaralandırma sıfır ile başlar.

value

[in]  Ayarlanacak değer. İzin verilen tipler: bool, char, uchar, short, ushart, int, uint, color, datetime, long, ulong, float, double, string.

Geri dönüş değeri

Başarılı olursa true, aksi takdirde false olarak geri döner. Hata kodunu almak için GetLastError() kullanın, olası yanıtlar şunlardır:

  • ERR_INVALID_PARAMETER (4003)             – desteklenmeyen tip;
  • ERR_DATABASE_INVALID_HANDLE (5121)  - geçersiz veritabanı tanıtıcı değeri;
  • ERR_DATABASE_NOT_READY (5128)         - şu anda bir istekte bulunmak için fonksiyon kullanılamaz. İstek yürütülüyor veya zaten tamamlanmış. DatabaseReset() çağrılmalıdır.

 

Not

Fonksiyon, bir SQL isteğinin "?" veya "?N" parametrelenebilir değerleri içermesi durumunda kullanılır; burada N, parametre indeksi (birden başlayarak) anlamına gelir. Aynı zamanda, DatabaseBind()'da parametrelerin indekslenmesi sıfırdan başlar.

Örneğin:

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

Bu fonksiyon, DatabasePrepare()'da parametrelenmiş bir istek oluşturulduktan hemen sonra veya istek DatabaseReset() kullanılarak sıfırlandıktan sonra çağrılabilir.

İsteği farklı parametre değerleriyle istediğiniz kadar yürütmek için bu fonksiyonu DatabaseReset() ile birlikte kullanın.

Fonksiyon, basit tipteki parametrelerle çalışacak şekilde tasarlanmıştır. Bir parametrenin bir diziyle karşılaştırılması gerekiyorsa, DatabaseBindArray() fonksiyonunu kullanın.

Örnek:

//+------------------------------------------------------------------+
//| Script programı başlatma fonksiyonu                              |
//+------------------------------------------------------------------+
void OnStart()
  {
   MqlTick ticks[];
//--- tikleri almadan önce başlangıç zamanını hatırla
   uint start=GetTickCount();
//--- günlük tik geçmişini talep et
   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
     {
      //--- kaç tane tik alındı ve bunları almak için ne kadar zaman gerekti
      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)));
     }
 
//--- veritabanını depolamak için dosya adını ayarla
   string filename=_Symbol+" "+TimeToString(datetime(from/1000))+" - "+TimeToString(datetime(to/1000))+".sqlite";
   StringReplace(filename, ":""."); // dosya adlarında ":" karakteri kullanılamaz
//--- ortak terminal klasöründe veritabanını aç/oluştur
   int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE | DATABASE_OPEN_COMMON);
   if(db==INVALID_HANDLE)
     {
      Print("Database: ", filename, " open failed with code "GetLastError());
      return;
     }
   else
      Print("Database: ", filename, " opened successfully");
 
//--- TICKS tablosu oluştur
   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 tablosundaki tüm alanların listesini görüntüle
   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 tablosuna tik eklemek için parametrelenmiş bir istek oluştur
   string sql="INSERT INTO TICKS (SYMBOL,TIME,BID,ASK,LAST,VOLUME,TIME_MSC,VOLUME_REAL)"
              " VALUES (?1,?2,?3,?4,?5,?6,?7,?8)"// request parameters
   int request=DatabasePrepare(db, sql);
   if(request==INVALID_HANDLE)
     {
      PrintFormat("DatabasePrepare() failed with code=%d"GetLastError());
      Print("SQL request: ", sql);
      DatabaseClose(db);
      return;
     }
//--- ilk istek parametresinin değerini ayarla
   DatabaseBind(request, 0, _Symbol);
//--- TICKS tablosuna tikleri eklemeden önce başlangıç zamanını hatırla
   start=GetTickCount();
   DatabaseTransactionBegin(db);
   int total=ArraySize(ticks);
   bool request_error=false;
   for(int i=0; i<total; i++)
     {
      //--- girdi eklemeden önce kalan parametrelerin değerlerini ayarla
      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;
        }
      //--- önceki DatabaseBind() çağrısı başarılı olduysa, sonraki parametreyi ayarla       
      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;
        }
 
      //--- girdiyi eklemek için bir istek yürüt ve bir hata olup olmadığını kontrol et
      if(!request_error && !DatabaseRead(request) && (GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
        {
         PrintFormat("DatabaseRead() failed with code=%d"GetLastError());
         DatabaseFinalize(request);
         request_error=true;
         break;
        }
      //--- sonraki parametre güncellemesinden önce isteği sıfırla
      if(!request_error && !DatabaseReset(request))
        {
         PrintFormat("DatabaseReset() failed with code=%d"GetLastError());
         DatabaseFinalize(request);
         request_error=true;
         break;
        }
     } //--- tüm tikler gözden geçilerek tamamlandı
 
//--- işlem durumu
   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);
     }
 
//--- veritabanı dosyasını kapat ve bunu rapor et
   DatabaseClose(db);
   PrintFormat("Database: %s created and closed", filename);
  }
/*
 Sonuç:
  EURUSD: CopyTicksRange received 268061 ticks in 47 ms (from 2020.03.18 12:40 to 2020.03.19 12:40)
  Database: EURUSD 2020.03.18 12.40 - 2020.03.19 12.40.sqlite opened successfully
  #| cid name        type     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 
  Table TICKS: added 268061 ticks in 797 ms
  Database: EURUSD 2020.03.18 12.40 - 2020.03.19 12.40.sqlite created and closed
  OnCalculateCorrelation=0.87 2020.03.19 13:00:  EURUSD vs GBPUSD  PERIOD_M30 
*/

Ayrıca bakınız

DatabasePrepare, DatabaseReset, DatabaseRead, DatabaseBindArray