<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en-us" xml:lang="en-us">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="security" content="public" />
<meta name="Robots" content="index,follow" />
<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
<meta name="DC.Type" content="reference" />
<meta name="DC.Title" content="ToolboxME for iSeries example: JdbcDemo.java" />
<meta name="abstract" content="To create this example as a working ToolboxME for iSeries program, you need to copy the following .java file into a text or Java editor, make a few changes, then compile it." />
<meta name="description" content="To create this example as a working ToolboxME for iSeries program, you need to copy the following .java file into a text or Java editor, make a few changes, then compile it." />
<meta name="DC.Relation" scheme="URI" content="microfirstprog.htm" />
<meta name="copyright" content="(C) Copyright IBM Corporation 2006" />
<meta name="DC.Rights.Owner" content="(C) Copyright IBM Corporation 2006" />
<meta name="DC.Format" content="XHTML" />
<meta name="DC.Identifier" content="microfirstprogcode" />
<meta name="DC.Language" content="en-us" />
<!-- All rights reserved. Licensed Materials Property of IBM -->
<!-- US Government Users Restricted Rights -->
<!-- Use, duplication or disclosure restricted by -->
<!-- GSA ADP Schedule Contract with IBM Corp. -->
<link rel="stylesheet" type="text/css" href="./ibmdita.css" />
<link rel="stylesheet" type="text/css" href="./ic.css" />
<title>ToolboxME for iSeries example: JdbcDemo.java</title>
</head>
<body id="microfirstprogcode"><a name="microfirstprogcode"><!-- --></a>
<!-- Java sync-link --><script language="Javascript" src="../rzahg/synch.js" type="text/javascript"></script>
<h1 class="topictitle1">ToolboxME for iSeries example: JdbcDemo.java</h1>
<div><p>To create this example as a working ToolboxME for iSeries™ program,
you need  to copy the following .java file into a text or Java™ editor,
make a few changes,  then compile it.</p>
<div class="section"><p>To copy the source code, simply use your mouse to select all the Java code
 below, then right-click and select <strong>Copy</strong>. To paste the code  into your
editor, create a blank document in the editor, right-click the blank document
and select <strong>Paste</strong>. Make sure to save the new  document with the name
JdbcDemo.java.</p>
<p>After you create the .java file, return to the  <a href="microfirstprog.htm#microfirstprog__createprogram">instructions for creating
and running the example program</a>.</p>
<div class="note"><span class="notetitle">Note:</span>  Read the <a href="codedisclaimer.htm#codedisclaimer">Code
example disclaimer</a> for important legal information.</div>
<pre>//////////////////////////////////////////////////////////////////////////////////
//
// ToolboxME for iSeries example. This program demonstrates how your wireless
// device can connect to an iSeries server and use JDBC to perform work on a
// remote database.
//
//////////////////////////////////////////////////////////////////////////////////

import java.sql.*;               // SQL Interfaces provided by JdbcMe
import com.ibm.as400.micro.*;    // JdbcMe implementation
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.microedition.io.*;  // Part of the CLDC specification
import de.kawt.*;                // Part of the CLDC specification

class DemoConstants
{
    // These constants are actually used mainly by the demo
    // for the JDBC driver. The Jdbc and JDBC  application
    // creator IDs ( http://www.palmos.com/dev )
    // are reserved at palm computing.
    public static final int demoAppID    = 0x4a444243; // JDBC
    // Make the dbCreator something else so that the
    // user can actually see the Palm DB seperately from
    // the JdbcDemo application.
    public static final int dbCreator    = 0x4a444231; // JDB1
    public static final int dbType       = 0x4a444231; // JDB1
}

/**
 * Little configuration dialog box to display the
 * current connections/statements, the
 * URL being used, user id and password
 */
class ConfigurationDialog extends Dialog implements ActionListener
{
    TextField         data;
    ConfigurationDialog(Frame w)
    {
        super(w, "Configuration");

        // Show/Modify current URL connection
        data = new TextField(JdbcDemo.mainFrame.jdbcPanel.url);
        add("Center", data);

        // Ok button.
        Panel panel = new Panel();
        Button button = new Button("Ok");
        button.addActionListener(this);
        panel.add(button);
        add("South", panel);
        pack();
    }

