[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 メーリングリストの案内