PostgreSQL Bytea INSERT

Samofan

Aktives Mitglied
Hallo Community,

ich bin gerade dabei, eine Oberfläche für eine Datenbank zu programmieren, welche verschiedene Datentypen beinhalten soll. Es soll "text" und "bytea" gespeichert werden. Das bytea brauche ich, um PDF Dateien zu speichern. Wie sinnvoll das ist, sei jetzt mal dahingestellt. Ich habe eine Eingabemaske für die einzelnen Daten, sowie einen FileChooser, mit dem man die PDF auswählen soll. Dann soll mit einem Button ein prepared Statement abgesetzt werden. Im Moment ist es so, dass ich einfach nur die File Location als String abspeichere, aber das soll geändert werden. Ist es denn überhaupt möglich, bytea mit den Strings zu senden? Und wenn ja, würde ich mich sehr über Tipps und/oder die Anpassung meines Quelltextes freuen. Wie man merkt bin ich noch ein Anfänger und hoffe, dass ich in dem Thread hier richtig bin.

So sieht mein FileChooser aus. Die File Location wird als String gespeichert. Falls keine PDF verfügbar ist, wird der String "Keine PDF verfügbar" an die Datenbank geschickt und dann später in meiner Oberfläche anstatt der File Location angezeigt, wie man bei "addData" sieht.
Java:
@FXML
  private void actionChooseFile(ActionEvent event)
  {
    fileChooser = new FileChooser();
    // title of fileChooser
    fileChooser.setTitle("PDF wählen...");
    // set the initialDirectory for FileChooser
    fileChooser.setInitialDirectory(new File(System.getProperty("user.home") + System.getProperty("file.separator") + "Desktop"));
    //only able to choose pdf files
    fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("PDF (*.pdf)", "*.PDF"));

    //open FileChooser
    File pdf = fileChooser.showOpenDialog(dataTable.getScene().getWindow());
    if (pdf != null)
    {
      Data.setFile(pdf.toString());
      System.out.println(pdf);
    }
    else
    {
      //do nothing
    }
  }

Ich lese dann die Daten aus den Textfeldern aus und übergebe sie an die Klasse, welche das Statement absetzt.

Java:
@FXML
  private void addData(ActionEvent event)
  {
    if (Data.getFile() == null)
    {
      Data.setFile("Keine PDF verfügbar");
    }
    else
    {
       //do nothing
    }
    try
    {
        DataDAO.insertData(textKunde.getText(), textLand.getText(), textWerkort.getText(), textGeraet.getText(), Integer.parseInt(textSeriennummer.getText()), Data.getPasswortHash(), Data.getFile());
        System.out.println("Daten hinzugefügt\n");
    }
    ...
  }

Danach kommt dann das Statement woran es bei mir hakt. Ich weiß nicht, wie ich die PDF in die Spalte als bytea eingefügt bekomme. Aktuell sieht das Statement noch so (siehe unten) aus.

Java:
public static void insertData(String kunde, String land, String werkort, String geraet, Integer seriennummer, String passwort, String pdf) throws SQLException, ClassNotFoundException
  {
    //Declare a INSERT statement
    String updateStmt
           = "    INSERT INTO maschinenliste\n"
             + "    (kunde, land, werkort, geraet, seriennummer, passwort, pdf)\n"
             + "    VALUES\n"
             + "    ('" + kunde + "', '" + land + "', '" + werkort + "', '" + geraet + "', '" + seriennummer + "', '" + passwort + "', '" + pdf + "');\n";

    //Execute INSERT operation
    try
    {
      DBUtil.dbExecuteUpdate(updateStmt);
      System.out.println(updateStmt);
    }
    catch (SQLException e)
    {
      System.out.print("Fehler: " + e);
      throw e;
    }
  }

Ich bedanke mich jetzt schonmal für die Hilfe! Anbei ist noch ein Bild der Anwendung, damit man sich das etwas leichter vorstellen kann, was ich vorhabe :)Programm.png
 

httpdigest

Top Contributor
Was verwirrt dich denn daran? Du erzeugst einfach ein Standard JDBC PreparedStatement und setzt das Byte-Array als InputStream (per ByteArrayInputStream) via PreparedStatement.setBinaryStream(paramPos, InputStream, array.length). Fertig.
 

Samofan

