středa 2. června 2004

Microsoft SQLServer 2000 Driver for JDBC bug?

Zajímavý bug? obsahuje Microsoft SQLServer 2000 Driver for JDBC s javou 1.4.2. Při čtení z pole typu text, kdy je v tomto poli zadán prázdný string (tj. ne pro null, pouze hodnota zadaná např.: insert into table values ('')) ohlásí chybu Underlying input stream returned zero bytes. Tyto chyba se projeví zřejmě jenom na národních verzích SQLServeru 2000. Na webu jsem nalezl dvě řešení:

  • nahradit datový typ text datovým typem ntext - nemám odzkoušeno
  • použít místo javy 1.4.2 javu 1.4.0 !? - mám odzkoušeno na jre 1.4.0-b92

Pozn.: V bug databázi sunu se píše o problému ve verzi 1.4.0 (resp.je to pokračující problém z verze 1.2.2, který byl v 1.3.x verzích opraven a pak se zase do javy vrátil), kdy InputStream wrapowaný např. v InputStreamReader, při použití metody isr.read(...) vrátí chybu Underlying input stream returned zero bytes tehdy, pokud is.read(...) wrapovaného vrací 0.

//pokud is vrátí pomocí read 0, read z isr vyhodí exception
public void wrapStream(InputStream is) throws IOException {
  is.read(new byte[1], 0, 1); //projde
  InputStreamReader isr = new InputStreamReader(is);
  isr.read(new char[1], 0, 1); //vyhodí Underlying... }

Je tedy otázkou jestli má driver Microsoftu vracet 0 při prázdném stringu v poli typu text, nebo jestli java nemá vyhazovat exception, pokud wraper chce provést read(...) nad streamem, který vrací 0. Pokud se podívám do ClobInputStreamu, který bude zřejmě tím streamem, který vrátí 0, pak v metodě read(...) je něco ve smyslu:

int i1 = implClob.readData(abyte0, i, l, k);
currentPosition += i1;
return i1;

kde asi nejpravděpodobnější vznik 0 bude při currentPosition 0, protože pak je celkem logické, že abstraktní implClob (BaseImplClob) vrátí 0.