Oracle9i - Blob aus der Datenbank lesen - Fehler?

Hallo,
ich habe folgendes Problem:

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!!!).

Was mache ich verkehrt? Wie mache ich es richtig?

Gruß vom Pianoman

Hallo,

versuchs doch mal so:

Erzeuge ein Blob-Objekt in Java und schreibe dieses in die DB. (Nicht ein byte[]).
Das Ergebnis bekommst du dann mit getBlob()

Gruß

Peter

Habs so versucht:

/\*
 \* 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…

Bin leider noch nicht weiter ;-(

Hallo,

ich würde an Deiner Stelle so vorgehen, um das mit den Blobs rauszukriegen:

  1. Erstelle ein Blob-Objekt und fülle es mit Daten.
  2. lies das Blob-Objekt gleich wieder aus.
    Jetzt bist du sicher, dass dieser Teil funktioniert.
  3. Schreib das Blob-Objekt in die DB. (Das geht mit einem Prepared Statement ganz einfach)
  4. 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]

Hallo,
habs inzwischen hinbekommen. Die NullPointerException ist mir auch noch recht schnell klargeworden, entschuldige :wink:

Welche Entwicklungsumgebung nimmst du denn? Notepad? Versuch
malo Eclipse oder Netbeans.

Hihi, also entwickeln tue ich schon in Eclipse 3.2, woher die Frage? Hab ich da irgendeine Unterstützung in Eclipse noch nicht entdeckt?

Auf jeden Fall vielen Dank, dass Du Dir die Zeit genommen hast, mir zu helfen!

Gruß vom Pianoman

Hallo an dieser Stelle.

Hihi, also entwickeln tue ich schon in Eclipse 3.2, woher die
Frage? Hab ich da irgendeine Unterstützung in Eclipse noch
nicht entdeckt?

Damit ist eher gemeint, dass der ‚JDeveloper‘ von Oracle ähnlich wie Eclipse aufgebaut ist und bei solchen Aktionen Unterstützung leistet.

HTH
mfg M.L.