Domino の Java プログラム 講座 (初級編 エージェントからのRDBアクセス - ドミノからRDBへ - )

現在ノーツデータベースの中には、前回作成したフォームを使用して作成された文書が入っています。
今度はこれを(得意先マスターと)同じような各フィールドを持った別のファイルに転送する、ということをしてみましょう。


前回に先取り的に使用してしまいましたが、ノーツデータベースの中の文書を取得してくるためにビューを作成しました。

RDB でもよく効率のよいプログラムアクセスのためにビューを使用することがあります。AS/400的に言うと、読み込み用の論理ファイルを作成する、といったかんじです。

ビューの作成で「ビュー名」を指定してから、「検索条件の追加」をクリックします。

「検索条件」を変更して、フォームを指定します。

さらに表示するフィールドを選んでいきます。

エージェントの作成の手順は今までとまったく同じです。
「プロジェクトの編集」での jar ファイルのコピーも忘れずに実行してください。

コンパイルが成功したら、スケジュールして実行させてください。

以前ご紹介した Java 1.1で JDBC 2.0を使う でのやり方を使っています。

Java エージェントはドミノの Java VM で稼動します。こちらでも触れましたが、ドミノ R5 の Java VM は Java 1.1 です。
実は、ここのエージェントで RDB に INSERT を実行する時に、JDBC 2.0 での拡張機能である addBatch という後でまとめて INSERTステートメントを実行してくれる、という機能を使用したかったのです。

ドミノの住所のフィールドが1つなのを、住所1、住所2 に分割しなくてはならないのですが、それは前回 2つの RDB カラムをくっつけてしまっているからなので、その時のロジックの逆をやっています。

import lotus.domino.*;
import java.sql.*;
import com.ibm.db2.jdbc.app.*;

public class JavaAgent extends AgentBase {
DB2Connection con = null;
int num = 0;
Document document = null;

public void NotesMain() {

try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
Database database = agentContext.getCurrentDatabase();
View view = database.getView("All");
ViewEntryCollection viewEntryCollection = view.getAllEntries();
ViewEntry viewEntry = viewEntryCollection.getFirstEntry();

// (Your code goes here)
connectToAS400();

DB2PreparedStatement stmt = (DB2PreparedStatement) con.prepareStatement("INSERT INTO QEOL.TOKMSP2 (TKBANG, TKNAKJ, TKADR1, TKADR2, TKNURI) VALUES (?, ?, ?, ?, ?)");

while (viewEntry !=null) {
document = viewEntry.getDocument();
System.out.println("doc OK");

String text1 = document.getItemValueString("CustID");
String text2 = document.getItemValueString("CustName");
String text3 = document.getItemValueString("CustAddr");
int index = text3.indexOf(" ");
String text4 = text3.substring(0, index);
String text5 = text3.substring((index + 1), (text3.length() - index));
int number = document.getItemValueInteger("Sales");
document.recycle();

stmt.setString(1, text1);
stmt.setString(2, text2);
stmt.setString(3, text4);
stmt.setString(4, text5);
stmt.setInt(5, number);

stmt.addBatch();

num++;
System.out.println( num + " Rows has been inserted.");

viewEntry = viewEntryCollection.getNextEntry();
System.out.println("ve OK");

}
System.out.println("exit loop");

int[] updates = stmt.executeBatch();

con.commit();
System.out.println("commit");

stmt.close();
con.close();
//viewEntry.recycle();
//viewEntryCollection.recycle();
view.recycle();
database.recycle();
session.recycle();
System.out.println("All resources are freed.");

} catch(Exception e) {
e.printStackTrace();
}
}

public void connectToAS400() {
String url = "jdbc:db2://";
String system = "localhost";
String user = "USER";
String password = "PASSWORD";

try {
DriverManager.registerDriver(new com.ibm.db2.jdbc.app.DB2Driver());
System.out.println("Driver registerd.");
con = (DB2Connection) DriverManager.getConnection(url + system, user, password);
System.out.println("got connected.");
con.setAutoCommit(false);
System.out.println("Set AutoCommit Successful.");
}
catch (SQLException ex) {
System.out.println("could not get a connection.");
ex.printStackTrace();
return;
}
System.out.println("connected.");
return;
}
}

スケジュールでの実行に先立って、iSeries上の転送先になるテーブルの内容を見てみます。

中身は空です。

スケジュールされたエージェントが実行されます。

この時は INSERT を行なう度にメッセージを出すようにしておいたので、そのメッセージが出ています。最後に終了時のメッセージも確認できます。

再度、iSeries上のテーブルの内容を確認してみましょう。

先のノーツデータベースの文書と同じ内容の行が入っているのが確認できます。


より正統派的には、ちゃんとひとつずつ INSERT を行なう方法もあります。
こちらの方は、"DB2"とか"AS400JDBC"とか頭についた JDBC クラスを使用しなくてもいいですし、「プロジェクトの編集」で db2_classes.jar や jt400.jar をデータベースに追加しなくてもすみます。(その場合は、サーバーの notes.ini の JavaUserClasses= で指定します)

import lotus.domino.*;
import java.sql.*;
import com.ibm.db2.jdbc.app.*;

public class JavaAgent extends AgentBase {
DB2Connection con = null;
int num = 0;
Document document = null;

public void NotesMain() {

try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
Database database = agentContext.getCurrentDatabase();
View view = database.getView("All");
ViewEntryCollection viewEntryCollection = view.getAllEntries();
ViewEntry viewEntry = viewEntryCollection.getFirstEntry();

// (Your code goes here)
connectToAS400();

DB2PreparedStatement stmt = (DB2PreparedStatement) con.prepareStatement("INSERT INTO QEOL.TOKMSP2 (TKBANG, TKNAKJ, TKADR1, TKADR2, TKNURI) VALUES (?, ?, ?, ?, ?)");

while (viewEntry !=null) {
document = viewEntry.getDocument();
System.out.println("doc OK");

String text1 = document.getItemValueString("CustID");
String text2 = document.getItemValueString("CustName");
String text3 = document.getItemValueString("CustAddr");
int index = text3.indexOf(" ");
String text4 = text3.substring(0, index);
String text5 = text3.substring((index + 1), (text3.length() - index));
int number = document.getItemValueInteger("Sales");
document.recycle();

stmt.setString(1, text1);
stmt.setString(2, text2);
stmt.setString(3, text4);
stmt.setString(4, text5);
stmt.setInt(5, number);

int updateCounts = stmt.executeUpdate();

num = num + updateCounts;
System.out.println( num + " Rows has been inserted.");

viewEntry = viewEntryCollection.getNextEntry();
System.out.println("ve OK");

}
System.out.println("exit loop");
con.commit();
System.out.println("commit");

stmt.close();
con.close();
view.recycle();
database.recycle();
session.recycle();
System.out.println("All resources are freed.");

} catch(Exception e) {
e.printStackTrace();
}
}

public void connectToAS400() {
String url = "jdbc:db2://";
String system = "localhost";
String user = "USER";
String password = "PASSWORD";

try {
DriverManager.registerDriver(new com.ibm.db2.jdbc.app.DB2Driver());
System.out.println("Driver registerd.");
con = (DB2Connection) DriverManager.getConnection(url + system, user, password);
System.out.println("got connected.");
con.setAutoCommit(false);
System.out.println("Set AutoCommit Successful.");
}
catch (SQLException ex) {
System.out.println("could not get a connection.");
ex.printStackTrace();
return;
}
System.out.println("connected.");
return;
}
}

[Top Pageに戻る]

Ads by TOK2