Ich schreibe mit folgender Syntax ein byteArray (Java - JDBC) in eine Tabelle meiner Datenbank. Dies funtioniert auch wunderbar. Wenn ich mir danach mit einem Datenbanktool die Tabelle anschaue ist da ein Binary mit 27 Bytes drin. Soweit alles gut.
/\*
\* prepare byte[]
\*/
String testString = "Hallo, dies ist ein Test...";
byte[] result = null;
try {
result = testString.getBytes("UTF-8");
} catch (UnsupportedEncodingException UEEx) {
System.out.println("Errors occured while converting xml: " + UEEx.getMessage());
}
/\*
\* Insert byte[]
\*/
try {
con = DriverManager.getConnection(URL, USER, PASS);
PreparedStatement pstmt = con.prepareStatement("UPDATE BlobExample SET Content = ? WHERE (Id = 1)");
pstmt.setBytes(1, result);
pstmt.executeUpdate();
pstmt.close();
} catch (BatchUpdateException e) {
System.out.println(message2 + e.getMessage());
} catch (SQLException e) {
System.out.println(message1 + e.getMessage());
} finally {
if (con != null)
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
Nun lese ich dieses ByteArray wieder zurück und lasse es mir ausgeben:
byte[] test = null;
/\*
\* get byte[] from db
\*/
try {
con = DriverManager.getConnection(URL, USER, PASS);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT Content FROM BlobExample");
System.out.println(":::");
while (rs.next())
test = rs.getBytes(1);
rs.close();
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
return;
} finally {
if (con != null)
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
/\*
\* Show content
\*/
System.out.println("Content: " + result.length);
System.out.println("Content: " + new String(result));
System.out.println("Content: " + test.length);
System.out.println("Content: " + new String(test));
Die oberen zwei Zeilen geben mir das ursprüngliche byte[] aus (Inhalt korrekt und Länge 27, auch richtig). Die unteren Zeilen das was aus der Datenbank zurückkommt (Inhalt nicht sichtbar und Länge 86!!!).
/\*
\* prepare byte[]
\*/
String testString = "Hallo, dies ist ein Test...";
byte[] result = null;
Blob nix = null;
try {
result = testString.getBytes("UTF-8");
} catch (UnsupportedEncodingException UEEx) {
System.out.println("Errors occured while converting xml: " + UEEx.getMessage());
}
try {
nix.setBytes(1, result);
} catch (SQLException ex){}
Leider bekomme ich schon beim füllen des Blob-Objektes eine NullPointerException.
Was mache ich denn da nun wieder verkehrt?
Was mich aber halt wundert ist (in meinem ersten Versuch), dass das byte[] offensichtlich so wie ich es erzeuge in die db geschrieben wird (gleiche Größe), aber dann beim Auslesen etwas falsch läuft…
ich würde an Deiner Stelle so vorgehen, um das mit den Blobs rauszukriegen:
Erstelle ein Blob-Objekt und fülle es mit Daten.
lies das Blob-Objekt gleich wieder aus.
Jetzt bist du sicher, dass dieser Teil funktioniert.
Schreib das Blob-Objekt in die DB. (Das geht mit einem Prepared Statement ganz einfach)
lies das Bob-Objekt wieder aus.
In deinem Coding steht Blob nix = null;
Kein Wunder also, dass Du eine NullPointerException bekommst. Was hast Du denn anderes erwartet. Versuchs mal mit:
Blob nix = new Blob();
Jetzt hast DU ein Objekt - da steht aber nix drin. (Muss/Soll auch nicht)
Das Füllen eines Blobs geht über einen ByteStream.
Welche Entwicklungsumgebung nimmst du denn? Notepad? Versuch malo Eclipse oder Netbeans.
Gruß
Peter
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]