Entwicklungshandbuch

Local Navigation

Verwenden von SQL-Parametern

Wenn Sie eine SQL-Anweisung erstellen, können Sie SQL-Parameter erstellen, um die Anweisung mit verschiedenen Werten wiederzuverwenden. Hierdurch können Leistungsvorteile erzielt werden. Sie können generische Anweisungen vorbereiten, die die genannten Variablen verwenden, und anschließend bei Bedarf die Anweisungen durch Iterationen durch die variablen Werte ausführen. Binden Sie dabei die Werte in jeder Iteration an die entsprechenden Variablen.

Beim Verwenden der Methode executeInsert oder executeUpdate binden Sie Parameter mit dem bindParams-Parameter direkt in die Methode. bindParams verarbeitet ein Array von Objekten, wobei es sich um eine beliebige Kombination von null sowie Werten des Typs "Integer", "Long", "Boolean", "Float", "Double", "String" oder "ByteBuffers" handeln kann. Beispiel:

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();
} 

Beim Verwenden der Methode execute oder getCursor können Sie die Statement.bind-Methode verwenden, um Namen für SQL-Parameter bereitzustellen. Die bind()-Methode verwendet die Nummer des Parameters und den Wert, der mit dem Parameter verknüpft werden soll. Wenn Sie eine Zahl außerhalb des erlaubten Bereichs verwenden, wird eine DatabaseException ausgegeben. Alle Verknüpfungen können mittels Statement.reset zurückgesetzt werden.

Sie können eine der folgenden Methoden zur Nummerierung der Parameter auswählen:

  • Ein Fragezeichen (?) in der Anweisung führt dazu, dass jeder Parameter in sequenzieller Reihenfolge, beginnend mit 1, nummeriert wird.

  • Ein Fragezeichen, das von einer Ganzzahl (?NNN) in der Anweisung gefolgt wird, stellt die Zahl NNN in jeden Parameter.

Nachfolgend ein Beispiel für eine Anweisung, die Parameter verwendet, um eine obere und eine untere Zählgrenze zu erstellen, die bei jeder Ausführung der Anweisung festgelegt werden können. In diesem Beispiel werden die Parameter sequenziell gezählt.

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();

Hier ist dieselbe Anweisung, außer dass für die Parameter explizite Zahlenwerte festgelegt sind:

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();

Die Statement.getFormalName-Methode konvertiert einen Parameterindex in einen SQL-Parameternamen. Wenn getFormalName den Parameternamen zurückzugeben soll, müssen Sie einen Namen in der Abfrage bereitstellen. Wenn Sie zum Beispiel getFormalName(1) aufrufen, gibt die Anweisung "SELECT * FROM T WHERE a = :a" :a zurück. Wenn Parameter wie z. B. ein Fragezeichen (?) als Platzhalter verwendet werden, kann getFormalName() keinen Parameternamen zurückgeben. Zum Beispiel gibt getFormalName(1) nicht den Namen für den Parameter in dieser Anweisung zurück: "SELECT * FROM T WHERE a = ?"

Codebeispiel: Erstellen einer parametrisierten Update-Anweisung

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();
        }
    }
}

Codebeispiel: Erstellen einer parametrisierten Insert-Anweisung

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();
    }
}
}
Nächstes Thema: Verwenden von Pragmas

Waren diese Informationen hilfreich? Senden Sie uns Ihren Kommentar.