準備済み文と列のストリーミング setXXXStream requestsStreaming columnsas IN parameters to prepared statement setBinaryStreamsetAsciiStream setUnicodeStreamUnicodesetUnicodeStream setBinaryStreamsetAsciiStream setUnicodeStreamUnicodesetUnicodeStream

setXXXStreamにより、アプリケーションとデータベース間で情報を通信させることができます。

JDBCではINの引数に、Javaの入力ストリームをとって、大規模な情報を小分けにして渡すことができます。文が実行されると、JDBCドライバはこの入力ストリームへの呼び出しを繰り返します。 ではJDBC 1.2が提供する三種類のストリームを利用することができます。 この三種類のストリームとは、

  • setBinaryStream

    解釈されないバイトストリームに使われます。

  • setAsciiStream

    ASCII文字のストリームに使われます。

  • setUnicodeStream

    Unicode文字のストリームに使われます。

JDBC 2.0やJDBC 3.0ではストリームの長さを指定する必要があります。ではアプリケーションがJDK 1.5以前の環境で動作している時、この事は要件です。JDK1.6以降の環境では、はJDBC4.0の実装を提供します。これによりストリーム長を指定する必要のないストリームのインターフェイスを使うことができます。 これらの三つのメソッドに渡すストリームオブジェクトは、標準のJavaストリームオブジェクトあるいは標準のjava.io.InputStreamインターフェイスを実装する、ユーザが定義したサブクラスの何れであっても構いません。

JDBCの標準に従い、ストリームは以下の表に記すデータ型の列に対してのみ記録できます。 ストリーム可能なJDBCのデータ型 列のデータ型 対応するJavaの型 AsciiStream UnicodeStream BinaryStream CLOB java.sql.Clob x x CHAR x x VARCHAR x x LONGVARCHAR X X BINARY x x x BLOB java.sql.Blob x x x VARBINARY x x x LONGVARBINARY x x X

  • この表にて大文字のXは、ストリームの型として推奨される対照型である事を表します。を参照してください。
  • もしストリームの記録される列の型がLONG VARCHARないしLONG VARCHAR FOR BIT DATAの何れでも無い場合、ストリーム全体が一括してメモリに収まらなければなりません。 LONG VARCHARおよびLONG VARCHAR FOR BIT DATAの列に記録されるストリームについては、この制限はありません。
  • ストリームを他の組み込みデータ型やユーザが定義したデータ型に記録することはできません。

以下の例はjava.io.Fileをストリーム経由でLONG VARCHAR型の列に格納する方法を示します。 Statement s = conn.createStatement(); s.executeUpdate("CREATE TABLE atable (a INT, b LONG VARCHAR)"); conn.commit(); java.io.File file = new java.io.File("derby.txt"); int fileLength = (int) file.length(); // まず入力ストリームを作ります。 java.io.InputStream fin = new java.io.FileInputStream(file); PreparedStatement ps = conn.prepareStatement( "INSERT INTO atable VALUES (?, ?)"); ps.setInt(1, 1); // 入力パラメータに入力ストリームを代入します。 ps.setAsciiStream(2, fin, fileLength); ps.execute(); conn.commit();