ページの先頭行へ戻る
Symfoware Server V12.1.x アプリケーション開発ガイド(JDBCドライバ編)
FUJITSU Software

A.8 BLOB型の列に対する操作を行う

BLOB型の列に対する操作を行うプログラム例について説明します。
以下のサンプルアプリケーションでは、ネーミングサービスを起動しているホスト名に、“myhost”を指定しています。サンプルアプリケーションを実行する環境に合わせて、ホスト名の値を修正してください。
また、“OrgData.txt”というファイルのデータをデータベースに追加しています。サンプルアプリケーション実行時に、サンプルアプリケーションのclassファイルと同じフォルダ内に“OrgData.txt”を格納してください。“OrgData.txt”の内容については、以下を参照してください。

サンプルデータ“OrgData.txt”の内容
TESTDATA

BLOB型の列に対する操作を行うプログラム例
import java.util.*;
import java.sql.*;
import javax.sql.*;
import java.io.*;
import javax.naming.*;

public class MyBlobAccess
{
    public static void main(String args[])
    {
        try
        {
            // JNDI環境を指定します。
            Hashtable env = new Hashtable();
            env.put(Context.INITIAL_CONTEXT_FACTORY,"com.fujitsu.symfoware.jdbc2.jndisp.SYMContextFactory");
            env.put(Context.PROVIDER_URL,"SYM://myhost:26600");
            InitialContext ctx = new InitialContext(env);

            // JDBCデータソースを取得します。
            DataSource ds = (DataSource)ctx.lookup("jdbc/ds1");

            // データベースと接続します。
            Connection con = ds.getConnection();

            // 自動コミットモードの無効化
            con.setAutoCommit(false);

            // データ削除
            Statement stmt = con.createStatement();
            stmt.executeUpdate("DELETE FROM GENERAL.BLOBTBL");
            stmt.close();

            // INSERT文を準備
            PreparedStatement pstmt =
            con.prepareStatement("INSERT INTO GENERAL.BLOBTBL VALUES(1, ?)");

            // BLOBデータを設定
            FileInputStream oFIS = new FileInputStream("OrgData.txt");
            pstmt.setBinaryStream(1, oFIS, oFIS.available());

            // INSERT文を実行
            pstmt.executeUpdate();
            pstmt.close();
            oFIS.close();

            con.commit();

            // ResultSetインタフェースのオブジェクトを生成
            Statement stmt2 = con.createStatement();
            ResultSet rs =
                    stmt2.executeQuery("SELECT A_BLOB FROM GENERAL.BLOBTBL");

            // データベースのデータを参照
            while (rs.next())
            {
                InputStream oIS  = rs.getBinaryStream(1);

                // 出力先ファイルを指定
                FileOutputStream oFOS = new FileOutputStream("AftData.txt");

                //ストリームからデータをbyte配列で一括に読み込み
                byte[] bTmp = new byte[oIS.available()];
                oIS.read(bTmp);
                // 出力先ファイルにデータを印字
                oFOS.write(bTmp);

                oFOS.close();
                oIS.close();

            }

            // 解放処理
            rs.close();
            stmt2.close();

            // ResultSetインタフェースのオブジェクトを生成
            Statement stmt3 = con.createStatement();
            ResultSet rs2 =
                    stmt3.executeQuery("SELECT A_BLOB FROM GENERAL.BLOBTBL");

            // データベースのデータを参照
            while (rs2.next())
            {
                InputStream oIS  = rs2.getBinaryStream(1);

                // 出力先ファイルを指定
                FileOutputStream oFOS = new FileOutputStream("AftData2.txt");

                //ストリームからデータを1バイトずつ-1が返却されるまで読込み
                int iBData=0;
                while ((iBData=oIS.read()) != -1)
                {
                // 出力先ファイルにデータを1バイトずつ印字
                oFOS.write(iBData);
                }

                oFOS.close();
                oIS.close();

            }

            // 解放処理
            rs2.close();
            stmt3.close();


            con.commit();
            con.close();

        }

        // SQLExceptionが発生した場合の処理を記述します。
        catch (SQLException e)
        {
            // エラー情報を出力します。
            System.out.println("ERROR MESSAGE : " + e.getMessage());
            System.out.println("SQLSTATE     : " + e.getSQLState());
            System.out.println("ERROR CODE    : " + e.getErrorCode());
            e.printStackTrace();
        }

        // その他のExceptionが発生した場合の処理を記述します。

        catch (Exception e)
        {
            // スタックトレースを出力します。
            System.out.println("ERROR MESSAGE : " + e.getMessage());
            e.printStackTrace();
        }

    }
}