Aktives Mitglied
Wo Du recht hast, hast Du recht. Ich werde mich mal dran versuchen und mein neues "insertData" hier rein posten. Vielleicht kann es noch jemand gebrauchen.
 

Samofan

Aktives Mitglied
Ich bin jetzt so weit gekommen
Java:
public static void dbExecuteByteaUpdate(String kunde, String land, String werkort, String geraet, Integer seriennummer, String passwort, FileInputStream pdf)
  {
    String stm = "    INSERT INTO maschinenliste\n"
                 + "    (kunde, land, werkort, geraet, seriennummer, passwort, pdfbytea)\n"
                 + "    VALUES(?,?,?,?,?,?,?)";
    System.out.println(stm);
    try
    {
      PreparedStatement pst;
      pst = conn.prepareStatement(stm);
      pst.setString(1, kunde);
      pst.setNString(2, land);
      pst.setString(3, werkort);
      pst.setString(4, geraet);
      pst.setInt(5, seriennummer);
      pst.setString(6, passwort);
      pst.setBinaryStream(7, pdf, (int)Data.getFile().length());
      pst.executeUpdate();
      pst.close();
      KundeViewController.fis.close();
      System.out.println("Test");
    }
    catch (Exception e)
    {
    }
  }
Aber leider überspringt der alles nach dem "pst = conn.prepareStatement(stm);". Aus irgendeinem Grund werden die Strings für das Statement nicht gesetzt...
 

httpdigest

Top Contributor
Naja, geschickterweise verschluckst du ja auch jede mögliche Exception, ohne sie irgendwie auszugeben oder weiterzuwerfen. Es wird ganz sicherlich eine Exception geworfen.
 

Samofan

Aktives Mitglied
Naja, geschickterweise verschluckst du ja auch jede mögliche Exception, ohne sie irgendwie auszugeben oder weiterzuwerfen. Es wird ganz sicherlich eine Exception geworfen.
Als ich das gelesen habe musste ich ein bisschen schmunzeln. Da hast du natürlich recht. Die Verbindung wird vor der Absetzung des Statements geschlossen und es kommt der Fehler "Die Methode org.postgresql.jdbc4.Jdbc4PreparedStatement.setNString(int, String) ist noch nicht implementiert.".
 
Zuletzt bearbeitet:

Samofan

