Сохранение PDF-документа в кодировке base64 в Sybase

Мне нужно сохранить документ в кодировке base64 в базе данных Sybase с помощью хранимой процедуры. Я использую драйвер JTDS.

Пока я не пытаюсь сохранить свой PDF-документ, все в порядке. Однако, как только я пытаюсь найти закодированную строку. Я получаю следующую ошибку

java.sql.SQLException: Sybase не поддерживает параметры char > 255 байт.

Вот код

conn.setAutoCommit(false);

cs = conn.prepareCall("{call sp_save_pdf (?,?,?,?)}");
cs.setString(++i, id);
cs.setString(++i, source);
cs.setString(++i, base64EncodedDocument);   
cs.registerOutParameter(++i, java.sql.Types.INTEGER);
cs.execute();

Когда разработчики Sybase выполняют эту процедуру, но используют драйвер JConnect. Вот мой вопрос: драйвер JTDS не поддерживает использование длинных строк, и мне нужно использовать JConnect, или я что-то пропустил в своем коде?

Спасибо


person svager    schedule 11.08.2016    source источник
comment
Не знаком с Sybase, но у CHAR часто есть это ограничение, попробуйте TEXT или посмотрите, существует ли BLOB, поскольку байты данных будут на 33% меньше.   -  person Joop Eggen    schedule 11.08.2016
comment
Я пробовал BLOB, это не сработало, так как proc ожидает тип данных TEXT. Драйвер JTDS не имеет метода setText   -  person svager    schedule 11.08.2016
comment
Тип данных SQL TEXT вместо CHAR. Из более ранних типов CHAR использовался для n символов в записи, а TEXT был указателем на поле MEMO. С тех пор CHAR часто ограничен 255 в базе данных, а TEXT может содержать больше. В обоих случаях можно использовать setString.   -  person Joop Eggen    schedule 11.08.2016
comment
См. infocenter.sybase.com/help/index.jsp?topic=/ — действительно существует ограничение в 255 байт, но не для LONGVARCHAR или TEXT.   -  person Joop Eggen    schedule 11.08.2016
comment
Да, я знаю, поэтому я пытался установить поток символов, например cs.setCharacterStream(++i, new StringReader(base64EncodedDocument, base64EncodedDocument,.length());   -  person svager    schedule 11.08.2016
comment
Он уже установлен как ТЕКСТ в proc   -  person svager    schedule 11.08.2016
comment
Тогда это может быть просто проверка setString(int, String), хотя я боюсь, что это проблема с хранимой процедурой. Попробуйте setCharacterStream(++i, new StringReader(base64));   -  person Joop Eggen    schedule 11.08.2016
comment
Извините, мое основное внимание было/есть на моей работе. Возможно, вам нужно другое решение, временная таблица или что-то в этом роде. Удачи.   -  person Joop Eggen    schedule 11.08.2016


Ответы (1)


Проблема была с драйвером JTDS, как только я переключился на драйвер JConnect, все стало работать как положено.

person svager    schedule 11.08.2016