    public void actionPerformed(ActionEvent e)
    {
        JdbcDemo.mainFrame.jdbcPanel.url = data.getText();
        data = null;
        setVisible(false);
    }
}

/**
 * Little configuration dialog box to display the
 * current connections/statements, the
 * URL being used, user id and password
 */
class MultiChoiceDialog extends Dialog implements ActionListener
{
    Choice            task;
    ActionListener    theListener;
    MultiChoiceDialog(Frame w, String title, String prompt, String choices[], ActionListener it)
    {
        super(w, title);
        theListener = it;

        // Show/Modify current URL connection
        Label txt = new Label(prompt);
        add("West", txt);
        task = new Choice();
        for (int i=0; i&lt;choices.length; ++i)
        {
            task.add(choices[i]);
        }
        task.select(0);
        add("Center", task);

        // Ok button.
        Panel panel = new Panel();
        Button button = new Button("Ok");
        button.addActionListener(this);
        panel.add(button);
        button = new Button("Cancel");
        button.addActionListener(this);
        panel.add(button);
        add("South", panel);
        pack();
    }

    /**
     *  Determine the action performed.
     **/
    public void actionPerformed(ActionEvent e)
    {
        int choice = task.getSelectedIndex();
        setVisible(false);
        if (e.getActionCommand().equals("Ok"))
        {
            if (theListener != null)
            {
                ActionEvent ev = new ActionEvent(this, 
                                                 ActionEvent.ACTION_PERFORMED,
                                                 task.getItem(choice));
                theListener.actionPerformed(ev);
            }
            task = null;
        }
        else
        {
            // No-op
        }
    }
}

/**
 * The JdbcPanel is the main panel of the application.
 * It displays the current connection and statement
 * at the top.
 * A text field for entering SQL statements next.
 * A Results field for displaying each column of data
 * or results.
 * An task list and a 'go' button so that different
 * tasks can be tried.
 */
class JdbcPanel extends Panel implements ActionListener
{
    public final static int TASK_EXIT         =  0;
    public final static int TASK_NEW          =  1;
    public final static int TASK_CLOSE        =  2;
    public final static int TASK_EXECUTE      =  3;
    public final static int TASK_PREV         =  4;
    public final static int TASK_NEXT         =  5;
    public final static int TASK_CONFIG       =  6;
    public final static int TASK_TOPALMDB     =  7;
    public final static int TASK_FROMPALMDB   =  8;
    public final static int TASK_SETAUTOCOMMIT=  9;
    public final static int TASK_SETISOLATION = 10;
    public final static int TASK_COMMIT       = 11;
    public final static int TASK_ROLLBACK     = 12;


    // JDBC objects.
    java.sql.Connection  connObject  = null;
    Statement            stmtObject  = null;
    ResultSet            rs          = null;
    ResultSetMetaData    rsmd        = null;

    String        lastErr     = null;
    String        url         = null;
    Label         connection  = null;
    Label         statement   = null;
    TextField     sql         = null;
    List          data        = null;
    final Choice  task;

