2016-01-28 2 views
0

Я искал как Google, так и StackOverflow в течение большей части двух часов, и я не нашел решение этого вопроса. Поэтому я обратился к вопросу.MySQL + JDBC updateBlob и updateBinaryStream throws NotUpdateable

Я работаю над проектом, который требует вставки данных в таблицу. Я должен использовать методы в классе ResultSet (например, updateXXXXX и insertRow).

В частности, мне нужно иметь возможность вставить двоичный поток/blob (либо работает в моем случае). Однако реализация Java Java Driver не поддерживает это (implementation here). Фактически, он не поддерживает ни один из updateBlob или updateBinaryStream методов .. они бросают NotUpdateable.

Перед тем, что мне нужно создать заявление таким образом, что поддерживает ResultSet.CONCUR_UPDATEABLE, будьте уверены, что я сделал, что и проверил его более чем достаточно времени. Пожалуйста, смотрите ниже:

// Create statement that is insensitive to insertion of data, and allows updating. 
Statement s = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); 

// Get an empty query ready for insertion of data 
ResultSet rs = s.executeQuery("SELECT * FROM TableName WHERE 1=0"); 

// This is a stream of bytes. If it were a String I would be fine. 
rs.updateBinaryStream("password", new ByteArrayInputStream(db.password), db.password.length); 

Так суть дела в том, что от того, что я могу видеть, что нет никакого альтернативного способа сделать это без использования другого драйвера.

Если вы знаете способ заставить это работать, я бы очень хотел его услышать. Даже если это всего лишь теория. Последнее, что я хочу сделать, это создать несколько столбцов и сохранить массив в виде BIGINT-композиций байтов.

Заранее благодарен, Ник.

+0

Вы * обязательны для заполнения * insertRow() '? В самом деле? Зачем? – Andreas

+0

@ Andreas Кросс-совместимость для неизвестных программных баз данных. –

+0

И как инструкция 'INSERT' менее кросс-совместима, чем обновляемый' ResultSet', используя фиктивный 'SELECT' оператор? – Andreas

ответ

0

Не используйте обновляемый набор результатов, особенно теперь, когда вы пришли к выводу, что это не сработает.

Поскольку вы «работает над проектом, который требует вставки данных в таблицу», вы должны попробовать использовать фактические INSERT заявление вместо этого.

Кроме того, вы можете использовать метод byte[], так как это то, что у вас есть, вместо того, чтобы пытаться использовать метод InputStream.

String sql = "INSERT INTO TableName (password) VALUES (?)"; 
try (PreparedStatement stmt = conn.prepareStatement(sql)) { 
    stmt.setBytes(1, db.password); 
    stmt.executeUpdate(); 
} 
+0

Я попробую это. Благодарю. –

+0

Удалось заставить его работать в моей системе. Благодарю. –