基本データ型の使用
Microsoft JDBC Driver for SQL Server では、SQL Server データ型を Java プログラミング言語が認識する形式に変換する (およびその逆を行う) ために、JDBC 基本データ型が使用されます。 JDBC ドライバー は SQLXML データ型を含む JDBC 4.0 api および NCHAR、 NVARCHAR、 LONGNVARCHAR、そして NCLOB のような National (Unicode) データ型のサポートを提供します。
データ型マッピング
次の表は、SQL Server、JDBC、および Java プログラミング言語の基本データ型間で行われる既定のマッピングを示しています。
SQL Server 型 | JDBC 型 (java.sql.Types) | Java 言語型 |
---|---|---|
bigint | bigint | long |
binary | BINARY | byte[] |
bit | BIT | boolean |
char | CHAR | String |
date | DATE | java.sql.Date |
datetime3 | timestamp | java.sql.Timestamp |
datetime2 | timestamp | java.sql.Timestamp |
datetimeoffset2 | microsoft.sql.Types.DATETIMEOFFSET | microsoft.sql.DateTimeOffset |
decimal | DECIMAL | java.math.BigDecimal |
float | DOUBLE | double |
image | LONGVARBINARY | byte[] |
INT | INTEGER | INT |
money | DECIMAL | java.math.BigDecimal |
nchar | CHAR NCHAR (Java SE 6.0) |
String |
ntext | LONGVARCHAR LONGNVARCHAR (Java SE 6.0) |
String |
numeric | NUMERIC | java.math.BigDecimal |
nvarchar | VARCHAR NVARCHAR (Java SE 6.0) |
String |
nvarchar(max) | VARCHAR NVARCHAR (Java SE 6.0) |
String |
real | real | float |
smalldatetime | timestamp | java.sql.Timestamp |
smallint | SMALLINT | short |
smallmoney | DECIMAL | java.math.BigDecimal |
text | LONGVARCHAR | String |
time | TIME1 | java.sql.Time1 |
timestamp | BINARY | byte[] |
tinyint | TINYINT | short |
udt | VARBINARY | byte[] |
UNIQUEIDENTIFIER | CHAR | String |
varbinary | VARBINARY | byte[] |
varbinary(max) | VARBINARY | byte[] |
varchar | VARCHAR | String |
varchar(max) | VARCHAR | String |
xml | LONGVARCHAR LONGNVARCHAR (Java SE 6.0) |
String SQLXML |
sqlvariant | microsoft.sql.Types.SQL_VARIANT | Object |
geometry | VARBINARY | byte[] |
geography | VARBINARY | byte[] |
1 時刻の SQL Server データ型を持つ java.sql.Time を使用する場合は、sendTimeAsDatetime 接続プロパティを false に設定します。
2DateTimeOffset Class で datetimeoffset の値にプログラムでアクセスできます。
3 SQL Server 2016 以降、datetime 列からの値を比較するために java.sql.Timestamp 値を使用することができなくなりました。 この制限は、datetime を datetime2 に異なるように変換し、値が同じでなくなるサーバー側の変更に起因するものです。 この問題を回避するには、datetime 列を datetime2(3) に変更するか、java.sql.Timestamp ではなく String を使用するか、データベースの互換性レベルを 120 以下に変更します。
以下のセクションでは、JDBC ドライバーと基本データ型の使用方法の例を示します。 Java アプリケーションの基本データ型の使用方法の詳細例については、「基本データ型のサンプル」をご覧ください。
文字列としてのデータの取得
文字列として参照するために JDBC 基本データ型にマップされるデータ ソースからデータを取得する必要がある場合、または厳密に型指定されたデータを必要としない場合は、SQLServerResultSet クラスの getString メソッドを使用します。 次の例はこの使用例を示しています。
try(Statement stmt = con.createStatement();) {
ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
rs.next();
short empJobID = rs.getString("job_id");
}
データ型によるデータの取得
データ ソースからデータを取得する必要があり、取得するデータの型がわかっている場合は、SQLServerResultSet クラスのいずれかの get<Type> メソッドを使用します。これらは、"getter メソッド" とも呼ばれます。 get<Type> メソッドでは、次の例ように列名または列インデックスを使用できます。
try(Statement stmt = con.createStatement();) {
ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
rs.next();
short empJobID = rs.getShort("job_id");
}
Note
getUnicodeStream メソッドおよび小数点以下桁数付きの getBigDecimal メソッドは、JDBC ドライバーでは非推奨とされているため、サポートされていません。
データ型によるデータの更新
データ ソースのフィールドの値を更新する必要がある場合は、SQLServerResultSet クラスのいずれかの update<Type> メソッドを使用します。 次の例では、updateInt メソッドを updateRow メソッドと一緒に使用し、データ ソース内のデータを更新します。
try (Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);) {
ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
rs.next();
int empJobID = rs.getInt(2);
empJobID++;
rs.first();
rs.updateInt(2, empJobID);
rs.updateRow();
}
Note
JDBC ドライバーは、127 文字を超える列名の SQL Server の列を更新できません。 列名が 127 文字を超える列を更新しようとすると、例外がスローされます。
パラメーター化クエリによるデータの更新
パラメーター化クエリを使用してデータ ソースのデータを更新する場合は、SQLServerPreparedStatement クラスのいずれかの set<Type> メソッドを使用して、パラメーターのデータ型を設定できます。 これらのメソッドはセッター メソッドとも呼ばれます。 次の例では、prepareStatement メソッドを使用して、パラメーター化クエリをプリコンパイルし、setString メソッドを使用してパラメーターの文字列値を設定してから、executeUpdate メソッドを呼び出します。
try(PreparedStatement pstmt = con.prepareStatement("UPDATE employee SET fname = ? WHERE (lname = 'Brown')");) {
String name = "Bob";
pstmt.setString(1, name);
int rowCount = pstmt.executeUpdate();
}
パラメーター化されたクエリの詳細については、「パラメーターでの SQL ステートメントの使用」を参照してください。
ストアド プロシージャにパラメーターを渡す
入力されたパラメーターをストアド プロシージャに渡す必要がある場合は、SQLServerCallableStatement クラスのいずれかの set<Type> メソッドを使用して、インデックスまたは名前でパラメーターを設定できます。 次の例では、prepareCall メソッドを使用してストアド プロシージャへの呼び出しを設定し、setString メソッドを使用して呼び出し用のパラメーターを設定してから、executeQuery メソッドを呼び出します。
try(CallableStatement cstmt = con.prepareCall("{call employee_jobid(?)}");) {
String lname = "Brown";
cstmt.setString(1, lname);
ResultSet rs = cstmt.executeQuery();
}
Note
この例では、結果セットはストアド プロシージャの実行結果で返されます。
BigDecimal
BigDecimal パラメーター値を使用している場合は、setBigDecimal
を通じて有効桁数と小数点以下桁数を値とともに渡すことができます。 このように setBigDecimal
を使用すると、潜在的な値の切り捨てが回避されます。 または、接続文字列 オプション calcBigDecimalPrecision
が true
に設定されている場合、ドライバーは、パフォーマンスを犠牲にして、ユーザーの代わりに BigDecimal 入力の精度を計算します。 calcBigDecimalPrecision
設定なし、または false
へのオプション設定で、値が単独で渡される場合、ドライバーは、その BigDecimal 値の有効桁数の最大値 (38) を想定します。
JDBC ドライバーでストアド プロシージャと入力パラメーターを使用する方法の詳細については、「入力パラメーターがあるストアド プロシージャの使用」を参照してください。
ストアド プロシージャからのパラメーターの取得
ストアド プロシージャからパラメーターを取得する必要がある場合は、まず SQLServerCallableStatement クラスの registerOutParameter メソッドを使用して名前またはインデックスで out
パラメーターを登録し、ストアド プロシージャへの呼び出しを実行します。 次に、ストアド プロシージャの呼び出しを実行した後、返された out パラメーターを適切な変数に割り当てます。 次の例では、prepareCall メソッドを使用してストアド プロシージャへの呼び出しを設定し、registerOutParameter メソッドを使用して out
パラメーターを設定します。次に、setString メソッドを使用して呼び出し用のパラメーターを設定してから、executeQuery メソッドを呼び出します。 ストアド プロシージャの out
パラメーターの値は、getShort メソッドを使用して取得します。
try(CallableStatement cstmt = con.prepareCall("{call employee_jobid (?, ?)}");) {
cstmt.registerOutParameter(2, java.sql.Types.SMALLINT);
String lname = "Brown";
cstmt.setString(1, lname);
ResultSet rs = cstmt.executeQuery();
short empJobID = cstmt.getShort(2);
}
Note
out パラメーターが返されるだけでなく、ストアド プロシージャの実行結果により作成された結果セットが返されることもあります。
JDBC ドライバーでストアド プロシージャと出力パラメーターを使用する方法の詳細については、「出力パラメーターがあるストアド プロシージャの使用」を参照してください。