2012-07-02 2 views
2

Что мне нужно сделать (И я знаю, что это плохая практика, но я вынужден принудительно) загружать изображение в SQL DB с Java. В настоящее время я использую подготовленный оператор и пытаюсь использовать его для загрузки байтов из изображения.Обновить изображение SQL в java

public void insertImage(Connection conn,String img,String strItemNum) 
{ 

     String query; 
     PreparedStatement pstmt; 

     try 
     { 
       File file = new File(img); 
       FileInputStream fis = new FileInputStream(file); 
       byte[] image = new byte[(int) file.length()]; 
       fis.read(image); 
       System.out.println("image as sent " + image.length); 
       query = ("SELECT [Item Picture] from [Inventory] where [Item Number] = '" + strItemNum + "'"); 
       pstmt = conn.prepareStatement(query); 
       System.out.println(pstmt.getMetaData().getColumnName(1) + " of type: " + pstmt.getMetaData().getColumnTypeName(1)); 
       pstmt.setBytes(1,image); 
       pstmt.executeUpdate(); 
       pstmt.close(); 


     } 
     catch (IOException | SQLException e) 
     { 
      System.err.println(";"+e.getMessage()); 
      e.printStackTrace(); 

     } 

} 

Но это приводит к получению SQLException: Invalid индекс параметра 1. Параметр в моей таблице имеет тип «образа», и я не могу получить что-нибудь, чтобы придерживаться. Я пробовал использовать .setBlob, но из моих исследований Google, похоже, что Blobs никогда не были реализованы очень хорошо.

EDIT: решаемый с помощью ответа AVD в

изменен

query = ("Update [Inventory] set [Item Picture] = ? where [Item Number] = ?"); 
pstmt = conn.prepareStatement(query); 
pstmt.setBytes(1,image); 
pstmt.setString(2, strItemNum); 
pstmt.executeUpdate(); 
pstmt.close(); 
+0

вы уверены, что ваш запрос хорошо сформирован? Эти скобки, кажется, незаконны ... –

+0

@AlexStybaev: скобки являются отклонением Microsoft от стандарта SQL. –

ответ

3

Вы должны использовать INSERT или UPDATE SQL заявления, чтобы добавить новую запись или обновить существующую строку.

String sql="INSERT INTO TableName (Col1,Col2) VALUES (?,?)"; 

Используйте ? (знак вопроса), чтобы указать заполнитель.

EDIT:

Connection connection=null; 
PreparedStatement statement=null; 
String sql="UPDATE TableName set ImageCol1=? WHERE ID=?"; 
try{ 
    //Obtain connection 
    statement=connection.prepareStatement(sql); 
    statement.setBytes(1,byteArray); 
    statement.setInt(2,10); 
    ... 
}catch(SQLException ex){ 
    // 
}finally{ 
    if(ps!=null) { 
    try{ 
     ps.close(); 
    }catch(Exception ex){ 
     // 
    } 
    } 
if(cn!=null) { 
    try{ 
     cn.close(); 
    }catch(Exception ex){ 
     // 
    } 
    } 
} 
+0

Хорошо, как бы я использовал инструкцию UPDATE для байтов? Извините, я ОЧЕНЬ новичок в SQL – kingdamian42

+1

Thankyou! Это было удивительно полезно. – kingdamian42

1

Вы должны сделать что-то вроде этого:

Connection con = getConnection(); 

    PreparedStatement ps = null; 

    con = getConnection(); 

    ps = con.prepareStatement("insert into tableName (column, blobColumn...) values (?, ?)"); 

    ps.setInt(1, "ID"); 

    File image = new File("C:/yourPath.../..."); 

    inputStream = new FileInputStream(image); 

    ps.setBinaryStream(2, (InputStream) inputStream, (int) (image.length())); 

    ps.executeUpdate(); 

Вот, теперь вы вставили IMG на BD.

Обновление:

con = getConnection(); 

    ps = con.prepareStatement("update yourTableName set theColumnBlobYouWant = ? where codYouNeed = ? "); 

    inputStream = new FileInputStream(image); 

    ps.setBinaryStream(1, (InputStream) inputStream, (int) (image.length())); 

    ps.setInt(2, codWhereHere); 

    ps.executeUpdate(); 
Смежные вопросы