0

私はpostgres PostgreSQL 9.1を使用しており、列バイトデータ型のテーブルを持っています。画像を挿入しようとすると、画像をテーブルに挿入できます。テーブルのスキーマは次のとおりです。

 CREATE TABLE emp
(
  uname character varying(100) NOT NULL,
  pass character varying(100) NOT NULL,
  name character varying(100) NOT NULL,
  dob date,
  country character varying(20),
  region character varying(20),
  description character varying(3000),
  role character varying(100),
  photo bytea,
  CONSTRAINT emp_pkey PRIMARY KEY (uname )
 )
WITH (
  OIDS=FALSE
 );
ALTER TABLE emp
  OWNER TO postgres;

サンプル Java コードは次のとおりです。

package com.q4;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.sql.*;

public class DataTest {
   public void insert() throws Exception
   {
       Connection c = ConnectionHelper.getConnection();
       FileInputStream fis = new FileInputStream("C:\\pics\\viticcio.jpg");
        int counter = 0;


       String sql ="insert into emp(uname, pass,name,photo) values (?,?,?,?)";
       PreparedStatement pstmt = c.prepareStatement(sql);
       pstmt.setString(1, "Senthil1");
       pstmt.setString(2, "Password");
       pstmt.setString(3, "Senthil1");
        //pstmt.setBlob(4, fis);

       while(fis.read( ) != -1) counter++;
       byte[] b= new byte[counter];
       fis.close();
       fis = new FileInputStream("C:\\pics\\viticcio.jpg");
       for(int i = 0;i<counter;i++)
       {
           b[i] = (byte)fis.read();
          // System.out.print(b[i]);
       }
       System.out.println("Input File Size : " + counter); //Output 1

       System.out.println(counter);
       pstmt.setBytes(4, b);
      // pstmt.setBlob(4, fis, counter);
       pstmt.executeUpdate();
       System.out.println("Successfully insertted ..."); 

   }
   public void select() throws Exception
   {
      String sql = "select * from emp where uname = ?";
      Connection c = ConnectionHelper.getConnection();
      PreparedStatement pstmt = c.prepareStatement(sql);
      pstmt.setString(1, "Senthil1");
      ResultSet set = pstmt.executeQuery();
      if(set.next())
      {
          FileOutputStream fos = new FileOutputStream("C:\\test.jpg");


          byte[] a = set.getBytes("photo");
          System.out.println("Output Filesize : "+a.length); //Output 2
          for(int i = 0; i <a.length;i++)
          {
           fos.write((byte)a[i]);   
       //    System.out.print((byte)a[i]);
           fos.flush();
         }
           fos.close();
      }
      pstmt.close();
      c.close();
  }
  public static void main(String[]s) throws Exception
  {
       new DataTest().insert();
       new DataTest().select();
   }
}

このプログラムを実行したときに得られる出力を以下に示します。ファイル test.jpg は C:\ に作成されますが、このファイルのサイズは読み取ったファイルのサイズの 2 倍です。

   Input File Size : 6455
6455
Successfully insertted ...
SELECT ......... 12909

問題の根本的な原因は何かを明確にしてください。前もって感謝し
ます

4

1 に答える 1

1
  1. fis.read() は読み取ったバイト数を返し、データを取得してバイト配列 (私のコードではb ) をファイル長に初期化し、次のように読み取りを呼び出します。

    File file = new File("C:\\pics\\viticcio.jpg");

    byte[] b = new bye[file.length()];

    fis.read(b);

    pstmt.setBytes(4, b);

  2. PreparedStatementはデフォルトで読み取り専用です。更新可能に設定するには、次のように初期化します。

PreparedStatement pstmt = c.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);

于 2012-11-27T06:12:35.500 に答える