DatabaseBindArray

Diziyi parametre değeri olarak ayarlar.

bool  DatabaseBind(
   int  request,      // DatabasePrepare'da oluşturulan isteğin tanıtıcı değeri
   int  index,        // istekteki parametre indeksi
   T&   array[]       // dizi olarak parametre 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.

array[]

[in]  İstek parametresi değeri olarak ayarlanacak dizi.

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_ARRAY_BAD_SIZE (4011)                    - bayt cinsinden dizi boyutu INT_MAX değerini aşıyor;
  • 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 (istek yürütülüyor veya zaten tamamlandı, 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, DatabaseBindArray()'de parametrelerin endekslenmesi sıfırdan başlar.

Örneğin:

     INSERT INTO table VALUES (?,?,?)

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.

Örnek:

//+------------------------------------------------------------------+
//| Script programı başlatma fonksiyonu                              |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- DAT uzantılı dosyaları seçmek için iletişim kutusunu aç
   string selected_files[];
   if(!FileSelectDialog("İndirilecek dosyaları seçin"NULL,
                       "Data files (*.dat)|*.dat|All files (*.*)|*.*",
                       FSD_ALLOW_MULTISELECT, selected_files, "tester.dat")>0)
     {
      Print("Files not selected. Exit");
      return;
     }
//--- dosyaların boyutunu elde et
   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];
        }
     }
//--- toplam dosya boyutunu kontrol et
   if(total_size==0)
     {
      PrintFormat("Total files size is 0. Exit");
      return;
     }
 
//--- ortak terminal klasöründe veritabanı oluştur veya aç
   string filename="dat_files.sqlite";
   int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE);
   if(db==INVALID_HANDLE)
     {
      Print("DB: ", filename, " open failed with code "GetLastError());
      return;
     }
   else
      Print("Database: ", filename, " opened successfully");
//--- FILES tablosu varsa, sil
   if(DatabaseTableExists(db, "FILES"))
     {
      //--- tabloyu sil
      if(!DatabaseExecute(db, "DROP TABLE FILES"))
        {
         Print("Failed to drop table FILES with code "GetLastError());
         DatabaseClose(db);
         return;
        }
     }
//--- FILES tablosu oluştur
   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: failed to create table FILES with code "GetLastError());
      DatabaseClose(db);
      return;
     }
//--- FILES tablosundaki tüm alanların listesini görüntüle
   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 tablosuna dosya eklemek için parametrelenmiş bir istek oluştur
   string sql="INSERT INTO FILES (NAME,SIZE,PERCENT_SIZE,DATA)"
              " VALUES (?1,?2,?3,?4);"// istek parametreleri
   int request=DatabasePrepare(db, sql);
   if(request==INVALID_HANDLE)
     {
      PrintFormat("DatabasePrepare() failed with code=%d"GetLastError());
      Print("SQL request: ", sql);
      DatabaseClose(db);
      return;
     }
 
//--- tüm dosyaları gözden geçir ve dosyaları FILES tablosuna ekle
   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++;
         //--- dosyayı tabloya eklemeden önce parametrelerin değerlerini ayarla
         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;
           }
         //--- girdiyi eklemek için bir istek yürüt ve bir hata olup olmadığını kontrol et
         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);
         //--- sonraki parametre güncellemesinden önce isteği sıfırla
         if(!DatabaseReset(request))
           {
            PrintFormat("DatabaseReset() failed with code=%d"GetLastError());
            DatabaseFinalize(request);
            request_error=true;
            break;
           }
        }
     }
//--- işlem durumu
   if(request_error)
     {
      PrintFormat("Table FILES: failed to add %d files", count);
      DatabaseTransactionRollback(db);
      DatabaseClose(db);
      return;
     }
   else
     {
      DatabaseTransactionCommit(db);
      PrintFormat("Table FILES: added %d files", count);
     }
 
//--- veritabanı dosyasını kapat ve bunu rapor et
   DatabaseClose(db);
   PrintFormat("Database: %s created and closed", filename);
  }

Ayrıca bakınız

DatabasePrepare, DatabaseReset, DatabaseRead, DatabaseBind