[pgsql-jp: 26830] jdbc-odbc経由のlo型データ登録

Hiroyuki Yamada hiroyuki @ rh.is.hitachizosen.co.jp
2002年 7月 26日 (金) 12:00:07 JST


山田@京都です。
 みなさんこんにちは。
PostgreSQLへラージオブジェクト(1MB位のテキストファイル)を転送、検索するシ
ステムを作っているのですが、(訳が在って、Javaから「jdbc-odbcブリッジ+
PostgreSQLの日本語ODBCドライバ」経由でラージオブジェクト(Contribディレクトリ
内の
lo型のもの)を使用)、テキストファイルのDB書き込みがうまく行きません。
oid番号は、lo型フィールドに書き込まれるのですが(その他のフィールド項目は、
ちゃんと格納されている)、
肝心のデータがテーブルに転送されないようです。

テーブル検索時に 
java.io.IOException: Coudnt open large object for reading.;
ERROR: inv_open: large object 4294967295 not found
と言うエラーメッセージが出てしまいます。
(データ本体が転送されていないので当たり前かとは、思いますが。)

Window98上での「ODBCデータソース」において、何か設定する項目などがあるので
しょうか?
ご教授の程、よろしくお願いします。

(動作環境)
(1)DBサーバ
 PostgreSQL7.2.1
 RedHatLinux7.2
(2)クライアント
 Windows98 se 4.10.2222 A
 "psqlodbc-jp-20010713-bin.zip"をインストール
 "psqlodbc_mb.zip"の中の"psqlodbc.dll"を上書きコピー

<やったこと>
README.loにあるように
$cd /.../Contrib/lo
$make install
$psql -f lo.sql test_database

<テーブル定義>
create table image (
   no             serial primary key,
   img_name   text,
   nichiji        timestamp,
   img_oid      lo,
   price1       text,
   price2       text,
   price3       text,
   price4       text
);

<lo型フィールドへのデータ書き込みソース(抜粋)>
oid型の場合と同じです。

      Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );

      String url      = "jdbc:odbc:PostgreSQL";
      Connection conn = DriverManager.getConnection( url );
      Statement stmt = conn.createStatement();
      conn.setAutoCommit( false );

      int number_of_line = Integer.parseInt( "1000" );

      PreparedStatement pstmt = conn.prepareStatement( "insert into
text_image_jdbc_odbc_tb ("+
                                                       "img_name, nichiji,
img_oid,"+
                                                       "price1,  price2,
price3,  price4 ) "+
                                                       "values
(?,?,?,?,?,?,?)" );
      pstmt.clearParameters();

      for( int i = 0; i < number_of_line; i++ ){
        File file_txt = new File( "test.txt" );   //1MB位のテキストファイル
        int fileLength_txt = (int)file_txt.length();
        FileInputStream fis_txt = new FileInputStream( file_txt );

        ttt = "2000-01-01 10:12:14";
        pstmt.setString( 1, "aaa"+i );  //img_name
        pstmt.setString( 2, ttt );         //nichiji
        pstmt.setAsciiStream( 3, fis_txt, fileLength_txt );     //img_oid
        pstmt.setDouble(  4, i ); pstmt.setDouble(  5, i );
tmt.setDouble(  6, i ); pstmt.setDouble(  7, i );

        pstmt.executeUpdate();
        fis_txt.close();
      }
      conn.commit();
      stmt.close();
      pstmt.close();
      conn.close();
    } catch( SQLException e ){
      e.printStackTrace();
    } catch( Exception e ){
      e.printStackTrace();
    }






pgsql-jp メーリングリストの案内