• 締切済み

Java(JDK1.6)のbyte配列をそのままpostgresqlに

Java(JDK1.6)のbyte配列をそのままpostgresqlに保存したいのですが上手くいかず困っております。 (詳細) DBのカラム数はかなり多く、その中の1つのデータがbyte配列データになっておりJava上で動かしているデータをそのままそっくり保存したいと思うのですが上手に動作しません。方法は(1)カラムが多いのでbyte配列以外をsql命令で保存(2)その後にbyte配列部分をResultSetを利用して追加する です。 [プログラム] 下記の場合はdataカラムにbyte配列を保存する形です。dataカラム以外のカラムにまずINSERTで保存してその後に追加でdataに保存、という形になります。細かいプログラムは全て省略しております。 ResultSet rs = null; Connection con = DriverManager.getConnection(....); Statement stmt = con.createStatement(); String sql = "INSERT INTO ~"; stmt.executeUpdate(sql); // ここでdataカラム以外にデータをDBに保存。dataカラムにはnullが入っている。 rs.close(); stmt.close(); stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); sql = "SELECT data FROM ~ WHERE id..."; // プライマリキーidを使って保存したデータを引っ張ってくる rs = stmt.executeQuery(sql); if(rs.next()){ Blob blob = rs.getBlob("data"); if(blob == null){ blob = con.createBlob(); // ※ } blob.setBytes(1,bytearray); rs.updateBlob("data",blob); rs.updateRow(); } 上記のプログラムで試したところ、次のようなエラーが発生します。 ※の部分で error=org.postgresql.util.PSQLException: Method org.postgresql.jdbc4.Jdbc4Connection.createBlob() is not yet implemented. というエラーが発生します。またcreateBlob()をしない場合は下の部分でNullPointerExceptionが発生します。 そこでエラーの内容からクラス宣言時にimplements Connectionと追加するとConnectionインターフェースのメソッド(たくさん)が自動追加されます。その中にcreateBlob()という命令もあるのですが、使い方が分かりません。 [参考にしたHP] http://idocsq.net/page/446 解決方法が分からず困っております。 Blobを使わないでもbyte配列がそのままDBに保存できれば構いません。ResultSet.updateBytesという命令もあって試してみたのですがうまくいきませんでした。 詳しい方居られましたら御助言頂けませんでしょうか。

  • Java
  • 回答数1
  • ありがとう数2

みんなの回答

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

まずは落ち着いてエラーメッセージを読んでみるとどうだろう。 o.p.u.PSQLException: Method o.p.j.Jdbc4Connection.createBlob() is not yet implemented. 訳:o.p.u.PSQLExceptionが発生しました。メソッドo.p.j.Jdbc4Connection.createBlob()は未だ実装(=作成)されていません。  つまり、PostgreSQLを開発している人たちがPostgreSQL用のJDBCドライバーも開発を(多分)しているけど、JDBC APIのcreateBlob()メソッドの中身はまだ作ってないよん。ごめんちゃい。と言っているという事だと推測される。  JavaからPostgreSQLのBlob(というかbytea列)を操作するコードは一度書いた事があるが・・・・詳しい事は忘れてしまった。少なくともjava.sql.Connection#createBlob()を使う方法では無かった。java.sql.ResultSet#getBlob()も記憶にないな。java.sql.PreparedStatement#setBlob(int, java.io.InputStream, int)、java.sql.PreparedStatement#setBinaryStream(int, java.io.InputStream, int)というのを調べてみると良いかも知れない。読み込む時はjava.sql.ResultSet#getBinaryStream(int)を使うのかも知れない。これらはかすかに記憶にある。つまり、java.sql.Blobクラスではなくストリームを介してバイト配列をやり取りする方法だ。  余談になるが、java.sql.Connectionインターフェースは「DBへの接続」を意味するインターフェースであり、質問者の言うimplements Connection云々のくだりは、createBlob()という命令を用意する(JDBCプロバイダーを作成する)側の話なので今回の件には関係ない。

