DB2探検隊(2000/10/01)

 ずいぶん間が空いていろいろなことを忘れてしまったので、リハビリを兼ねてJavaで簡単な検索プログラムを作ってみました。それにしては、新規要素が多いのですが・・・

 まず、DB2のJDBCドライバをJDBC2.0対応にします。DB2インストールディレクトリ下のSQLLIB\Java12\usejdbc2.batを実行すると、必要なファイルを入れ替えてくれます。このディレクトリにinuseというファイルができればOKです(たぶん)。元に戻すときは、このディレクトリのusejdbc1.batを実行するだけです。

 プログラム作成には、JBuilderを使いました。せっかくのJDBC2.0なので、ResultSetでカーソルを逆方向に動かしてみます。で、サンプルのDB2Appl.javaを参考にしながら作ったプログラムはこんな感じ。自動生成されたコードも入っているので長いのですが、行っている処理は単純です。ポイントはcreateStatementの引数ですね。最初はScrollPaneを使わなかったので、JTextAreaに文字列をappendしていってもスクロールバーが出ず困っていましたが、[2]を見て何となくやってみたところうまくいきました。

package jdbctest;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.sql.*;

public class Frame1 extends JFrame {
  JPanel contentPane;
  JButton jButton1 = new JButton();
  JScrollPane jScrollPane1 = new JScrollPane();
  JTextArea jTextArea1 = new JTextArea();

  //フレームの構築
  public Frame1() {
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }

  //コンポーネントの初期化
  private void jbInit() throws Exception  {
    jButton1.setText("検索実行");
    jButton1.setBounds(new Rectangle(122, 14, 95, 28));
    jButton1.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {
        jButton1_actionPerformed(e);
      }
    });
    contentPane = (JPanel) this.getContentPane();
    contentPane.setLayout(null);
    this.setSize(new Dimension(400, 300));
    this.setTitle("フレーム タイトル");
    jScrollPane1.setBounds(new Rectangle(19, 52, 351, 217));
    contentPane.add(jButton1, null);
    contentPane.add(jScrollPane1, null);
    jScrollPane1.getViewport().add(jTextArea1, null);
  }

  //ウィンドウが閉じられたときに終了するようにオーバーライド
  protected void processWindowEvent(WindowEvent e) {
    super.processWindowEvent(e);
    if (e.getID() == WindowEvent.WINDOW_CLOSING) {
      System.exit(0);
    }
  }

  // 以下がDB検索処理
  void jButton1_actionPerformed(ActionEvent e) {
    Connection con = null;
    String url = "jdbc:db2:sample";

    try {
      jTextArea1.append("実行開始します\n");
      Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
      jTextArea1.append("ドライバをロードしました\n");
      con = DriverManager.getConnection(url);
      Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
      jTextArea1.append("検索を行います\n");
      ResultSet rs = stmt.executeQuery("SELECT * FROM employee");
      jTextArea1.append("検索結果を逆順に示します\n");
      if (rs.last()) {
        do {
          jTextArea1.append(" empno= " + rs.getString(1));
          jTextArea1.append(" firstname= " + rs.getString(2));
          jTextArea1.append("\n");
        } while (rs.previous());
      }
      rs.close();
      stmt.close();
      con.close();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

 このまま実行すると、ClassNotFoundExceptionが発生するので、DB2のドライバをクラスパスに追加します。最初にJDBC2.0対応にした時に新しくなったファイルのうち、SQLLIB\Java\db2ava.zipがそれのようです。JBuilderだと、プロジェクトプロパティで、必須ライブラリの追加、新規で、適当な名前を付けてこのファイルを追加するだけです。

 これで実行すれば、結果が表示されるはず。ですが、DB2のJDBC2.0ドライバは、TYPE_SCROLL_SENSITIVEにもCONCUR_UPDATABLEにも対応していないんですね。

参考文献

  1. 菊田英明, 詳説JDBC 2.0, Java Press Vol.8, pp.19-27, 技術評論社, 1999年
  2. 大村忠史, SwingによるJava GUIプログラミング, カットシステム, 1998年

[Index] [ホーム]