Per creare questo esempio come programma di lavoro IBM® Toolbox perJava™ 2 Micro Edition, è necessario copiare il seguente file .java in un editor di testo Java, effettuare poche modifiche, quindi compilarlo.
Per copiare il codice di sorgente, utilizzare semplicemente il mouse per selezionare tutto il codice Java sottostante, quindi fare clic con il tasto destro del mouse e selezionare Copia. Per incollare il codice nell'editor, creare un documento vuoto nell'editor, fare clic con il tasto destro del mouse sul documento vuoto e selezionare Incolla. Assicurarsi di salvare il nuovo documento con il nome JdbcDemo.java.
Dopo aver creato il file .java, ritornare alle istruzioni per la creazione e l'esecuzione del programma di esempio.
//////////////////////////////////////////////////////////////////////////////////
//
// Esempio ToolboxME. Questo programma mostra in che modo l'unità
// senza fili possa collegarsi ad un server ed utilizzare JDBC per eseguire un lavoro su un
// database remoto.
//
//////////////////////////////////////////////////////////////////////////////////
import java.sql.*; // Interfacce SQL fornite da JdbcMe
import com.ibm.as400.micro.*; // implementazione JdbcMe
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.microedition.io.*; // Parte della specifica CLDC
import de.kawt.*; // Parte della specifica CLDC
class DemoConstants
{
// Queste costanti in realtà sono utilizzate principalmente dal demo
// per il programma di controllo JDBC. Gli ID del programma di creazione dell'applicazione
// Jdbc e JDBC ( http://www.palmos.com/dev )
// sono riservati all'elaborazione palm.
public static final int demoAppID = 0x4a444243; // JDBC
// Rendere dbCreator diverso in modo che
// l'utente possa effettivamente visualizzare Palm DB separatamente dalla
// applicazione JdbcDemo.
public static final int dbCreator = 0x4a444231; // JDB1
public static final int dbType = 0x4a444231; // JDB1
}
/**
* Finestra di dialogo di configurazione di piccole dimensioni per visualizzare
* le istruzioni/i collegamenti correnti,
* l'URL utilizzato, la parola d'ordine e l'id utente
*/
class ConfigurationDialog extends Dialog implements ActionListener
{
TextField data;
ConfigurationDialog(Frame w)
{
super(w, "Configuration");
// Visualizzare/Modificare collegamento URL corrente
data = new TextField(JdbcDemo.mainFrame.jdbcPanel.url);
add("Center", data);
// Pulsante Ok.
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);
}
}
/**
* Finestra di dialogo di configurazione di piccole dimensioni per visualizzare
* le istruzioni/i collegamenti correnti,
* l'URL utilizzato, la parola d'ordine e l'id utente
*/
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;
// Visualizzare/Modificare collegamento URL corrente
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);
// Pulsante Ok.
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();
}
/**
* Determinare l'azione eseguita.
**/
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
{
// Nessuna 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;
// Oggetti JDBC.
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()
{
// L'URL JDBC
// Accertarsi di modificare la riga seguente in modo che specifichi correttamente
// l'MEServer ed il server a cui ci si desidera collegare.
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"); // Query predefinita
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); // Iniziare da questo punto.
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);
}
/**
* Eseguire un'attività basata su una qualsiasi
* attività attualmente selezionata nell'elenco.
*/
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;
}
}
/**
* Eseguire l'attività di commit o rollback.
*/
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);
}
}
/**
* Richiedere all'utente di impostare il valore di autocommit
* Lavoro effettivo gestito dal metodo actionPerformed
* chiamata 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);
}
}
/**
* Richiedere all'utente di impostare il livello di isolamento.
* lavoro effettivo gestito dal metodo actionPerformed()
* chiamata 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);
}
}
/**
* Creare una nuova connessione o istruzione.
* Attualmente è supportata solo una connessione
* o istruzione.
*/
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)
{
// Ripetere... DB2 NT versione 6.1 non supporta
// serie di risultati scorribili, quindi si presume che anche
// altri database JDBC 2.0 non le supportino. Si tenterà di
// crearne un altro.
try
{
stmtObject = connObject.createStatement();
}
catch (Exception ex)
{
// Se il secondo tentativo ha dato esito negativo, emettere di nuovo la
// prima eccezione. Probabilmente si tratta
// di un errore più significativo.
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;
}
}
}
/**
* Chiudere l'istruzione e la connessione.
**/
public void goClose()
{
// Chiudere l'istruzione.
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();
}
// Chiudere il collegamento.
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;
}
/**
* visualizzare la finestra di dialogo di configurazione.
**/
public void goConfigure()
{
// Si noti che non vi è alcun supporto finestra di dialogo modello in KAWT, esso
// funziona solo poiché i dati da modificare (url) sono stati impostati prima
// che questa finestra di dialogo fosse utilizzata e l'utente non può accedere al
// frame principale mentre questo è attivo sul palm (ad es. tutte le finestre di
// dialogo in Kawt sono modali).
ConfigurationDialog dialog = new ConfigurationDialog(JdbcDemo.mainFrame);
dialog.show();
dialog = null;
}
/**
* Eseguire la query specificata.
**/
public void goExecute()
{
// Richiamare l'istruzione attualmente selezionata.
try
{
if (rs != null)
rs.close();
rs = null;
rsmd = null;
boolean results = stmtObject.execute(sql.getText());
if (results)
{
rs = stmtObject.getResultSet();
rsmd = rs.getMetaData();
// Visualizzare la prima riga
goNextRow();
}
else
{
data.removeAll();
data.add(stmtObject.getUpdateCount() + " rows updated");
data.repaint();
}
}
catch (Exception e)
{
JdbcDemo.mainFrame.exceptionFeedback(e);
}
}
/**
* Spostarsi nella riga successiva della serie di risultati.
**/
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);
}
}
/**
* Spostarsi nella riga precedente della serie di risultati.
**/
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);
}
}
/**
* Eseguire una query e memorizzare i risultati nel database unità locale
**/
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);
}
}
/**
* Eseguire una query dal database che risiede sul palmare.
**/
public void goQueryFromPalmDB()
{
try
{
if (rs != null)
{
rs.close();
rs = null;
}
rs = new JdbcMeOfflineResultSet ("JdbcResultSet",
DemoConstants.dbCreator,
DemoConstants.dbType);
rsmd = rs.getMetaData();
// Se si desidera eseguire il debug di qualche emissione, tale
// metodo può essere utilizzato per il dump del contenuto
// del PalmDB rappresentato dalla serie di risultati
// (Utilizza System.out quindi risulta particolarmente utile nella
// emulazione Palm quando si effettua il debug
// delle applicazioni.
// ((JdbcMeOfflineResultSet)rs).dumpDB(true);
// visualizzare la prima riga.
goNextRow();
}
catch (SQLException e)
{
JdbcDemo.mainFrame.exceptionFeedback(e);
}
}
}
public class JdbcDemo extends Frame
{
/** Un ActionListener che termina l'applicazione. Solo
* uno è richiesto e può essere riutilizzato
*/
private static ActionListener exitActionListener = null;
/**
* L'applicazione principale in questo processo.
*/
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;
}
/**
* Metodo principale.
**/
public static void main(String args[])
{
try
{
mainFrame = new JdbcDemo();
mainFrame.show();
mainFrame.jdbcPanel.goConfigure();
}
catch (Exception e)
{
System.exit(1);
}
}
}