<?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<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>=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<=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>