//********************************************************************
// SetXMLData.java
// このプログラムは、XML 形式で可記述されたデータを SQL Server 2000 に
// 登録する処理をします。
// 実行時の入力パラメタとして登録するデータが格納されているファイル名を
// 指定します。
//********************************************************************

import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
import java.text.*;
import java.sql.*;

public class SetXMLData {

	public static void main( String[] args ) throws Exception {
		// 入力パラメタがない場合メッセージを表示して終了する
		if( args[0] == null ) {
			System.out.println("読込むデータが格納されているＸＭＬファイル名を指定してください。");
			System.out.println("SetXMLData filename.xml");
			System.exit( 1 );
		}

		try {
			// JDBC−ODBCドライバの登録
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
		} catch(java.lang.ClassNotFoundException e) {
			System.err.print("ClassNotFoundException: ");
			System.err.println(e.getMessage());
		}
		try {
			// JDBC 接続オブジェクト作成（データベース名：TestDB2）
			// データを登録するデータベースへの接続オブジェクトを作成する
			Connection objCon = DriverManager.getConnection("jdbc:odbc:Test2", "sa", "sa");
			// ストアドプロシージャをコールするオブジェクトを作成
			CallableStatement objCall = objCon.prepareCall("{call InsData(?)}");
			// DOM ドキュメントオブジェクトの作成
			// 登録する XML データを読込む DOM ドキュメントのオブジェクトを作成する
			DocumentBuilder docBld = DocumentBuilderFactory.newInstance().newDocumentBuilder();
			// XML データを読込んで DOM ドキュメントを作成
			Document objDoc = docBld.parse(new File(args[0]));

			// XML データを SQL Server 2000 へ登録する処理
			String strXML = null;
			Node tmpNd = null;
			NodeList ndList = null;
			int lpCnt, maxCnt;

			// DOM ドキュメントからルートノードの子ノードリストを取得
			ndList = objDoc.getDocumentElement().getChildNodes();
			// 子ノードの個数を取得（繰返し回数）
			maxCnt = ndList.getLength();
			// 子ノードの個数分繰返す
			for (lpCnt = 0; lpCnt < maxCnt; lpCnt++) {
				// カレントノードを取出す
				tmpNd = ndList.item(lpCnt);
				// ドキュメントツリーの取出し
				strXML = tmpNd.toString();
				// 両端にスペースが有る場合スペースを除外
				strXML = strXML.trim();
				// 文字列をJISコードに変換
				String nSt = new String( strXML.getBytes( "UTF-8" ) );
				// XML宣言を作成（エンコードをUTF-8に設定）
				// この宣言を付加しないとデータベースにデータ（特に２バイトコード）が正しく登録できない
				strXML = "<?xml version=" + '"' + "1.0" + '"' + " encoding=" + '"' + "UTF-8" + '"' + "?>";
				// 登録データ作成（XML宣言とXMLデータを結合）
				strXML = strXML + nSt;
				// 登録データを入力パラメータにセット
				objCall.setString(1, strXML);
				// ストアドプロシージャを呼び出してデータの登録する
				objCall.executeUpdate();
			}
			// オブジェクトを解放する
			objCall.close();
			objCon.close();
		}
		catch (java.sql.SQLException e) {
			System.err.println("SQLException: " + e.getMessage());
		}
		catch (Exception e) {
			System.err.println("Exception: " + e.getMessage());
		}
	}
}
