DatabaseBindArray

Définit un tableau comme valeur de paramètre.

bool  DatabaseBind(
   int  request,      // le handle d'une requête créée avec DatabasePrepare
   int  index,        // l'indice du paramètre dans la requête
   T&   array[]       // valeur de paramètre sous forme de tableau
   );

Paramètres

request

[in]  Le handle d'une requête créée avec DatabasePrepare().

index

[in]  L'indice du paramètre dans la requête pour lequel la valeur doit être définie. La numérotation commence à zéro.

array[]

[in] Le tableau à utiliser comme valeur du paramètre de la requête.

Valeur de Retour

Retourne true en cas de succès, sinon - false. Pour obtenir le code de l'erreur, utilisez GetLastError(), les réponses possibles sont :

  • ERR_INVALID_PARAMETER (4003)              — type non supporté ;
  • ERR_ARRAY_BAD_SIZE (4011)                    - la taille du tableau en octets dépasse INT_MAX ;
  • ERR_DATABASE_INVALID_HANDLE (5121)  - handle de base de données invalide ;
  • ERR_DATABASE_NOT_READY (5128)    - ne peut pas utiliser la fonction pour faire une requête pour le moment (la requête est en cours d'exécution ou déjà terminée, DatabaseReset doit être appelé).

Note

La fonction est utilisée dans le cas où une requête SQL contient "?" ou "?N" valeurs paramétrables où N signifie l'indice du paramètre (à partir de un). Dans le même temps, l'indexation des paramètres dans DatabaseBindArray() commence à zéro.

Par exemple :

     INSERT INTO table VALUES (?,?,?)

La fonction peut être appelée immédiatement après la création d'une demande paramétrée dans DatabasePrepare() ou après la réinitialisation de la demande à l'aide de DatabaseReset () .

Utilisez cette fonction avec DatabaseReset() pour exécuter la requête autant de fois que nécessaire avec différentes valeurs de paramètre.

Exemple :

//+------------------------------------------------------------------+
//| Fonction de démarrage du script                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- ouvre la boîte de dialogue de sélection des fichiers avec l'extension DAT
   string selected_files[];
   if(!FileSelectDialog("Sélectionner les fichiers à télécharger"NULL,
                       "Fichiers Data (*.dat)|*.dat|Tous les fichiers (*.*)|*.*",
                       FSD_ALLOW_MULTISELECT, selected_files, "tester.dat")>0)
     {
      Print("Aucun fichier sélectionné. Sortie");
      return;
     }
//--- récupère la taille de tous les fichiers
   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];
        }
     }
//--- vérifie la taille globale des fichiers
   if(total_size==0)
     {
      PrintFormat("La taille totale des fichiers est 0. Sortie");
      return;
     }
 
//--- crée ou ouvre la base de données dans le dossier commun du terminal
   string filename="dat_files.sqlite";
   int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE);
   if(db==INVALID_HANDLE)
     {
 Print("DB: échec de l'ouverture de ", filename,  avec le code "GetLastError());
      return;
     }
   else
 Print("Base de données :", filename, " ouvert avec succès");
//--- si la table FILES existe, la supprime
   if(DatabaseTableExists(db, "FILES"))
     {
      //--- supprime la table
      if(!DatabaseExecute(db, "DROP TABLE FILES"))
        {
 Print("Impossible de supprimer la table FILES avec le code "GetLastError());
         DatabaseClose(db);
         return;
        }
     }
//--- crée la table 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: impossible de créer la table FILES avec le code" GetLastError());
      DatabaseClose(db);
      return;
     }
//--- affiche la liste de tous les champs de la table FILES
   if(DatabasePrint(db, "PRAGMA TABLE_INFO(FILES)", 0)<0)
     {
 PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(FILES)\") a échoué, code d'erreur=%d à la ligne %d "GetLastError(), __LINE__);
      DatabaseClose(db);
      return;
     }
 
//--- créer une requête paramétrée pour ajouter des fichiers dans la table FILES
   string sql="INSERT INTO FILES (NAME,SIZE,PERCENT_SIZE,DATA)"
              " VALUES (?1,?2,?3,?4);"// paramètres de la requête
   int request=DatabasePrepare(db, sql);
   if(request==INVALID_HANDLE)
     {
 PrintFormat("DatabasePrepare() a échoué avec le code=%d"GetLastError());
      Print("Requête SQL : ", sql);
      DatabaseClose(db);
      return;
     }
 
//--- parcourt tous les fichiers et les ajoute à la table 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) a échoué avec le code %d", selected_files[i], GetLastError());
            continue;
           }
 
         count++;
         //--- définit les valeurs des paramètres avant d'ajouter le fichier à la table
         if(!DatabaseBind(request, 0, selected_files[i]))
           {
            PrintFormat("DatabaseBind() a échoué à la ligne %d avec le code=%d"__LINE__GetLastError());
            request_error=true;
            break;
           }
         if(!DatabaseBind(request, 1, size))
           {
            PrintFormat("DatabaseBind() a échoué à la ligne %d avec le code=%d"__LINE__GetLastError());
            request_error=true;
            break;
           }
         if(!DatabaseBind(request, 2, double(size)*100./total_size))
           {
            PrintFormat("DatabaseBind() a échoué à la ligne %d avec le code=%d"__LINE__GetLastError());
            request_error=true;
            break;
           }
         if(!DatabaseBindArray(request, 3, data))
           {
            PrintFormat("DatabaseBind() a échoué à la ligne %d avec le code=%d"__LINE__GetLastError());
            request_error=true;
            break;
           }
 //--- exécute une requête d'insertion de l'entrée et recherche l'erreur
         if(!DatabaseRead(request)&&(GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
           {
            PrintFormat("DatabaseRead() a échoué avec le code=%d"GetLastError());
            DatabaseFinalize(request);
            request_error=true;
            break;
           }
         else
            PrintFormat("%d. %s: %d bytes", count, selected_files[i],size);
         //--- réinitialise la requpete avant la prochaine mise à jour des paramètres
         if(!DatabaseReset(request))
           {
            PrintFormat("DatabaseReset() a échoué avec le code=%d"GetLastError());
            DatabaseFinalize(request);
            request_error=true;
            break;
           }
        }
     }
//--- statuts des transactions
   if(request_error)
     {
      PrintFormat("Table FILES : échec de l'ajout de %d fichiers", count);
      DatabaseTransactionRollback(db);
      DatabaseClose(db);
      return;
     }
   else
     {
      DatabaseTransactionCommit(db);
      PrintFormat("Table FILES : %d fichiers ajoutés", count);
     }
 
//--- ferme le fichier de base de données et information
   DatabaseClose(db);
 PrintFormat("Base de données : %s créée et fermée", filename);
  }

Voir aussi

DatabasePrepare, DatabaseReset, DatabaseRead, DatabaseBind