Guide de développement

Local Navigation

Utilisation de paramètres SQL

Lorsque vous créez une instruction SQL, vous pouvez créer des paramètres SQL pour réutiliser l'instruction avec des valeurs différentes. Ceci peut entraîner des gains de performances. Vous pouvez préparer des instructions génériques utilisant des variables nommées, puis exécuter les instructions lorsque nécessaire en itérant parmi les valeurs variables, en liant les valeurs aux variables nommées dans chaque itération.

En utilisant les méthodes executeInsert ou executeUpdate, vous liez des paramètres directement dans la méthode avec le paramètre bindParams. bindParams prend un tableau d'objets, qui peuvent être n'importe quelle combinaison des éléments suivants : null, Integer, Long, Boolean, Float, Double, String ou ByteBuffers. Voici un exemple :

Statement st = d.createStatement("UPDATE Account set Balance = ? WHERE AcctNo > ?");
try
{
     st.prepare();
     Object[] bindParams = {new Integer (2000), new Integer (100)};
     st.executeUpdate(bindParams);
}
finally 
{
     st.close();
} 

Lors de l'utilisation de la méthode getCursor ou execute, vous pouvez utiliser la méthode Statement.bind pour fournir des noms pour les paramètres SQL. La méthode bind() récupère le numéro du paramètre et la valeur à lier. Si vous utilisez un nombre non compris dans la gamme autorisée, une DatabaseException est lancée. Toutes les liaisons peuvent être réinitialisées à l'aide de Statement.reset.

Vous pouvez numéroter les paramètres selon les méthodes suivantes :

  • Avec un point d'interrogation (?) dans l'instruction, chaque paramètre est numéroté de façon séquentielle, à partir de 1.

  • Avec un point d'interrogation suivi d'un nombre entier (?NNN) dans l'instruction, chaque paramètre comporte le nombre NNN.

Voici un exemple d'instruction utilisant des paramètres pour créer une limite supérieure et une limite inférieure définissables à chaque exécution de l'instruction. Cet exemple numérote les paramètres de façon séquentielle.

Statement s = Database.createStatement("SELECT * FROM T WHERE a < ? AND a > ?");
    s.prepare();
    s.bind(1, upperBound);
    s.bind(2, lowerBound);
    Cursor c = s.getCursor();

Voici la même instruction, mais cette fois-ci des nombres explicites sont spécifiés pour les paramètres :

Statement s = Database.createStatement("SELECT * FROM T WHERE a < ?5 AND a > ?12");
    s.prepare();
    s.bind(5, upperBound); 
    s.bind(12, lowerBound);
    Cursor c = s.getCursor();

La méthode Statement.getFormalName convertit un index de paramètres en un nom de paramètre SQL. Si vous voulez que getFormalName renvoie le nom du paramètre, vous devez fournir un nom dans la requête. Par exemple, lorsque vous appelez getFormalName(1), l'instruction renvoie "SELECT * FROM T WHERE a = :a" :a. Lorsque des paramètres, tels qu'un point d'interrogation (?) sont utilisés comme espaces réservés, getFormalName() ne peut pas renvoyer de nom de paramètre. Par exemple, getFormalName(1) ne renverra pas de nom pour le paramètre de cette instruction : "SELECT * FROM T WHERE a = ?"

Échantillon de code : création d'une mise à jour paramétrée

import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.database.*;
import net.rim.device.api.io.*;
import java.util.*;
public class ParameterizedUpdate extends UiApplication
{
    public static void main(String[] args)
    {
        ParameterizedUpdate theApp = new ParameterizedUpdate();
        theApp.enterEventDispatcher();
    }
    public ParameterizedUpdate()
    {
        pushScreen(new ParameterizedUpdateScreen());
    }
    }
    class ParameterizedUpdateScreen extends MainScreen
    {
        Database d;
        public ParameterizedUpdateScreen()
        {
            LabelField title = new LabelField("SQLite Parameterized Update Sample",
            LabelField.ELLIPSIS |
            LabelField.USE_ALL_WIDTH);
            setTitle(title);
            add(new RichTextField("Attempting to update data in " +
              "MyTestDatabase.db on the SDCard."));
            try
            {
               URI myURI = URI.create("file:///SDCard/Databases/SQLite_Guide/" +
                 "MyTestDatabase.db");
               d = DatabaseFactory.open(myURI);
               Statement st = d.createStatement(
                 "UPDATE People SET Age=? WHERE Name=?");
               st.prepare();
               Hashtable ht = new Hashtable(2);
               ht.put("Sophie", new Integer(10));
               ht.put("Karen",  new Integer(7));
               Enumeration names = ht.keys();
               Enumeration ages  = ht.elements();
               while (names.hasMoreElements())
               {
                   Integer iAge   = (Integer)ages.nextElement();
                   String strName = (String)names.nextElement();
                   st.bind(1,iAge.intValue());
                   st.bind(2,strName);
                   st.execute();
                   st.reset();
               }
               st.close();
               d.close();
        }
        catch ( Exception e )
        {
            System.out.println( e.getMessage() );
            e.printStackTrace();
        }
    }
}

Échantillon de code : création d'une insertion paramétrée

import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.database.*;
import net.rim.device.api.io.*;
import java.util.*;
public class ParameterizedInsert extends UiApplication
{
public static void main(String[] args)
{
   ParameterizedInsert theApp = new ParameterizedInsert();
      theApp.enterEventDispatcher();
}
public ParameterizedInsert()
{
   pushScreen(new ParameterizedInsertScreen());
}
}
class ParameterizedInsertScreen extends MainScreen
{
   Database d;
   public ParameterizedInsertScreen()
   {
      LabelField title = new LabelField("SQLite Insert Data " +
      "Schema Sample",
      LabelField.ELLIPSIS |
      LabelField.USE_ALL_WIDTH);
      setTitle(title);
      add(new RichTextField("Attempting to insert data into " +
      "MyTestDatabase.db on the SDCard."));
    try
    {
       URI myURI = URI.create("file:///SDCard/Databases/SQLite_Guide/" +
       "MyTestDatabase.db");
       d = DatabaseFactory.open(myURI);
       Statement st = d.createStatement("INSERT INTO People(Name,Age) " +
       "VALUES (?,?)");
       st.prepare();
       Hashtable ht = new Hashtable(4);
       ht.put("Sophie", new Integer(6));
       ht.put("Karen",  new Integer(3));
       ht.put("Kevin",  new Integer(82));
       ht.put("Cindy",  new Integer(12));
       Enumeration names = ht.keys();
       Enumeration ages  = ht.elements();
       while (names.hasMoreElements())
       {
          String strName = (String)names.nextElement();
          Integer iAge   = (Integer)ages.nextElement();
          st.bind(1,strName);
          st.bind(2,iAge.intValue());
          st.execute();
          st.reset();
       }
       st.close();
       d.close();
    }
    catch ( Exception e )
    {
       System.out.println( e.getMessage() );
       e.printStackTrace();
    }
}
}

Ces informations vous ont-elles été utiles ? Envoyez-nous vos commentaires.