関連するQ&A

  • postgresql接続時

    お世話になっています。 現在、postgresqlに接続し、指定のデータがなければ、dbを切断し、 切断中に、dbに接続されたら、エラーを発生させるようなプログラムを作成しています。 その際、org.postgresql.util.PSQLException: This ResultSet is closed.のようなエラーが発生します。 原因として、ResultSetにあるというのはわかるのですが、 ソースは、以下のように組んでいます。 static Connection con = null; static Statement stmt = null; static ResultSet rs ;; try { Class.forName("org.postgresql.Driver"); // PostgreSQLの場合 con = DriverManager.getConnection ("jdbc:postgresql:sample","moon","post"); // ステートメントオブジェクトを生成 stmt = con.createStatement(); String sql = " select id,pw from login where id='test' and pw='a'"; System.out.println(sql); // クエリーを実行して結果セットを取得 rs = stmt.executeQuery(sql); boolean ba = rs.next(); //もし、idがなければ、dbを閉じる if(ba == false) { System.out.println("rs:"+rs.next()); stmt.close(); con.close(); rs.close(); } catch (SQLException e) { } catch (ClassNotFoundException c) { } catch(Exception es) { } finally { } //この時点で、指定のid,pwが存在していないので、dbは切断中 //この状態でdbにアクセスする String sql = " select * from login"; // クエリーを実行して結果セットを取得 try { // ここから if(con !=null && stmt != null && rs !=null) { while(rs.next()) { System.out.println(rs.getString("id")); } }//ここまでが、何かがおかしい else {} } catch (SQLException e) {} この場合、どこが間違っているのでしょうか? 宜しくお願いします。

  • binaryへのbyte配列の入れ方

    私は現在データベースの勉強をしている学生です。 開発環境はJDBCを使い、SQLiteにデータを入れています。 最終的には画像データ(byte)をデータベースに中に入れようと思っているのですが、まずは手始めに数字を、binaryで宣言したデータベースの中に入れたのですが、おもうような結果が得られず困っています。 具体的にソースで説明させていただくと、 String sql1 = "create table Pointing (B binary)"; statement.executeUpdate(sql1); byte[] b = new byte[2]; b[0] = 3; b[1] = 2; String sql2 = "insert into Pointing values(" + b[0] + b[1] + )"; statement.executeUpdate(sql2); ResultSet rs2 = statement.executeQuery("select * from Pointing"); while(rs2.next()) { byte[] b2 = rs2.getBytes("B"); System.out.println("B = " + b2[0]); } この結果が51となってしまいます。 正直、入れ方や取り出し方も全部いろんなサイトから引っ張ってきたり、憶測等で書いたものなので、やり方があっているとはおもっていません。なので正しい方法を知りたく書かせていただきました。 ご回答お待ちしております。

    • ベストアンサー
    • MySQL
  • int配列をbyte配列に変換

    MIDPアプリを作成している初心者です。 Image データを一旦端末のレコードストアに保存しておく為、 getRGB()で取得したint配列を、byte配列に変換しなくてはいけません。 ↓のように レコードストアに書き込むメソッドを書いてみました。 public void writeRecordStore( String name, Image image ) {     int width = image.getWidth();     int height = image.getHeight();     int[] pxData = new int[ width*height ];     byte[] byteData;     RecordStore rs = null;     try {         //画像をバイトデータに変換         image.getRGB( pxData, 0, width, 0, 0, width, height );         //レコードストアを開く         rs = RecordStore.openRecordStore( name, true );         //バイト配列に変換 ← ここがわからない                  //レコードの追加         rs.addRecord( byteData, 0, byteData.length );              } catch( Exception e ) {     } } int配列をbyte配列に変換する方法わかる方 ご教授の程お願いします。 また、まだコーディングに自信が無いので、文法のミスもご指摘頂けたらありがたいです。

    • ベストアンサー
    • Java
  • JDBC PostgreSQLで必要なファイルはあるのでしょうか?

    LinuxでPostgreSQLのデータベースをJDBCでアクセスしたいのですが、以下のソースで次のエラーが発生します。何か必要なファイルでもあるのでしょうか? java.lang.ClassNotFoundException:org.postgres.Driver また、LinuxのODBCも必要なファイルがあるのでしょうか? import java.sql.*; class jdbcSample2 { public static void main(String argv[]) { int a; String b; try { //Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); //String url = "jdbc:odbc:test"; Class.forName ("org.postgres.Driver"); String url = "jdbc:postgresql://127.0.0.1:5432/test"; String user = ""; String password = ""; Connection con = DriverManager.getConnection(url, user, password); Statement stmt = con.createStatement (); String query = "select * from member;"; ResultSet rs = stmt.executeQuery (query); while(rs.next()){ a = rs.getInt(1); b = rs.getString(2); System.out.println(a + ", " + b); } rs.close(); stmt.close(); con.close(); } catch (SQLException ex) { System.err.println("SQL failed."); ex.printStackTrace (); } catch (Exception ex) { ex.printStackTrace (); } } }

  • mysqlへの接続が出来ません

    まずは、サンプルプログラミングをコピーして実行してみましたが、上手くいきません。 package Connection; import java.sql.*; public class DBtest { public static void main(String[] args) { //java.sql Connection con = null; Statement stmt = null; ResultSet rs = null; String sqlStr; try { //ドライバクラスをロードする Class.forName("org.gjt.mm.mysql.Driver"); //MySQLに接続 con = DriverManager.getConnection("jdbc:mysql://localhost/dbname", "8080", "password"); //ステートメント生成 stmt = con.createStatement(); //SQL文 sqlStr = "SELECT * FROM TABLE"; //SQL文実行 rs = stmt.executeQuery(sqlStr); //検索結果数だけループ while(rs.next()){ //レコードの値 int id = rs.getInt("ID"); String name = rs.getString("NAME"); //表示 System.out.println(id + ":" + name); } //クローズ rs.close(); stmt.close(); con.close(); } catch (Exception ex) { try { //クローズ if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (con != null) con.close(); } catch (Exception e) { } //エラー ex.printStackTrace(); } } } 上記はEclipseでは文法エラーはありません。で実行してみると java.sql.SQLException: Access denied for user '8080'@'localhost' (using password: YES)になります。 サンプルにはDbname、ID,Passとあるので実際のDbnameとパスワードを入れているのですが駄目です。 IDは意味が良くわからないので8080を入れてみました。 どなたか教えて下さい。お願いします。 尚、当方全くの初心者です宜しくお願い致します。

    • ベストアンサー
    • Java
  • データベースへ接続してからのデータ追加方法

    掲示板を作成しているのですが、DAOクラスの使いかたがいまいちわかりません。 public ArrayList<textbeen> findAll(){ //スレッド一覧を保持するリスト ArrayList<textbeen> list = new ArrayList<textbeen>(); Connection con = null; try{ //データベースに接続 con = createConnection(); //データベースにSQL文を送信 String sql = "select * from TEXT"; Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ String name = rs.getString("KB_NAME"); String title = rs.getString("KB_TITLE"); String mail = rs.getString("KB_MAIL"); String text = rs.getString("KB_TEXT"); String pass = rs.getString("KB_TITLE_PASS"); textbeen thread = new textbeen(name, title, mail, text, pass); //TO(Threadオブジェクト)を、保持するリストに追加 list.add(thread); } //スレッド一覧を返す。 return list; }catch(Exception e){ e.printStackTrace(); return null; }finally{ //データベースからの切断 closeConnection(con); } } public void create(textbeen emp){ Connection con = null; try{ //データベースに接続 con = createConnection(); //データベースにSQL文を送信 String sql = "insert into TEXT values(?, ?, ?, ? ,?)"; PreparedStatement stmt = con.prepareStatement(sql); stmt.setString(1, emp.getName()); stmt.setString(2, emp.getTitle()); stmt.setString(3, emp.getMail()); stmt.setString(4, emp.getText()); stmt.setString(5, emp.getPassword()); stmt.executeUpdate(); }catch(Exception e){ e.printStackTrace(); }finally{ //データベースからの切断 closeConnection(con); } } 以上のようにTextDAOクラスを作り、MVCモデルに従ってサーブレットからJSPにて追加用のページを表示したいのですが、どうすればDAOクラスのメソッドを使えるのかがわかりません。DAOクラスは入門書に書いてあったのを名前だけ変えたりして使っております。 すでにtextbeen.javaファイルにてsetName()やgetName()などは定義しております。 宜しく御願い致します。

    • ベストアンサー
    • Java
  • dbからデータをとりだす際、sqlのfetch結果をjavaでとりだす

    dbからデータをとりだす際、sqlのfetch結果をjavaでとりだすのは可能なのでしょうか? (チェックボックス 空欄) sql (チェックボックス 空欄) begin; declare cursor_name cursor for select * from user_ad; fetch forward 3 from cursor_name; //この結果をjavaでとりだしたい 注:この後、PostgreslqMyAdminで表そうとしたら、commitしたら表せない!! ふつうに、select文でとりだすなら分かるのですが。。。 con = Connectionのこと 処理ソースは、、、 必要最小限な部分だけ、記述しています。 PrepareStatement stmt = null; try { String sql = "select user_id from user_ad"; this.stmt = con.prepareStatement(sql); //ループでデータとりだし ResultSet rs = stmt.executeQuery(); while(rs.next()) { String userId = rs.getString("user_id"); } }catch(Exception e) { System.out.println(e.getMessage()); System.out.println(e.getStackTrace()); } fetchでとりだそうとすると、カーソルが関係していて、処理自体、変わってくるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • 『ClassNotFoundException: org.postgresql.Driver』というエラーが出る。

    CygwinにpostgreSQLをインストールして、JSPでデータベースを操作しようと考えています。 /usr/share/postgresql/java/postgresql.jarをCLASSPATHに追加し、以下に示すJSPを作成して実行したのですが、『java.lang.ClassNotFoundException: org.postgresql.Driver 』というエラーが出てデータベースにアクセスできません。 『$jar -xvf /usr/share/postgresql/java/postgresql.jar』を実行したところ、『org/postgresql/Driver.class』が抽出されましたので、ドライバクラスは間違ってはいないと思います。一体何が悪いのでしょうか。 <%@ page language="java" %> <%@ page contentType="text/html; charset=EUC_JP" %> <%@ page import="java.sql.*" %> <% Connection con = null; Statement stmt = null; try { Class.forName("org.postgresql.Driver"); String url = "jdbc:postgresql:(データベース名)"; con = DriverManager.getConnection(url, "(ユーザー名)", "(パスワード)"); stmt = con.createStatement(); (途中の処理) } catch(Exception e) { out.println(e); } finally { (データベースの切断処理) } postgreSQLはまだ始めたばかりですので初心者同然です。なるべく分かりやすく説明してくれると嬉しいです。 OSはWindowsXP, JSPコンテナはTomcat3.3.1を使用しています。どうぞよろしくお願い致します。

    • ベストアンサー
    • Java
  • DAOクラスの使い方

    ある書籍を参考に勉強しております。以下のDAOクラスのデータ追加に関して使い方がわかりません。 サーブレット、もしくはJSPにどのように書けば、DBにデータを追加できるようになるのでしょうか? 宜しく御願い致します。 package chap11_database.sec03; import java.sql.*; import java.util.ArrayList; public class EmployeeDAO { //データベースとの接続に必要な情報を保持するフィールド変数 private final static String DRIVER_URL ="jdbc:mysql://192.168.2.200:3306/satoh" + "?useUnicode=true&characterEncoding=utf8"; private final static String DRIVER_NAME = "com.mysql.jdbc.Driver"; private final static String USER_NAME = "root"; private final static String PASSWORD = "1qaz!QAZ"; //接続メソッド protected Connection createConnection(){ try{ Class.forName(DRIVER_NAME); Connection con = DriverManager.getConnection(DRIVER_URL, USER_NAME, PASSWORD); return con; } catch(Exception e){ e.printStackTrace(); } return null; //例外が発生した場合はnullを返す。 } //切断メソッド protected void closeConnection(Connection con){ try{ con.close(); } catch(Exception ex){ ex.printStackTrace(); } } public ArrayList<Employee> findAll(){ //社員一覧を保持するリスト ArrayList<Employee> list = new ArrayList<Employee>(); Connection con = null; try{ //データベースに接続 con = createConnection(); //データベースにSQL文を送信 String sql = "select * from employee"; Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ int id = rs.getInt("id"); String name = rs.getString("name"); String address = rs.getString("address"); int tel = rs.getInt("tel"); Date birthday = rs.getDate("birthday"); Employee employee = new Employee(id, name, address, tel, birthday); //TO(Employeeオブジェクト)を、社員一覧を保持するリス手に追加 list.add(employee); } //社員一覧を返す。 return list; }catch(Exception e){ e.printStackTrace(); return null; }finally{ //データベースからの切断 closeConnection(con); } } //社員登録メソッド public void create(Employee emp){ Connection con = null; try{ //データベースに接続 con = createConnection(); //データベースにSQL文を送信 String sql = "insert into employee values(?, ?, ?, ? ,?)"; PreparedStatement stmt = con.prepareStatement(sql); stmt.setInt(1, emp.getId()); stmt.setString(2, emp.getName()); stmt.setString(3, emp.getAddress()); stmt.setInt(4, emp.getTel()); stmt.setDate(5, emp.getBirthday()); stmt.executeUpdate(); }catch(Exception e){ e.printStackTrace(); }finally{ //データベースからの切断 closeConnection(con); } } }

    • ベストアンサー
    • Java
  • requestについて困っています。

    下記のbooleanの結果を他のサーブレットで取得して、結果ごとに"mapping.findForward("")"の処理をしたいのですが、取得の仕方が分かりません。お願い致します。 <MemberDAO.java> ・・・ public boolean isEntriedMail(String member_mail) throws SQLException{ Connection con = ds.getConnection(); PreparedStatement stmt = con.prepareStatement(ISENTRIEDSQL); ResultSet rs = null; try{ stmt.setString(1,member_mail); rs = stmt.executeQuery(); if(rs.next()){ int count = rs.getInt(1); if(count == 0){ return false; } } }catch(SQLException ex){ return true; }finally{ if(rs != null){ rs.close(); } stmt.close(); con.close(); } return true; }