# Byte auslesen mit MS SQL Server



## thE_29 (26. Sep 2007)

So, ich stehe vor einem gravierenden Problem!

Irgendwann hat mal ein Urentwickler, ne Idee gehabt, man könnte doch Werte (die sowieso immer nur von 0-255) als byte array in der Datenbank abspeichern!
Tjo, soweit auch net schlimm. Problem ist jetzt aber jenes, das ich mit der MS SQL DB bei den Werten 129 und 140 - 144 immer 63 zurückkriege! (wahrscheinlich sinds noch mehr, aber die habe ich mal rausgefunden).

Egal ob ich mit getBytes(), getString, getAsciiStream, getCharacterStream oder getObject zurückhole!

Es ist immer wenn ich mitdebugge sofort 63 oder 65533. Ich kriege einfach NIE den richtigen Wert der in der DB steht!
Lasse ich mir mit einem C-Tool den Inhalt ausgeben, so wird dieser richtig angezeigt!

Hex Code 81 für 129, etc.. Also in der DB stehts richtig und das lustige ist, dass sogar das gleiche Programm die Werte richtig in die DB schreibt! Aber zu unfähig ist, diese Werte auch wieder rauszulesen.

Da es ja nirgends (oder gibt es eine?) Möglichkeit gibt, den Charset für Java allg. oder für die Datenbankverbindung festzulegen, drehe ich schön langsam bald durch.


Dann habe ich heute die Methode getBinaryStream probiert und sie hat funktioniert! Via ODBC Bridge auf eine JET DB (dort war das gleiche Phänomen, warum auch immer - unter Oracle hingegen tritt dieses Problem NIE auf - mit dem gleichen Programm).

So, nun die getBinaryStream Methode am MS SQL Server angewandt mit den MS Treibern und es kommt ne Exception, dass der Treiber das nicht unterstütz!

Dann den jtds Treiber für MS SQL ausprobiert und dort kommt sowieso dann bei jedem Zeichen gößer 127 der Wert 63 zurück!



Weiß jemand Abhilfe? Kann man wo generell irgendwas festlegen welchen Charset, etc das Teil haben soll oder sonstiges?!?

Ich bin echt am verzweifeln, da ich eigentlich genug andere Arbeit zu tun hätte...


----------



## tuxedo (26. Sep 2007)

Hmm... hast du mal folgendes probiert:


```
byte b = <Byte aus der DB>;
int richtigerByteWert = (int) b & 0xFF;
```

????

- Alex


----------



## thE_29 (26. Sep 2007)

Aus 63 wird selbst bei &0xFF wieder 63 

Guckst du hier

```
System.out.println(">>>>>>> " +(int)str.getBytes()[x] + "   " +  (int) (str.getBytes()[x] & 0xFF) + " == " + (int)str.getBytes()[x]);
```



> >>>>>>> 63   63 == 63
> >>>>>>> 126   126 == 126
> >>>>>>> -126   130 == -126
> >>>>>>> -125   131 == -125



Also 130, 131, 126, etc passen! Der erste 63 war ein \81 == 129 in der DB!!


----------



## tuxedo (26. Sep 2007)

Hmm, hätte ja sein können dass den Treiber da was "ganz krasses" macht. Weil "normal" ist das nicht dass bei verschiedenen Ausgangswerten öfters mal ein und das selbe rauskommt. 

Kommst du an die Quellen ran (decompilen mit Frontend?)und kannst das ganze debuggen?


----------



## thE_29 (26. Sep 2007)

Naja, an die MS Quellen komme ich nicht ran und im jtds Treiber bin ich jetzt zufall nachzuschauen!

Es kann ja wohl net so schwer sein, byte Werte aus einer DB zu holen! Oracle geht ja ohne Probleme... Das ist echt zum Kotzen!

Da aber unsere C Programme/Services über einen ODBC Eintrag zugreifen, greife ich jetzt auch über ODBC zu.
Und über ODBC geht auch die Methode getBinaryStream und ich wirklich die Daten 1:1 zurück!

Ich versteh halt net, was anscheinend so schwer ist in Java 1:1 die Daten aus der DB zu kriegen!

Hatte hier schon genug Probleme beim Konvertieren wegen kyrillischen Zeichen oder osteuropäischen Zeichen.. Aber mit oracle gings noch, unter MS SQL wars wieder ein halber Albtraum..

Naja, manchmal fehlt mir in Java einfach der direkte Zugriff oder einfach wie man die Daten (signed/unsigned byte) haben will...


----------

