2013-09-06 2 views
0

У меня есть следующий код, используя oracle.sql.BLOBPostgreSQL эквивалент oracle.sql.BLOB в Java

BLOB b = BLOB.createTemporary(conn, false, BLOB.DURATION_SESSION); 
//conn is a PostgreSQL connection (java.sql.Connection object) 
b.setBytes(1, someString.getBytes()); 
ps.setBlob(++i, b); //ps is a PreparedStatement 

Очевидно, что это не будет работать, потому что createTemporary ожидает подключения к Oracle.

  1. Каков эквивалентный способ достижения этого с помощью соединения Postgres? Я понимаю эквивалент Postgres Blob is ByteA. Целевой столбец - столбец bytea. Могу ли я просто сделать следующее? Или есть правильный способ достижения такого же эффекта?

    ps.setBytes(++i, someString.getBytes()); 
    
  2. Также, как сделать код, специфичный для Oracle, независимым от поставщика DB? (Избегая использования oracle.sql.BLOB, даже если это соединение Oracle)

+0

Почему вы используете 'BLOB' для хранения' String'? Это намного лучше хранится в 'CLOB' (' text' в Postgres) –

+0

См. Мой ответ здесь: http://stackoverflow.com/a/8349906/330315 и здесь http://stackoverflow.com/a/16462192/ 330315 для независимого решения СУБД –

+0

@a_horse_with_no_name Это не мой код. Есть причины, по которым программисты использовали его для этого экземпляра. Мы не делаем этого для каждой строки. Спасибо за ссылки. Могу ли я спросить, как 'setBinaryStream' лучше, чем' setBytes'? будет ли 'setBytes' достаточно здесь? – ADTC

ответ

1

Если вы используете setBytes() (я не могу вспомнить, если был другой PSQL или не PSQL конкретный метод блоб), не забудьте добавить кодировка символов на ваш someString.getBytes().

Что касается того, чтобы ваш код был независимым от db, остановите использование определенных классов db. Вы можете пройти долгий путь только с классов java.sql. *. Это должен быть только особый случай, когда вам нужно копать в реальных классах драйверов внедрения.

+0

Спасибо за ваши комментарии. Будет неплохо, если бы вы могли дать ответы на вопросы здесь. – ADTC