    /**
     * Build the GUI.
     */
    public JdbcPanel()
    {
        // The JDBC URL
        // Make sure to edit the following line so that it correctly specifies the 
        // the MEServer and the iSeries server to which you want to connect.
        url = "jdbc:as400://mySystem;user=myUidl;password=myPwd;meserver=myMEServer;";

        Panel    p1left = new Panel();
        p1left.setLayout(new BorderLayout());
        connection = new Label("None");
        p1left.add("West", new Label("Conn:"));
        p1left.add("Center", connection);

        Panel    p1right = new Panel();
        p1right.setLayout(new BorderLayout());
        statement = new Label("None");
        p1right.add("West", new Label("Stmt:"));
        p1right.add("Center", statement);

        Panel    p1 = new Panel();
        p1.setLayout(new GridLayout(1,2));
        p1.add(p1left);
        p1.add(p1right);

        Panel    p2 = new Panel();
        p2.setLayout(new BorderLayout());
        p2.add("North", new Label("Sql:"));
        sql = new TextField(25);
        sql.setText("select * from QIWS.QCUSTCDT"); // Default query
        p2.add("Center", sql);

        Panel    p3 = new Panel();
        p3.setLayout(new BorderLayout());
        data = new List();
        data.add("No Results");
        p3.add("North", new Label("Results:"));
        p3.add("Center", data);

        Panel    p4 = new Panel();

        task = new Choice();
        task.add("Exit");             // TASK_EXIT
        task.add("New");              // TASK_NEW
        task.add("Close");            // TASK_CLOSE
        task.add("Execute");          // TASK_EXECUTE
        task.add("Prev");             // TASK_PREV
        task.add("Next");             // TASK_NEXT
        task.add("Config");           // TASK_CONFIGURE
        task.add("RS to PalmDB");     // TASK_TOPALMDB
        task.add("Query PalmDB");     // TASK_FROMPALMDB
        task.add("Set AutoCommit");   // TASK_SETAUTOCOMMIT
        task.add("Set Isolation");    // TASK_SETISOLATION
        task.add("Commit");           // TASK_COMMIT
        task.add("Rollback");         // TASK_ROLLBACK
        task.select(TASK_EXECUTE);    // Start off here.
        p4.add("West", task);

        Button b = new Button("Go");
        b.addActionListener(this);
        p4.add("East", b);

        Panel prest = new Panel();
        prest.setLayout(new BorderLayout());
        prest.add("North", p2);
        prest.add("Center", p3);
        Panel pall = new Panel();
        pall.setLayout(new BorderLayout());
        pall.add("North", p1);
        pall.add("Center", prest);

        setLayout(new BorderLayout());
        add("Center", pall);
        add("South", p4);
    }

    /**
     * Do a task based on whichever task is
     * currently selected in the task list.
     */
    public void actionPerformed(ActionEvent e)
    {
        if (e.getSource() instanceof MultiChoiceDialog)
        {
            String   cmd = e.getActionCommand();
            processExtendedCommand(cmd);
            return;
        }

        switch (task.getSelectedIndex())
        {
        case TASK_EXIT:
            System.exit(0);
            break;
        case TASK_NEW:
            JdbcPanel.this.goNewItems();
            break;
        case TASK_PREV:
            JdbcPanel.this.goPrevRow();
            break;
        case TASK_NEXT:
            JdbcPanel.this.goNextRow();
            break;
        case TASK_EXECUTE:
            if (connObject == null || stmtObject == null)
                JdbcPanel.this.goNewItems();

            JdbcPanel.this.goExecute();
            break;
        case TASK_CONFIG:
            JdbcPanel.this.goConfigure();
            break;
        case TASK_CLOSE:
            JdbcPanel.this.goClose();
            break;
        case TASK_TOPALMDB:
            if (connObject == null || stmtObject == null)
                JdbcPanel.this.goNewItems();

            JdbcPanel.this.goResultsToPalmDB();
            break;
        case TASK_FROMPALMDB:
            JdbcPanel.this.goQueryFromPalmDB();
            break;
        case TASK_SETAUTOCOMMIT:
            JdbcPanel.this.goSetAutocommit();
            break;
        case TASK_SETISOLATION:
            JdbcPanel.this.goSetIsolation();
            break;
        case TASK_COMMIT:
            JdbcPanel.this.goTransact(true);
            break;
        case TASK_ROLLBACK:
            JdbcPanel.this.goTransact(false);
            break;

        default : 
        {
                Dialog dialog = new FeedbackDialog(JdbcDemo.mainFrame, "Error", "Task not implemented");
                dialog.show();
                dialog = null;
            }
        }
    }

