Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

    [Java + SQL] Valorizzazione campo 'image' su SQL Server

    Ciao a tutti.
    Sono alle prese con una applicazione Java che dovrebbe permettermi di archiviare in un Database SQL Server 2000 delle immagini (o più in generale, dei dati binari che superano i fatidici 8 kb).
    Per questo ho predisposto nel DB una tabella con un campo di tipo "image" (che supporta fino a 2 GB di dati).
    Il problema è che non ho idea di come valorizzare questo campo tramite istruzioni (o script) SQL.

    Ho provato a trasformare i miei dati binari in una stringa e poi inserire il tutto all'interno dell'istruzione SQL, ma la prova è finita miseramente quando il driver JDBC mi ha risposto:
    java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]
    Virgoletta di chiusura mancante prima della stringa di caratteri '....'.
    Ovviamente trattandosi di dati binari, il carattere apice può trovarsi ovunque...

    Da notare che dalla guida di SQL Server si evince che è necessario l'utilizzo di un'istruzione particolare: WRITETEXT al posto della INSERT (o UPDATE), che fa uso di puntatori... quel messaggio deriva proprio dall'utilizzo di tale istruzione, copiando fedelmente un esempio della guida stessa. :master:

    Vi posto il codice:
    codice:
    String query =  "DECLARE @ptrval binary(16) ";
           query += "SELECT @ptrval = TEXTPTR(img) ";
           query += "FROM TAB_Prova ";
           query += "WRITETEXT img @ptrval '" + generaStringa(file) + "'";
    if ( !db.eseguiAggiornamento(query) ) {
       System.out.println( db.getErrore() );
    }
    La domanda, quindi: come faccio a inserire un'immagine all'interno del campo di tipo image di SQL Server?

    Se nessuno mi sa dire come fare, sarò costretto a fare di testa mia: codifico l'immagine secondo lo standard Base64 e inserisco il tutto in un campo text, ma questo mi costringerebbe ad un aumento delle dimensioni del file, che arriverebbe ad occupare 4/3 della sua dimensione originale.

    Confido nell'esperienza altrui.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  2. #2
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    a vedere il codice direi che usi gli statement
    io uso i PreparedStatement che per i campi complessi come i blob sono indispensabili
    il problema è che il metodo setBlob vuole un Blob e credo che l'unico modo per crearlo sia usare l'implementazione di Blob dei driver che stai usando, e se la usi non avrai più la portabilità per i diversi dbms

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Ti ringrazio molto. Come sempre mi sei d'aiuto.

    Sono riuscito a risolvere tramite i PreparedStatement.
    Se a qualcuno potesse interessare come:
    codice:
    FileInputStream is = new FileInputStream("./immagine.jpg");
    
    String query =  "INSERT INTO TAB_Prova ";
           query += "VALUES( ? );";
    
    try {
       PreparedStatement stmt = db.prepareStatement(query);
       stmt.setBinaryStream(1, is, is.available());
       boolean risultato = stmt.execute();
       stmt.close();
    } catch (Exception e) {
       e.printStackTrace();
    }
    Ed è pure semplice.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.