Добавление изображения как BLOB в HSQLDB, но что-то вроде ": hsqll: jdbc: client @ f3t5h" заканчивается в таблице - PullRequest
0 голосов
/ 12 октября 2011

Я пытаюсь добавить изображение как BLOB в HSQLDB.Но в таблице я нахожу что-то вроде ": hsqll: jdbc: client @ f3t5h".Что-то не так с моим Java-кодом ниже?

Мой извлекаемый код похож на то, что я обычно делаю для других баз данных.Почему он не работает для HSQLDB?

   Statement stmt = conn.createStatement();

   ResultSet results =stmt.executeQuery("SELECT * from productdetails");


     while (results.next()) {
                String code = (String) results.getObject(1);
                String name = (String) results.getObjeenter code herect(2);

                String price = Double.toString((Double) results.getObject(3));
                int quantity = (Integer) results.getObject(4);
                Boolean featured = (Boolean) results.getObject(5);
                String desc = (String) results.getObject(6);
                String imgPath = (String) results.getObject(7);
                Blob aBlob = (Blob) results.getBlob(10);
                byte[] allBytesInBlob = aBlob.getBytes(1, (int) aBlob.length());

                try {
                    FileOutputStream fis =
              (FileOutputStream) getOutputStream(allBytesInBlob);

                } catch (IOException ex) {
                    Logger.getLogger(Helper.class.getName()).log(Level.SEVERE, null, ex);
                }
}

public OutputStream getOutputStream(byte[] _data) throws IOException 
               {
            OutputStream out = new ByteArrayOutputStream();
            out.write(_data);
             return out;
               }

Это мой код вставки.

 Connection conn = db.getConnection();
 PreparedStatement pstmt;
 String sql = "INSERT INTO PRODUCTDETAILS"
( PRODUCTCODE, NAME, PRICE, QUANTITY, FEATURED, DESCRPTION,   IMAGEPATH,IMAGE )
               VALUES ( ?, ?,? ,? ,? , ?, ?,?)";
 pstmt = conn.prepareStatement(sql);
        FileInputStream fis;


        File image = new File(values.getImgPath());
        fis = new FileInputStream(image);
        pstmt.setBinaryStream(8, (InputStream) fis, (int) (image.length()));
        pstmt.execute();

Столбец image имеет тип BLOB, очевидно.

Ответы [ 3 ]

2 голосов
/ 12 октября 2011

Ваш код Java правильный для HSQLDB 2.2.x.Капля, кажется, вставлена.Кажется, код, который вы используете для получения блоба, неверен.Вы не сообщили об этом коде, но, очевидно, вы не используете методы java.sql.Blob для доступа к возвращенному BLOB-объекту (объект org.hsqldb.jdbcJDBCBLOBClient).Пост-получение кода для исправления.

Если вы посмотрите на данные таблицы в HSQLDB DatabaseManager или некоторых других инструментах, он может отображать большой двоичный объект как адрес объекта, а не двоичное содержимое.

1 голос
/ 12 октября 2011

Звоните aBlob.getBytes(10, aBlob.length()).

Однако первый аргумент Blob.getBytes() - это индекс первого байта для извлечения (на основе 1, как и все индексы в JDBC). Таким образом, вы игнорируете (т.е. не извлекаете) первые 9 байтов Blob. Вместо этого введите 1.

Если результат на самом деле такой, как вы показали, значит, что-то еще не так (вероятно, способ, которым вы вставляете Blob), но это, безусловно, первая проблема, которую вы должны решить.

0 голосов
/ 19 ноября 2012

Иоахим: 10 - это индекс столбца, а не байт [индекс].

То, что вы получаете, является стандартным Object.toString ().«Очевидно, столбец изображения имеет тип BLOB».Да, в БД.Как насчет вашего стола?Ваша модель возвращает общий String.class для этого столбца?Если это так, вы должны проверить сам объект, ваши данные находятся внутри (и объекту все равно, если это ваша мать в низком изображении или тексте).Хороший приведение для byteoutputstream в fileoutputstream, в моем Java не работал

...