    public void processExtendedCommand(String cmd)
    {
        try
        {
            if (cmd.equals("true"))
            {
                connObject.setAutoCommit(true);
                return;
            }
            if (cmd.equals("false"))
            {
                connObject.setAutoCommit(false);
                return;
            }
            if (cmd.equals("read uncommitted"))
            {
                connObject.setTransactionIsolation(java.sql.Connection.TRANSACTION_READ_UNCOMMITTED);
                return;
            }
            if (cmd.equals("read committed"))
            {
                connObject.setTransactionIsolation(java.sql.Connection.TRANSACTION_READ_COMMITTED);
                return;
            }
            if (cmd.equals("repeatable read"))
            {
                connObject.setTransactionIsolation(java.sql.Connection.TRANSACTION_REPEATABLE_READ);
                return;
            }
            if (cmd.equals("serializable"))
            {
                connObject.setTransactionIsolation(java.sql.Connection.TRANSACTION_SERIALIZABLE);
                return;
            }
            throw new IllegalArgumentException("Invalid command: " + cmd);
        }
        catch (Exception e)
        {
            JdbcDemo.mainFrame.exceptionFeedback(e);
            return;
        }
    }

    /**
     * Perform commit or rollback processing.
     */
    public void goTransact(boolean commit)
    {
        if (connObject == null)
        {
            FeedbackDialog dialog = new FeedbackDialog(JdbcDemo.mainFrame,
                                                       "Skip",
                                                       "Connection not allocated");
            dialog.show();
            dialog = null;
            return;
        }
        try
        {
            if (commit)
                connObject.commit();
            else
                connObject.rollback();
        }
        catch (Exception e)
        {
            JdbcDemo.mainFrame.exceptionFeedback(e);
        }
    }

    /**
     * Prompt the user for setting the autocommit value
     * Real work handled by the actionPerformed method
     * calling processExtendedCommand().
     */
    public void goSetAutocommit()
    {
        if (connObject == null)
        {
            FeedbackDialog dialog = new FeedbackDialog(JdbcDemo.mainFrame,
                                                       "Skip",
                                                       "Connection not allocated");
            dialog.show();
            dialog = null;
            return;
        }
        try
        {
            String currentValue;
            if (connObject.getAutoCommit())
                currentValue = "Now: true";
            else
                currentValue = "Now: false";

            Dialog dialog = new MultiChoiceDialog(JdbcDemo.mainFrame,
                                                  "Set Autocommit",
                                                  currentValue,
                                                  new String[]{ "true", "false"},
                                                  this);
            dialog.show();
            dialog = null;
        }
        catch (Exception e)
        {
            JdbcDemo.mainFrame.exceptionFeedback(e);
        }
    }

    /**
     * Prompt the user for setting the isolation level,
     * real work handled by the actionPerformed() method
     * calling processExtendedCommand().
     */
    public void goSetIsolation()
    {
        if (connObject == null)
        {
            FeedbackDialog dialog = new FeedbackDialog(JdbcDemo.mainFrame,
                                                       "Skip",
                                                       "Connection not allocated");
            dialog.show();
            dialog = null;
            return;
        }
        try
        {
            int   level = connObject.getTransactionIsolation();
            String currentLevel;
            switch (level)
            {
            case java.sql.Connection.TRANSACTION_READ_UNCOMMITTED:
                currentLevel = "Now: read uncommitted";
                break;
            case java.sql.Connection.TRANSACTION_READ_COMMITTED:
                currentLevel = "Now: read committed";
                break;
            case java.sql.Connection.TRANSACTION_REPEATABLE_READ:
                currentLevel = "Now: repeatable read";
                break;
            case java.sql.Connection.TRANSACTION_SERIALIZABLE:
                currentLevel = "Now: serializable";
                break;
            default : {
                    currentLevel = "error";
                }
            }
            Dialog dialog = new MultiChoiceDialog(JdbcDemo.mainFrame, 
                                                  "Set Isolation Level", 
                                                  currentLevel, 
                                                  new String[]{ "read uncommitted",
                                                                "read committed",
                                                                "repeatable read",
                                                                "serializable"}, 
                                                  this);
            dialog.show();
            dialog = null;
        }
        catch (Exception e)
        {
            JdbcDemo.mainFrame.exceptionFeedback(e);
        }
    }

