tutorials.de Buch-Aktion 02/2012
ERLEDIGT
NEIN
ANTWORTEN
3
ZUGRIFFE
2127
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Lautsprecher Lautsprecher ist offline Mitglied Gold
    Registriert seit
    Jun 2005
    Beiträge
    246
    Hallo,
    ich habe ein FingerScanner an meinem PC angeschlossen. Ich möchte nun das eingescannte Bild auf meinem SQL Server speichern und dabei gibts Probleme:

    Das Feld auf dem SQL Server heißt template und hat den Datentyp image Länge 16

    Als Fehlermeldung erhalte ich folgendes:

    java.sql.SQLException: I/O Error: More data in stream than specified by length
    at net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1038)
    at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQL(JtdsStatement.java:436)
    at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeUpdate(JtdsPreparedStatement.java:402)



    Mein Programm-Code für den Insert sieht folgendermaßen aus:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    protected final String sDbDrv = "net.sourceforge.jtds.jdbc.Driver";
    /* Url der Datenbank eingeben */
    protected final String sDbUrl =  "jdbc:jtds:sqlserver://SDEUTTPDISYS1:1433:WU_Daten";
    protected final String sUsr = ""; 
    /* Passwort (z.B. mysqlpwd): );*/
    protected final String sPwd = "";
     
    /* Befehle in der entsprechenen Methode zum Speichern bzw. Insert des Fingerabdrucks*/
    dbConnection = DriverManager.getConnection(sDbUrl, sUsr, sPwd );
    enrollStmt = dbConnection.prepareStatement("INSERT INTO abdruck(PersonalNr, Nachname, template) values('"+persnr1+"','"+name+"', ?)");
    enrollStmt.setBinaryStream(1,new ByteArrayInputStream(template.getData()),template.getSize());
    enrollStmt.executeUpdate();
    Geändert von Lautsprecher (06.12.05 um 15:25 Uhr)
     

  2. #2
    elmato elmato ist offline Mitglied Brokat
    Registriert seit
    May 2005
    Ort
    NRW
    Beiträge
    408
    ALso ich kenne mich mit sowas nicht wirklich aus, aber die Fehlermeldung sieht so aus, das das Bild einfach zu gross ist, entweder änderst du die Länge in deiner tabelle, oder da gibt's glaube ich auch sowas wie BLOB(Binary Large Object B) vielleicht hilft dir das
    mfg
    elmato
     

  3. #3
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.724
    Blog-Einträge
    29
    Hallo!

    Also bei mir Funktioniert das Abspeichern eines 200kbyte grossen Bildes einwandfrei mit diesen Einstellungen...
    Tabelle: image
    Spalte: ID : int
    Spalte: imageData : image 16
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    
      /**
       * 
       */
      package de.tutorials;
      
      import java.awt.image.BufferedImage;
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.InputStream;
      import java.sql.Connection;
      import java.sql.PreparedStatement;
      import java.sql.ResultSet;
      import java.sql.SQLException;
      import java.sql.Statement;
      
      import javax.imageio.ImageIO;
      import javax.swing.ImageIcon;
      import javax.swing.JFrame;
      import javax.swing.JLabel;
      
      import net.sourceforge.jtds.jdbcx.JtdsDataSource;
      
      /**
       * @author Tom
       * 
       */
      public class ImageDatabaseInteractionExample {
      
        /**
         * @param args
         */
        public static void main(String[] args) throws Exception {
            Class.forName("net.sourceforge.jtds.jdbc.Driver");
      
            JtdsDataSource dataSource = new JtdsDataSource();
            dataSource.setServerName("localhost");
            dataSource.setPortNumber(1433);
            dataSource.setUser("foo");
            dataSource.setPassword("bar");
            dataSource.setDatabaseName("test");
      
            Connection connection = dataSource.getConnection();
      
            File file = new File("c:/desktop.jpg");
            InputStream imageInputStream = new FileInputStream(file);
            insertStreamData(connection, "INSERT INTO image VALUES (1,?)",
                    imageInputStream, (int) file.length(), 1);
      
            BufferedImage image = ImageIO.read(readStreamData(connection,
                "SELECT imageData FROM image WHERE id = 1", "imageData"));
            
            connection.close();
            
            JFrame frm = new JFrame("ImageDatabaseInteractionExample");
            frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frm.add(new JLabel(new ImageIcon(image)));
            frm.pack();
            frm.setVisible(true);
      
        }
      
        private static InputStream readStreamData(Connection connection,
                String sql, String imageColumnName) throws Exception {
            Statement statement = null;
            ResultSet resultSet = null;
      
            try {
                statement = connection.createStatement();
                resultSet = statement.executeQuery(sql);
      
                if (resultSet.next()) {
                    return resultSet.getBinaryStream(imageColumnName);
                } else {
                    return null;
                }
            } finally {
                if (statement != null) {
                    statement.close();
                }
                if (resultSet != null) {
                    resultSet.close();
                }
            }
      
        }
      
        private static void insertStreamData(Connection connection, String sql,
                InputStream imageInputStream, int contentLength,
                int imageColumnIndex) throws SQLException {
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setBinaryStream(imageColumnIndex, imageInputStream,
                    contentLength);
            preparedStatement.execute();
            preparedStatement.close();
        }
      }

    .,..btw. auch wenn die Datenbank grundsätzlich erlaubt binäre Daten wie Bilder etc. zu speichern sollte man in der Regel jedoch davon Abstand nehmen... außer vielleicht einem vereinfachtem Backup bringen binäre Daten IMHO keinen großen Vorteil. Man kann nicht nach ihnen Suchen, sie machen die Datenbank fett und träge...

    Gruss Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  4. #4
    Lautsprecher Lautsprecher ist offline Mitglied Gold
    Registriert seit
    Jun 2005
    Beiträge
    246
    Hallo,
    ein "normales Bild" (jpg) abzuspeichern habe ich auch schon geschafft. Kann es
    vielleicht daran liegen, das mein ByteArrayInputStream immer variabel ist?
    Ist ist nämlich so, ich habe für den Fingerabdruck einen frei verfügbaren Code aus
    dem Internet in mein Programm eingebaut, der jedoch für Access-Anbindung optimiert war.
    In Access ein OLE-Objekt anzulegen klappt auch einwandfrei.
    Aber nochmal zurück: Je nach dem wie man den Finger auf den Scanner legt und wieviele Punkte von dem externen Programm ermittelt werden können (Punkte dienen zur Identifizierung), variert die Größe des Images.

    Was komisch ist, in VB gibts beim Speichern auf den SQL-Server keine Probleme!
     

Ähnliche Themen

  1. PHP-Ausgabe incl. Bilder auf Server speichern
    Von IR-Bastian im Forum PHP
    Antworten: 1
    Letzter Beitrag: 13.05.08, 22:55
  2. Antworten: 6
    Letzter Beitrag: 31.01.08, 17:42
  3. Antworten: 2
    Letzter Beitrag: 07.09.05, 10:44
  4. Bilder vom externen Server speichern
    Von KMX-Robin im Forum PHP
    Antworten: 3
    Letzter Beitrag: 20.04.05, 12:31
  5. MFC Login Problem -> SQL Server 2000
    Von Indian im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 18.06.04, 16:10