Aktives Mitglied
In meinem pgAdmin steht, dass es funktioniert hat (es steht zumindest "binary data" in meinem bytea Feld. Meine Methode sieht jetzt so aus:
Java:
public static void dbExecuteByteaUpdate(String kunde, String land, String werkort, String geraet, Integer seriennummer, String passwort, FileInputStream pdf) throws SQLException, ClassNotFoundException
  {
    String stm = "    INSERT INTO maschinenliste\n"
                 + "    (kunde, land, werkort, geraet, seriennummer, passwort, pdfbytea)\n"
                 + "    VALUES(?,?,?,?,?,?,?)";
    System.out.println(stm);
    PreparedStatement pst = null;
    dbConnect();
    try
    {
      pst = conn.prepareStatement(stm);
      pst.setString(1, kunde);
      pst.setString(2, land);
      pst.setString(3, werkort);
      pst.setString(4, geraet);
      pst.setInt(5, seriennummer);
      pst.setString(6, passwort);
      pst.setBinaryStream(7, pdf, (int)Data.getFile().length());
      pst.executeUpdate();
      KundeViewController.fis.close();
      System.out.println("Test");
    }
    catch (IOException | SQLException e)
    {
      Logger.getLogger(KundeViewController.class.getName()).log(Level.SEVERE, null, e);
    }
    finally
    {
      if (pst != null)
      {
        //Close statement
        pst.close();
      }
      //Close connection
      dbDisconnect();
    }
  }

In meiner POM musste ich noch eine Dependency hinzufügen:
Code:
<dependency>
      <groupId>org.postgresql</groupId>
      <artifactId>postgresql</artifactId>
      <version>9.3-1100-jdbc41</version>
</dependency>
Ich hatte noch den etwas älteren Treiber drin wo das .setString noch nicht implementiert war. So wie es in der Exception steht.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T compiler fehler: should be mapped with insert="false" update="false" Datenbankprogrammierung 1
L SQL Datenbank INSERT INTO Datenbankprogrammierung 6
L SQL Datenbank Tabelle insert Datenbankprogrammierung 7
O HOW TO INSERT PRIMARY INTO ANOTHER TABLE AND USE IT AS FOREIGN KEY TO DISPLAY DATA IN A RELATIONSHIP Datenbankprogrammierung 3
G Eine Spalte in xampp als Typ array erstellen - ein array mit "insert" hinzufügen. Datenbankprogrammierung 3
C Problem with INSERT.............ON DUPLICATE KEY Datenbankprogrammierung 3
A MySQL Select und Insert in Java Datenbankprogrammierung 15
W Problem mit Insert in zwei Tabellen Datenbankprogrammierung 8
L INSERT INTO Befehl in Java Datenbankprogrammierung 8
L SQL-Statement INSERT INTO ON DUPLICATE KEY UPDATE funktioniert nicht Datenbankprogrammierung 5
D Insert Methode per Servlet Datenbankprogrammierung 2
D Insert Methode per Servlet Datenbankprogrammierung 0
D SQLite INSERT OR REPLACE INTO macht neuen Eintrag?! Datenbankprogrammierung 2
O JDBC Daten in zwei Tabellen mit zwei foreach-Schleifen einfügen (insert into) Datenbankprogrammierung 1
B JPA->fehler beim Insert in die Datenbank Datenbankprogrammierung 3
A Oracle insert Array in DB Datenbankprogrammierung 7
C MySQL JTable in JScrollPane nach insert aktualisieren Datenbankprogrammierung 3
X SQLite Erhalte bei Query INSERT INTO eine NullPointerException Datenbankprogrammierung 10
M JAVA Derby INSERT probleme Datenbankprogrammierung 12
Y MySQL Eclipselink Insert JSF Beispiel gesucht Datenbankprogrammierung 2
T MySQL MySQL - Insert into fügt zwei identische Datensätze ein Datenbankprogrammierung 2
M Derby/JavaDB Derby SQL Insert mit AUTO_INCREMENT, welche ID wurde vergeben? Datenbankprogrammierung 6
D HSQLDB INSERT INTO in einer For Schleife mit selber ID, machbar? Alternative? Datenbankprogrammierung 7
J SQL-Statement Meine insert befehle funktionieren nicht und ich weiß nicht wo der fehler liegt Datenbankprogrammierung 5
M INSERT-Problem = integrity constraint violation: foreign key no parent Datenbankprogrammierung 5
P MySQL INSERT / UPDATE MySQL - perStoredProcedure oder direkt im Code Datenbankprogrammierung 3
M MySQL Insert über mehrere Tabellen Datenbankprogrammierung 7
V HSQLDB Insert in eine Tabelle mit Autoincrement Datenbankprogrammierung 2
B MS SQL: Insert LOB Datenbankprogrammierung 4
M MySQL INSERT will einfach nicht funktionieren Datenbankprogrammierung 9
H HSQLDB insert .... values("test1",select test2 from foo) Datenbankprogrammierung 2
D JDBC insert mit select abfrage Datenbankprogrammierung 5
R vor/nach INSERT mysql-SETS absetzen Datenbankprogrammierung 2
C insert into mit between-Anweisung Datenbankprogrammierung 10
C Derby/JavaDB INSERT auf FOREIGN KEY schlägt fehl Datenbankprogrammierung 2
F Insert into Access Datenbankprogrammierung 3
S Nochmals: ID ermitteln nach Insert Datenbankprogrammierung 2
S ID Wert von Insert über jdbcTemplate.update Datenbankprogrammierung 3
O Viele Verbindungen-Exception bei insert Daten zur MySQL-Datenbank Datenbankprogrammierung 2
B SELECT ja - INSERT nein (MySQL) Datenbankprogrammierung 3
E Derby/JavaDB Keine Reaktion von "insert into" im ActionListener Datenbankprogrammierung 22
A Oracle Unbekannter Fehler bei insert Befehl Datenbankprogrammierung 3
T MySQL Db select * und Insert schlagen fehl Datenbankprogrammierung 2
Kenan89 Insert ohne Auswirkung Datenbankprogrammierung 7
B MySQL myBatis INSERT Datenbankprogrammierung 13
E Access Datenbank mit Insert befüllen Datenbankprogrammierung 5
M Datenbankverbindung zu langsam beim Insert? Datenbankprogrammierung 6
S 2 Tabellen zu einer zusammenführen, INSERT INTO Fehler Datenbankprogrammierung 5
L H2 Auto INC Primary Key & Insert Datenbankprogrammierung 8
R Derby/JavaDB Insert Statement Probleme Datenbankprogrammierung 14
F H2:Wie kann man insert eine Reihe "int" wert als blob in table? Datenbankprogrammierung 12
S MySQL INSERT schlägt nicht fehl, fügt aber auch nichts ein Datenbankprogrammierung 13
S Probleme mit INSERT Befehl Datenbankprogrammierung 11
L MySQL Prepared Statement batch langsamer als bulk insert? Datenbankprogrammierung 10
M Insert in Table mit 250 Feldern Datenbankprogrammierung 2
E [ACCESS ODBC] INSERT INTO Fehler Datenbankprogrammierung 4
A Insert Methode Syntaxfehler Datenbankprogrammierung 2
G INSERT DATE in Oracle-DB Datenbankprogrammierung 11
G ODBC Insert und gleich danach Selects Datenbankprogrammierung 8
Iron Monkey Insert into Spalte ID AUTO_INCREMENT Datenbankprogrammierung 7
C ID-Rückgabe bei INSERT Datenbankprogrammierung 5
D mysql insert - performance/robustheit, "best practice" Datenbankprogrammierung 15
M Hibernate: Insert statt Update Datenbankprogrammierung 8
C Rückgabe ob INSERT erfolgreich Datenbankprogrammierung 11
H Batch Update/Insert Datenbankprogrammierung 4
E Insert oder Update- Prüfung Datenbankprogrammierung 3
K DB2 Insert mit Subselect Fehler Datenbankprogrammierung 2
M Derby insert, ID auslesen Datenbankprogrammierung 3
W Problem bei Insert mit JDBC auf MS-SQL-Server 2005 Datenbankprogrammierung 7
G Frage zum Insert-Statement Datenbankprogrammierung 2
R Probleme mit Insert Datenbankprogrammierung 2
D Problem: Prepared Statement (Insert) funktioniert nicht. Datenbankprogrammierung 3
M Insert Update usw. Datenbankprogrammierung 2
P Insert into mit zwei Datenbanken Datenbankprogrammierung 3
S Insert mit Select Datenbankprogrammierung 6
G INSERT-STATEMENT Datenbankprogrammierung 6
M insert in 2 tabellen Datenbankprogrammierung 7
J Insert auf Access DB funktioniert nicht Datenbankprogrammierung 5
H Beim insert bekomme ich den Fehler missing select keyword Datenbankprogrammierung 2
V Fehlermeldung beim Insert Datenbankprogrammierung 16
S Insert into , executeupdate oder executequery Datenbankprogrammierung 3
B PrepareStatement "Insert into" fehlermeldung Datenbankprogrammierung 13
D Insert Oracle BLOB Datenbankprogrammierung 1
T ibatis + "generated p-key" nach insert? Datenbankprogrammierung 24
G Herausfinden des Primary Keys nach INSERT-Kommando? Datenbankprogrammierung 4
G INSERT abfragen ob erfolgreich? Datenbankprogrammierung 5
D INSERT String enthält ' wie kann man das Escapen? Datenbankprogrammierung 4
T INSERT-Befehl in Java für Oracle Datenbankprogrammierung 4
Y Hibernate - Datum Insert Datenbankprogrammierung 7
D ODBC Zugriff auf MDB-Datenbank, Insert Into ohne Funktion Datenbankprogrammierung 2
U INSERT INTO von 2 Textfeldern Datenbankprogrammierung 6
D Syntaxfehler in der INSERT INTO Anweisung Datenbankprogrammierung 2
F JAVA & MySQL : INSERT INTO DB ! Datenbankprogrammierung 2
D Problem mit INSERT INTO Datenbankprogrammierung 19
S insert into table Datenbankprogrammierung 8
S Insert in Datenbank Datenbankprogrammierung 15
G Insert-anweisung mehrere Varianten eine geht Datenbankprogrammierung 2
P frage zu "" bei INSERT STATEMENTS Datenbankprogrammierung 2
K frage zum ausführen eines INSERT statements Datenbankprogrammierung 16
K INSERT INTO bei Windows 2005 SQL Server Standard Edition . Datenbankprogrammierung 2

Ähnliche Java Themen


Oben