    /**
     * Create a new connection or statement.
     * Only one connection and statement is currently
     * supported.
     */
    public void goNewItems()
    {
        if (connObject != null || stmtObject != null)
        {
            FeedbackDialog dialog = new FeedbackDialog(JdbcDemo.mainFrame,
                                                       "Skip",
                                                       "Conn/Stmt already allocated");
            dialog.show();
            dialog = null;
        }
        if (connObject == null)
        {
            try
            {
                connObject = DriverManager.getConnection(url);
                //connection.setText(Integer.toString(((JdbcMeConnection)connObject).getId()));
                connection.repaint();
            }
            catch (Exception e)
            {
                JdbcDemo.mainFrame.exceptionFeedback(e);
                return;
            }
        }
        if (stmtObject == null)
        {
            try
            {
                try
                {
                    stmtObject = connObject.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                                                            ResultSet.CONCUR_READ_ONLY);
                }
                catch (Exception e)
                {
                    // Try again...  DB2 NT version 6.1 doesn't support
                    // Scollable result sets, so we'll assume other
                    // JDBC 2.0 databases don't either. We'll attempt
                    // to create another.
                    try
                    {
                        stmtObject = connObject.createStatement();
                    }
                    catch (Exception ex)
                    {
                        // If the second try failed, rethrow the
                        // first exception. Its probably
                        // a more meaninful error.
                        throw e;
                    }
                    FeedbackDialog dialog = new FeedbackDialog(JdbcDemo.mainFrame,
                                                               "2nd try worked",
                                                               "Non-scrollable result set");
                    dialog.show();
                    dialog = null;
                }
                
                statement.repaint();
            }
            catch (Exception e)
            {
                JdbcDemo.mainFrame.exceptionFeedback(e);
                return;
            }
        }
    }


    /**
     *  Close the statement and connection.
     **/
    public void goClose()
    {
        // Close the statement.
        if (stmtObject != null)
        {
            if (rs != null)
            {
                try
                {
                    rs.close();
                }
                catch (Exception e)
                {
                }
                rs = null;
                rsmd = null;
            }
            try
            {
                stmtObject.close();
            }
            catch (Exception e)
            {
            }
            stmtObject = null;
            statement.setText("None");
            statement.repaint();
        }

        // Clost the connection.
        if (connObject != null)
        {
            try
            {
                connObject.close();
            }
            catch (Exception e)
            {
            }
            connObject = null;
            connection.setText("None");
            connection.repaint();
        }
        data.removeAll();
        data.add("No Results");
        data.repaint();
        sql.repaint();
        return;
    }

    /**
     * display the configuration dialog.
     **/
    public void goConfigure()
    {
        // Note there is no model dialog support in KAWT, this only
        // works because the data to be changed (url) is set before
        // this dialog is used, and the user cannot access the
        // main frame while this is up on the palm (i.e. all dialogs
        // in Kawt are modal).
        ConfigurationDialog dialog = new ConfigurationDialog(JdbcDemo.mainFrame); 
        dialog.show();
        dialog = null;
    }

    /**
     *  Execute the specified query.
     **/
    public void goExecute()
    {
        // Get the currently selected statement.
        try
        {
            if (rs != null)
                rs.close();

            rs = null;
            rsmd = null;
            boolean results = stmtObject.execute(sql.getText());
            if (results)
            {
                rs = stmtObject.getResultSet();
                rsmd = rs.getMetaData();
                // Show the first row
                goNextRow();
            }
            else
            {
                data.removeAll();
                data.add(stmtObject.getUpdateCount() + " rows updated");
                data.repaint();
            }
        }
        catch (Exception e)
        {
            JdbcDemo.mainFrame.exceptionFeedback(e);
        }
    }


    /**
     *  Move to the next row in the result set.
     **/
    public void goNextRow()
    {
        try
        {
            if (rs == null || rsmd == null)
                return;

            int   count = rsmd.getColumnCount();
            int   i;
            data.removeAll();
            if (!rs.next())
                data.add("End of data");
            else
            {
                for (i=1; i&gt;=count; ++i)
                {
                    data.add(rs.getString(i));
                }
            }
            data.repaint();
        }
        catch (Exception e)
        {
            JdbcDemo.mainFrame.exceptionFeedback(e);
        }
    }


    /** 
     *  Move to the previous row in the result set.
     **/
    public void goPrevRow()
    {
        try
        {
            if (rs == null || rsmd == null)
                return;

            int   count = rsmd.getColumnCount();
            int   i;
            data.removeAll();
            if (!rs.previous())
                data.add("Start of data");
            else
            {
                for (i=1; i&lt;=count; ++i)
                {
                    data.add(rs.getString(i));
                }
            }
            data.repaint();
        }
        catch (Exception e)
        {
            JdbcDemo.mainFrame.exceptionFeedback(e);
        }
    }

    /**
     *  Perform a query and store the results in the local devices database
     **/
    public void goResultsToPalmDB()
    {
        try
        {
            if (stmtObject == null)
            {
                FeedbackDialog dialog = new FeedbackDialog(JdbcDemo.mainFrame, "Skip", "No Statement");
                dialog.show();
                dialog = null;
                return;
            }

            boolean results =
               ((JdbcMeStatement)stmtObject).executeToOfflineData(sql.getText(),
                                                                  "JdbcResultSet",
                                                                  DemoConstants.dbCreator,
                                                                  DemoConstants.dbType);
            if (!results)
            {
                FeedbackDialog dialog = new FeedbackDialog(JdbcDemo.mainFrame, "No Data", "Not a query");
                dialog.show();
                dialog = null;
                return;
            }
            data.removeAll();
            data.add("Updated Palm DB 'JdbcResultSet'");
            data.repaint();
        }
        catch (Exception e)
        {
            JdbcDemo.mainFrame.exceptionFeedback(e);
        }
    }


    /**
     *  Perform a query from the database that resides on the palm device.
     **/
    public void goQueryFromPalmDB()
    {
        try
        {
            if (rs != null)
            {
                rs.close();
                rs = null;
            }
            rs = new JdbcMeOfflineResultSet ("JdbcResultSet",
                                             DemoConstants.dbCreator,
                                             DemoConstants.dbType);
            rsmd = rs.getMetaData();
            // If we want to debug some output, this
            // method can be used to dump the contents
            // of the PalmDB represented by the result set
            // (Uses System.out so its mostly useful in
            // the Palm emulator when debugging your
            // applications.
            // ((JdbcMeOfflineResultSet)rs).dumpDB(true);

            // show the first row.
            goNextRow();
        }
        catch (SQLException e)
        {
            JdbcDemo.mainFrame.exceptionFeedback(e);
        }
    }
}

