Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    SQLITE inseriemnto file

    Salve a tutti, sto provando ad inserire un file in un database sqlite ma non ci riesco...

    ho provato in questo modo (un po rozzo ma era solo una prova...)
    codice:
    import java.io.*;
    import java.sql.*;
    
    public class insertBlob{
    
        public static void main(String[] args) {
            try{
                Class.forName("org.sqlite.JDBC");
                Connection conn = DriverManager.getConnection("jdbc:sqlite:blob.sql");
                File fileImg = new File("icone.png");
                InputStream iS = new java.io.FileInputStream(fileImg);
                int fileLength=(int)fileImg.length();
                String sql="INSERT INTO IMAGES (img) VALUES (?)";
                PreparedStatement prepStat = conn.prepareStatement(sql);
                prepStat.setBinaryStream(1,iS,fileLength);
                prepStat.executeUpdate();
            }
            catch (Exception e){
            System.out.println("Errore");
            System.out.println(e.getMessage());
            }
        }
        
    }

    Se eseguo mi da questo errore:
    not implemented by SQLite JDBC driver


    come posso risolvere?

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Ho letto la soluzione al link postato ma non riesco a capire alcune parti del codice, qualcuno sa spiegarmelo?
    il codice è questo :
    codice:
    public class JDBCSqliteConn
    {
        public static void main(String args[]) throws FileNotFoundException, IOException
        {
            Connection connection = null;
            //ResultSet resultSet = null;
            PreparedStatement ps = null;
            String file = "C:\\Fingerprint\\histoImg_med.png";
            Properties prop = new Properties();
            int s = 0;
            byte[] person_image = null;
            File image = new File(file);
            FileInputStream fis = new FileInputStream(image);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
    
            try {
                for (int readNum; (readNum = fis.read(buf)) != -1;)
                {
                    bos.write(buf, 0, readNum);
                    //no doubt here is 0
                    /*Writes len bytes from the specified byte array starting at offset
                    off to this byte array output stream.*/
                    System.out.println("read " + readNum + " bytes,");
                }
            } catch (IOException ex) {
                System.err.println(ex.getMessage());
            }
            person_image = bos.toByteArray();
    
            try {
                prop.load(new FileInputStream("C:\\dbconfig.properties"));  
                Class.forName(prop.getProperty("driver"));
                connection = DriverManager.getConnection(prop.getProperty("url"));
    
                ps = connection.prepareStatement("INSERT INTO epmc_tbl_test_img (hhld_photo) VALUES (?)");
                ps.setBytes(1, person_image);
                s = ps.executeUpdate();
                if (s > 0)
                {
                    System.out.println("Image Uploaded");
                }
                ps.close();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    ps.close();
                    connection.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    fino alla creazione dell'array da 1024 per il buffer ci sono, non riesco a capire la condizione del ciclo
    codice:
    try {
                for (int readNum; (readNum = fis.read(buf)) != -1;)
                {
                    bos.write(buf, 0, readNum);
                    //no doubt here is 0
                    /*Writes len bytes from the specified byte array starting at offset
                    off to this byte array output stream.*/
                    System.out.println("read " + readNum + " bytes,");
                }
            } catch (IOException ex) {
                System.err.println(ex.getMessage());
            }
    cosa rappresenta readNum?
    e perchè il secondo parametro di bos.write è 0?

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da Calida1982
    cosa rappresenta readNum?
    Il numero di byte letti ad ogni ciclo del for (che potranno essere al massimo 1024, ma potrebbero essere meno)

    e perchè il secondo parametro di bos.write è 0?
    E' il punto di partenza dell'array, da cui cominciare a prendere i dati per la scrittura... 0 = il primo byte dell'array.

    codice:
    bos.write(buf, 0, readNum);
    Scrivi nel ByteOutputStream il contenuto dell'array buf, a partire dal primo (0) elemento, scrivendo "readNum" elementi (ovvero, tanti quanti ne ho letti dal file).

    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

  5. #5
    l'avanzamento del FileInputStream avviene in automatico ad ogni lettura?

    codice:
    for (int readNum; (readNum = fis.read(buf)) != -1
    poi sono io che sono di coccio ma non riesco a capire questo benetto ciclo... i cicli di for non sono sempre nella forma

    codice:
    for (i=qualcosa; i<di qualcosa; i++)
    ora ho messo i<di qualcosa e i++ ma ovviamente poteva essere i> o quello che si vuole e anche i++

    infatti nel mio progetto ho sostituito con un while a me piu comprensibile
    codice:
     while ((byteLetti=fIS.read(buffer)) != -1){
                    bAOS.write(buffer,0,byteLetti);
    }

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da Calida1982
    l'avanzamento del FileInputStream avviene in automatico ad ogni lettura?
    Sì, viene fatto in automatico.

    Originariamente inviato da Calida1982
    codice:
    for (int readNum; (readNum = fis.read(buf)) != -1
    poi sono io che sono di coccio ma non riesco a capire questo benetto ciclo... i cicli di for non sono sempre nella forma

    codice:
    for (i=qualcosa; i<di qualcosa; i++)
    Un for "puro" (tipo quello del pascal) dovrebbe essere nella forma

    for (inizializzazione; check; incremento ) {}

    ma java, come c, c++ ecc ha un for meno rigido.


    Originariamente inviato da Calida1982
    infatti nel mio progetto ho sostituito con un while a me piu comprensibile
    codice:
     while ((byteLetti=fIS.read(buffer)) != -1){
                    bAOS.write(buffer,0,byteLetti);
    }
    Meglio
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da Calida1982
    l'avanzamento del FileInputStream avviene in automatico ad ogni lettura?
    Mi sembra piuttosto ovvio...

    poi sono io che sono di coccio ma non riesco a capire questo benetto ciclo... i cicli di for non sono sempre nella forma

    codice:
    for (i=qualcosa; i<di qualcosa; i++)
    La sintassi del ciclo for è la seguente:
    codice:
    for( inizializzazione; condizione_di_permanenza; incremento) { ... }
    Nessuna delle tre è obbligatoria e nessuna delle tre è obbligatoriamente legata alle altre.
    Personalmente, per questo tipo di cose preferisco il ciclo while, ma un ciclo while può essere tranquillamente sostituito da un ciclo for.

    Alcuni casi particolari
    codice:
    // Un ciclo infinito
    for( ; ; ) { ... }
    // Controparte while:
    while( true ) { ... }
    
    // Un ciclo condizionato da una variabile booleana
    for( ; variabile; } { ... }
    // Controparte while:
    while( variabile ) { ... }
    
    // Un ciclo for, senza inizializzazione
    for( ; i < 100; i++) { ... }
    // Se si entra nel ciclo con i = 10 farà 89 iterazioni
    // Se si entra nel ciclo con i = 100 non ne farà nessuna
    ora ho messo i<di qualcosa e i++ ma ovviamente poteva essere i> o quello che si vuole e anche i++
    No, poteva proprio essere qualunque cosa, purchè il secondo membro (se esiste) sia una condizione ed il terzo (se esiste) sia una qualunque istruzione che non ritorna nulla... anche la chiamata ad un metodo

    codice:
    public class TestFor {
       public static void main(String[] args) {
          for(int i=0; i<10; stampa(i)) {
             System.out.println("Dentro al for");
             i++;
          }
       }
    
       private static void stampa(int x) {
          System.out.println("Fuori dal for: " + x);
       }
    }
    infatti nel mio progetto ho sostituito con un while a me piu comprensibile
    codice:
     while ((byteLetti=fIS.read(buffer)) != -1){
                    bAOS.write(buffer,0,byteLetti);
    }
    Sì, lo preferisco anch'io... ma formalmente è la stessa identica cosa.


    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 © 2025 vBulletin Solutions, Inc. All rights reserved.