次の方法で共有


高度なデータ型の使用

Microsoft SQL Server JDBC Driver は、JDBC の高度なデータ型を使用して、SQL Server データ型を Java プログラミング言語によって認識できる形式に変換します。

次の表は、SQL Server、JDBC、および Java プログラミング言語の高度なデータ型間で行われる既定のマッピングを示しています。

SQL Server 型 JDBC 型 (java.sql.Types) Java 言語型

varbinary(max)

image

LONGVARBINARY

byte[] (既定)、Blob、InputStream、String

text

varchar(max)

LONGVARCHAR

String (既定)、Clob、InputStream

ntext

nvarchar(max)

LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)

String (既定)、Clob、NClob (Java SE 6.0)

xml

LONGVARCHAR

SQLXML (Java SE 6.0)

String (既定)、InputStream、Clob、byte[]、Blob、SQLXML (Java SE 6.0)

udt

VARBINARY

String (既定)、byte[]、InputStream

以下のセクションでは、JDBC ドライバーと高度なデータ型の使用方法の例を示します。

BLOB、CLOB、および NCLOB データ型

JDBC ドライバーは、java.sql.Blob、java.sql.Clob、および java.sql.NClob インターフェイスのすべてのメソッドを実装しています。

注メモ :

CLOB 値は、SQL Server 2005 の大きな値のデータ型で使用できます。特に、CLOB 型は varchar(max) データ型と nvarchar(max) データ型で、BLOB 型は varbinary(max) データ型と image データ型で、NCLOB 型は ntextnvarchar(max) で使用できます。

大きな値のデータ型

以前のバージョンの SQL Server では、大きな値のデータ型には特殊な処理が必要でした。大きな値のデータ型とは、最大行サイズが 8 KB を超えるデータ型のことです。SQL Server では、varcharnvarchar、および varbinary データ型のための max 指定子により、最大 2^31 バイトの値を格納できます。テーブルの列と Transact-SQL 変数では、varchar(max)nvarchar(max)、または varbinary(max) データ型を指定できます。

大きな値の型を操作する主要なシナリオには、データベースからの取得とデータベースへの追加があります。以下のセクションでは、これらのタスクを実行するためのさまざまな方法について説明します。

データベースからの大きな値の型の取得

varchar(max) データ型などのバイナリ以外の大きな値のデータ型をデータベースから取得する場合は、データを文字ストリームとして読み取ることができます。以下の例では、SQLServerStatement クラスの executeQuery メソッドを使用してデータベースからデータを取得し、これを結果セットとして返します。次に、SQLServerResultSet クラスの getCharacterStream メソッドを使用し、大きな値のデータを結果セットから読み取ります。

ResultSet rs = stmt.executeQuery("SELECT TOP 1 * FROM Test1");
rs.next();
Reader reader = rs.getCharacterStream(2);
注メモ :

この方法は、textntext、および nvarchar(max) データ型に対しても使用できます。

varbinary(max) データ型などのバイナリの大きな値のデータ型をデータベースから取得する場合は、いくつかの方法があります。最も効率的に行うには、次のようにバイナリ ストリームとしてデータを読み取ります。

ResultSet rs = stmt.executeQuery("SELECT photo FROM mypics");
rs.next();
InputStream is = rs.getBinaryStream(2);

また、getBytes メソッドを使用し、次のように byte 配列としてデータを読み取ることもできます。

ResultSet rs = stmt.executeQuery("SELECT photo FROM mypics");
rs.next();
byte [] b = rs.getBytes(2);
注メモ :

BLOB としてデータを読み取ることもできます。ただし、前述の 2 つの方法より効率が下がります。

データベースへの大きな値の型の追加

JDBC ドライバーを使用した大きいデータのアップロードは、メモリ内に収まる場合は、適切に行うことができます。メモリ内に収まらない場合は、ストリームを使用するのが主要なオプションです。ただし、最も効率的に大きいデータをアップロードするためには、ストリーム インターフェイスを使用します。

次に示すように、文字列やバイトを使用する方法もあります。

PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1 (c1_id, c2_vcmax) VALUES (?, ?)");
pstmt.setInt(1, 1);
pstmt.setString(2, htmlStr);
pstmt.executeUpdate();
注メモ :

この方法は、textntext、および nvarchar(max) 列に格納される値に対しても使用できます。

サーバーにイメージ ライブラリがあり、バイナリ イメージ ファイル全体を varbinary(max) 列にアップロードする必要がある場合、JDBC ドライバーで最も効率的にこれを行うには、次に示すようにストリームを直接使用します。

PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1 (Col1, Col2) VALUES(?,?)");
File inputFile = new File("CLOBFile20mb.jpg");
FileInputStream inStream = new FileInputStream(inputFile);
int id = 1;
pstmt.setInt(1,id);
pstmt.setBinaryStream(2, inStream);
pstmt.executeUpdate();
inStream.close();
注メモ :

CLOB または BLOB メソッドの使用は、大きいデータをアップロードする際に効率的ではありません。

データベースの大きな値の型の変更

多くの場合、データベースの大きい値を更新または変更する際は、UPDATE、WRITE、SUBSTRING などの Transact-SQL コマンドを使用して、SQLServerPreparedStatementSQLServerCallableStatement クラス経由でパラメーターを渡して行うことをお勧めします。

アーカイブされた HTML ファイルなどの大きいテキスト ファイル内で、ある単語を置き換える必要がある場合は、次のように Clob オブジェクトを使用することができます。

String SQL = "SELECT * FROM test1;";
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery(SQL);
rs.next();

Clob clob = rs.getClob(2);
long pos = clob.position("dog", 1);
clob.setString(pos, "cat");
rs.updateClob(2, clob);
rs.updateRow();

また、すべての作業をサーバー上で行い、準備された UPDATE ステートメントにパラメーターを渡すこともできます。

大きな値の型の詳細については、SQL Server オンライン ブックの「大きな値をとるデータ型の使用」を参照してください。

XML データ型

SQL Server 2005 以降の SQL Server には、XML ドキュメントとフラグメントを SQL Server データベースに格納できる xml データ型が用意されています。xml データ型は SQL Server の組み込みデータ型で、intvarchar などの他の組み込みデータ型といくつかの点で似ています。他の組み込み型と同様に、xml データ型は、テーブルの作成時に列型として使用したり、変数の型やパラメーターの型、関数の戻り値の型として使用したり、Transact-SQL CAST や CONVERT 関数内で使用したりすることができます。

JDBC ドライバーでは、xml データ型は、文字列、byte 配列、ストリーム、CLOB、BLOB、または SQLXML オブジェクトとしてマップできます。文字列が既定値です。JDBC Driver Version 2.0 以降では、SQLXML インターフェイスを導入した JDBC 4.0 API がサポートされます。SQLXML インターフェイスには、XML データを操作するための各種のメソッドが定義されています。SQLXML データ型は、SQL Server の xml データ型にマップされます。SQLXML Java データ型を使用して、リレーショナル データベースから XML データを読み取ったり、リレーショナル データベースに XML データを書き込んだりする方法については、「XML データのサポート」を参照してください。

JDBC ドライバーにおける xml データ型の実装では、以下の操作がサポートされます。

  • 最も一般的なプログラミング シナリオに対し、標準 Java UTF-16 文字列として XML にアクセスできます。

  • UTF-8 および他の 8 ビットでエンコードされた XML を入力できます。

  • 他の XML プロセッサやディスク ファイルとのやり取りのために UTF-16 でエンコードされている場合、先頭に BOM の付いた byte 配列として XML にアクセスできます。

SQL Server は、UTF-16 でエンコードされた XML に対しては先頭の BOM が必要です。アプリケーションが BOM を提供する必要があるのは、XML パラメーター値が byte 配列として指定されている場合です。SQL Server は、BOM の付かない、または埋め込みのエンコーディング宣言を持たない UTF-16 文字列として常に XML 値を出力します。XML 値が byte[]、BinaryStream、または Blob として取得される場合、UTF-16 BOM が値の前に付いています。

xml データ型の詳細については、SQL Server オンライン ブックの「xml データ型」を参照してください。

ユーザー定義データ型

SQL Server 2005 にユーザー定義型 (UDT) が導入されたことにより、オブジェクトやカスタム データ構造を SQL Server データベースに格納できるため、SQL 型システムを拡張することができます。UDT は複数のデータ型を持つことができ、動作を定義できます。この点は、1 つの SQL Server システム データ型から構成される従来の別名データ型と異なります。UDT は、検証可能なコードを生成する、Microsoft .NET 共通言語ランタイム (CLR) によってサポートされている任意の言語を使用して定義されます。その言語には、Microsoft Visual C# および Visual Basic .NET が含まれます。データは .NET Framework ベースのクラスまたは構造体のフィールドとプロパティとして公開され、動作はクラスまたは構造体のメソッドによって定義されます。

SQL Server では、UDT をテーブルの列定義、Transact-SQL バッチの変数、または Transact-SQL の関数やストアド プロシージャの引数として使用できます。

ユーザー定義データ型の詳細については、SQL Server オンライン ブックの「ユーザー定義型のインスタンスの使用と変更」を参照してください。

参照

その他の技術情報

JDBC ドライバのデータ型について