Question & Answer
Question
JDBC を使った照会で、列名に AS で別名を指定しても、アプリケーションから別名で参照できません。 以前のバージョンでは期待通り動作していましたが、なぜ参照できなくなったのでしょうか。また、元の動作に戻すことはできますか。
Cause
IBM Data Server Driver for JDBC and SQLJ バージョン 4.0 以降、ResultSetMetaData.getColumnName および ResultSetMetaData.getColumnLabel のデフォルトの動作が変更されています。
列名に AS で別名を指定している場合、バージョン 4.0 以前では ResultSetMetaData.getColumnName と ResultSetMetaData.getColumnLabel は別名を返しますが、バージョン 4.0 以降では ResultSetMetaData.getColumnName は元の列名を、ResultSetMetaData.getColumnLabel は別名を返します。
列名に AS で別名を指定している場合、バージョン 4.0 以前では ResultSetMetaData.getColumnName と ResultSetMetaData.getColumnLabel は別名を返しますが、バージョン 4.0 以降では ResultSetMetaData.getColumnName は元の列名を、ResultSetMetaData.getColumnLabel は別名を返します。
- [サンプル・コード]
Connection con = ds.getConnection(); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT EMPNO AS EMPLOYEE_NUMBER FROM EMPLOYEE"); String colname = rsmd.getColumnName(1); String collabel = rsmd.getColumnLabel(1); System.out.println("Column Name: " + colname); System.out.println("Column Label: " + collabel); while(rs.next()){ System.out.println("Employee Number: " + rs.getString(colname)); }
$ java ColumnName Column Name: EMPLOYEE_NUMBER Column Label: EMPLOYEE_NUMBER Employee Number: 000010
$ java ColumnName Column Name: EMPNO Column Label: EMPLOYEE_NUMBER com.ibm.db2.jcc.am.SqlException: [jcc][10150][10300][4.13.80] パラメーターが無効です: 列名 EMPNO は不明です。 ERRORCODE=-4460, SQLSTATE=null at com.ibm.db2.jcc.am.id.a(id.java:661) at com.ibm.db2.jcc.am.id.a(id.java:60) at com.ibm.db2.jcc.am.id.a(id.java:103) at com.ibm.db2.jcc.am.hb.a(hb.java:2117) at com.ibm.db2.jcc.am.tn.a(tn.java:1932) at com.ibm.db2.jcc.am.tn.getString(tn.java:1704) at ColumnName.run(ColumnName.java:37) at ColumnName.main(ColumnName.java:9)
Answer
バージョン 4.0 以前と同様の動作に戻すためには、useJDBC4ColumnNameAndLabelSemantics プロパティーに DB2BaseDataSource.NO (2) を指定してください。
以前と同様、ResultSetMetaData.getColumnName と ResultSetMetaData.getColumnLabel はどちらも別名を返すようになります。
以前と同様、ResultSetMetaData.getColumnName と ResultSetMetaData.getColumnLabel はどちらも別名を返すようになります。
- [サンプル・コード]
((DB2BaseDataSource) ds).setUseJDBC4ColumnNameAndLabelSemantics(DB2BaseDataSource.NO); Connection con = ds.getConnection(); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT EMPNO AS EMPLOYEE_NUMBER FROM EMPLOYEE"); String colname = rsmd.getColumnName(1); String collabel = rsmd.getColumnLabel(1); System.out.println("Column Name: " + colname); System.out.println("Column Label: " + collabel); while(rs.next()){ System.out.println("Employee Number: " + rs.getString(colname)); }
$ java TestSelect Column Name: EMPLOYEE_NUMBER Column Label: EMPLOYEE_NUMBER Employee Number: 000010
運用上の考慮点
WebSphere Application Server 上の Web アプリケーションに useJDBC4ColumnNameAndLabelSemantics プロパティーを設定するには、お使いのデータソースのカスタム・プロパティを変更してください。
関連情報
IBM Data Server Driver for JDBC and SQLJ のバージョン間での JDBC の相違点
ResultSetMetaData.getColumnName および ResultSetMetaData.getColumnLabel の値の例
Db2 サーバーに共通の IBM Data Server Driver for JDBC and SQLJ のプロパティー
[Db2] Db2 が提供している JDBC ドライバーの種類
WebSphere Application Server 上の Web アプリケーションに useJDBC4ColumnNameAndLabelSemantics プロパティーを設定するには、お使いのデータソースのカスタム・プロパティを変更してください。
関連情報
IBM Data Server Driver for JDBC and SQLJ のバージョン間での JDBC の相違点
ResultSetMetaData.getColumnName および ResultSetMetaData.getColumnLabel の値の例
Db2 サーバーに共通の IBM Data Server Driver for JDBC and SQLJ のプロパティー
[Db2] Db2 が提供している JDBC ドライバーの種類
[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PmVAAU","label":"Programming Interface-\u003EJDBC"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]
Was this topic helpful?
Document Information
Modified date:
26 October 2023
UID
swg21601214