public class JdbcDemo extends Frame
{
    /** An ActionListener that ends the application. Only
     * one is required, and can be reused
     */
    private static ActionListener    exitActionListener = null;
    /**
     * The main application in this process.
     */
    static         JdbcDemo mainFrame = null;

    JdbcPanel      jdbcPanel = null;

    public static ActionListener getExitActionListener()
    {
        if (exitActionListener == null)
        {
            exitActionListener = new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    System.exit(0);
                }
            };
        }
        return exitActionListener;
    }

    /**
     *  Demo Constructor
     **/
    public JdbcDemo()
    {
        super("Jdbc Demo");
        setLayout(new BorderLayout());

        jdbcPanel = new JdbcPanel();
        add("Center", jdbcPanel);

        addWindowListener(new WindowAdapter()
         {
             public void windowClosing(WindowEvent e)
             {
                 System.exit(0);
             }
         });
        setSize(200,300);
        pack();
    }

    public void exceptionFeedback(Exception e)
    {
        Dialog dialog = new FeedbackDialog(JdbcDemo.mainFrame, e);
        dialog.show();
        dialog = null;
    }

    /**
     * Main method.
     **/
    public static void main(String args[])
    {
        try
        {
            mainFrame = new JdbcDemo();
            mainFrame.show();
            mainFrame.jdbcPanel.goConfigure();
        }
        catch (Exception e)
        {
            System.exit(1);
        }
    }
}</pre>
</div>
</div>
<div>
<div class="familylinks">
<div class="parentlink"><strong>Parent topic:</strong> <a href="microfirstprog.htm" title="This information will enable you to edit, compile, and run the example ToolboxME for iSeries program.">Creating and running a ToolboxME for iSeries program</a></div>
</div>
</div>
</body>
</html>