<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>

<!--#include file="head_common.html" -->

	<title>JDBCでDBアクセス SQLデータ型のマッピング</title>
</head>
<body>
	<script LANGUAGE="JAVASCRIPT">
	<!--
	var ID="100258178-mapping";
	var AD=0;
	var FRAME=0;
	// -->
	</script>
	<script LANGUAGE="JAVASCRIPT" SRC="http://j1.ax.xrea.com/l.j?id=100258178">
	</script>
	<noscript>
		<a HREF="http://w1.ax.xrea.com/c.f?id=100258178" TARGET="_blank"><IMG SRC="http://w1.ax.xrea.com/l.f?id=100258178-mapping&url=X" BORDER="0"></A>
	</noscript>

<!--#include file="header.html" -->

	<h2>
		<a name=type>
		</a>
		対応するデータ型
	</h2>
	<p>DBMS毎データ型の動作確認結果です。</P>
	<p>検索結果セル上で、ポップアップメニューの「SQLデータ型マッピング...」を選択すると、自由に設定変更できます。</p>
	<p>また、この表に存在しないデータ型の場合、getObjectでデータ取得指定し「Object Tree」画面で表示すれば、リフレクションを使用したJavaObjectの中身（変数）を参照できます。</p>
	<p>文字列表現を諦めれば、急場しのぎとして何でも表示可能です。</p>
	<p>バージョン0.4.4以降での情報です、それより前のバージョンではこの表の通りには動きません。</P>
	<h3>Oracle</h3>
	<p>
		<table>
		<tr>
			<th>SQLデータ型</th>
			<th>参照更新</Th>
			<th>CSV</Th>
			<th>ResultSetのgetter</Th>
			<th>内部動作javaデータ型</Th>
			<th>補足</th>
		</tr>
		<tr>
			<td>NUMBER</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.math.BigDecimal</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>VARCHAR</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>NVARCHAR</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>VARCHAR2</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>NVARCHAR2</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>DATE</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getTimestamp</TD>
			<td>jdbcacsess.sql.column.GetColumnTimestampSS</TD>
			<td>'YYYY-MM-DD HH24:MI:SS' 形式で使用する事になｒます。</TD>
		</tr>
		<tr>
			<td>LONG</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>BINARY_FLOAT</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getFloat</TD>
			<td>java.lang.Float</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>BINARY_DOUBLE</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getDouble</TD>
			<td>java.lang.Double</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>TIMESTAMP(9)</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getTimestamp</TD>
			<td>java.sql.Timestamp</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>TIMESTAMP(9) WITH TIME ZONE</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getString</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>TIMESTAMP(9) WITH LOCAL TIME ZONE</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getTimestamp</TD>
			<td>java.sql.Timestamp</TD>
			<td>
				DBサーバのタイムゾーンを設定する必要があります。<br>
				java実行環境デフォルトタイムゾーンで表示更新を行います。
			</td>
		</tr>
		<tr>
			<td>INTERVAL YEAR(9) TO MONTH</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>oracle.sql.INTERVALYM</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>INTERVAL DAY(9) TO SECOND(6)</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>oracle.sql.INTERVALYM</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>RAW</TD>
			<td>○</TD>
			<td>←</TD>
			<td>
				getBytes 又は<br>
				getBinaryStream
			</td>
			<td>jdbcacsess.sql.column.GetColumnBytesOrBinaryStream</TD>
			<td>
				16進文字列形式で扱います<br>
				読込バイト数が無制限の時はgetBytes<br>
				指定した時はgetBinaryStream
			</td>
		</tr>
		<tr>
			<td>LONG RAW</TD>
			<td>○</TD>
			<td>←</TD>
			<td>
				getBytes 又は<br>
				getBinaryStream
			</td>
			<td>jdbcacsess.sql.column.GetColumnBytesOrBinaryStream</TD>
			<td>
				16進文字列形式で扱います<br>
				読込バイト数が無制限の時はgetBytes<br>
				指定した時はgetBinaryStream
			</td>
		</tr>
		<tr>
			<td>CHAR</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>NCHAR</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>CLOB</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getClob</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>NCLOB</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getClob</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>BLOB</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getBlob</TD>
			<td>jdbcacsess.sql.column.GetColumnBlob</TD>
			<td>16進文字列形式で扱います</TD>
		</tr>
		<tr>
			<td>BFILE</TD>
			<td>×</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>-</TD>
			<td>DB機能を理解してません</TD>
		</tr>
		<tr>
			<td>配列</TD>
			<td>△</TD>
			<td>←</TD>
			<td>getArray</TD>
			<td>jdbcacsess.sql.column.GetColumnArray</TD>
			<td>一部データ型の参照だけ、更新不可</TD>
		</tr>
		<tr>
			<td>オブジェクト</TD>
			<td>×</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>-</TD>
			<td>DB機能を理解してません</TD>
		</tr>
		</table>
	</p>
	<h3>PostgreSQL</h3>
	<p>
		<table>
		<tr>
			<th>SQLデータ型</th>
			<th>参照更新</Th>
			<th>CSV</Th>
			<th>ResultSetのgetter</Th>
			<th>内部動作javaデータ型</Th>
			<th>補足</th>
		</tr>
		<tr>
			<td>
				decimal<br>
				numeric
			</td>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.math.BigDecimal</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>int2</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.Short</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>
				int4<br>
				serial
			</td>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.Integer</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>int8</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.Long</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>float4</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.Float</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>float8</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.Double</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>char</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>text</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>varchar</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>bytea</TD>
			<td>○</TD>
			<td>←</TD>
			<td>
				getBytes 又は<br>
				getBinaryStream
			</td>
			<td>jdbcacsess.sql.column.GetColumnBytesOrBinaryStream</TD>
			<td>
				16進文字列形式で扱います<br>
				読込バイト数が無制限の時はgetBytes<br>
				指定した時はgetBinaryStream
			</td>
		</tr>
		<tr>
			<td>timestamp</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.sql.Timestamp</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>interval</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getString</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>date</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.sql.Date</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>time</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.sql.Time</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>boolean</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.Boolean</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>bit</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getString</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>bit varying</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getString</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>point</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getString</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>circle</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getString</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>cidr</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getString</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>inet</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getString</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>macaddr</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getString</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>timestamptz</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getString</TD>
			<td>java.lang.String</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>配列</TD>
			<td>△</TD>
			<td>←</TD>
			<td>getArray</TD>
			<td>jdbcacsess.sql.column.GetColumnArray</TD>
			<td>一部データ型の参照及び更新</TD>
		</tr>
		</table>
	</p>
	<h3>MySQL</h3>
	<p>
		<table>
		<tr>
			<th>SQLデータ型</th>
			<th>参照更新</Th>
			<th>CSV</Th>
			<th>ResultSetのgetter</Th>
			<th>内部動作javaデータ型</Th>
			<th>補足</th>
		</tr>
		<tr>
			<td>TINYINT</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.Integer</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>SMALLINT</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.Integer</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>MEDIUMINT</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.Integer</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>INT</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.lang.Integer</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>FLOAT</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>ava.lang.Float</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>DOUBLE</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>ava.lang.Double</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>
				DECIMAL<br>
				NUMERIC
			</td>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.math.BigDecimal</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>DATE</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.sql.Date</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>DATETIME</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getTimestamp</TD>
			<td>jdbcacsess.sql.column.GetColumnTimestampSS</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>TIMESTAMP</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getTimestamp</TD>
			<td>jdbcacsess.sql.column.GetColumnTimestampSS</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>TIME</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getObject</TD>
			<td>java.sql.Time</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>YEAR</TD>
			<td>○</TD>
			<td>←</TD>
			<td>getDate</TD>
			<td>jdbcacsess.sql.column.GetColumnDateYYYY</TD>
			<td>
			</td>
		</tr>
		<tr>
			<td>BLOB</TD>
			<td>○</TD>
			<td>←</TD>
			<td>
				getBytes 又は<br>
				getBinaryStream
			</td>
			<td>jdbcacsess.sql.column.GetColumnBytesOrBinaryStream</TD>
			<td>
				16進文字列形式で扱います<br>
				読込バイト数が無制限の時はgetBytes<br>
				指定した時はgetBinaryStream
			</td>
		</tr>
		<tr>
			<td>TINYBLOB</TD>
			<td>○</TD>
			<td>←</TD>
			<td>
				getBytes 又は<br>
				getBinaryStream
			</td>
			<td>jdbcacsess.sql.column.GetColumnBytesOrBinaryStream</TD>
			<td>
				16進文字列形式で扱います<br>
				読込バイト数が無制限の時はgetBytes<br>
				指定した時はgetBinaryStream
			</td>
		</tr>
		<tr>
			<td>MEDIUMBLOB</TD>
			<td>○</TD>
			<td>←</TD>
			<td>
				getBytes 又は<br>
				getBinaryStream
			</td>
			<td>jdbcacsess.sql.column.GetColumnBytesOrBinaryStream</TD>
			<td>
				16進文字列形式で扱います<br>
				読込バイト数が無制限の時はgetBytes<br>
				指定した時はgetBinaryStream
			</td>
		</tr>
		<tr>
			<td>LONGBLOB</TD>
			<td>○</TD>
			<td>←</TD>
			<td>
				getBytes 又は<br>
				getBinaryStream
			</td>
			<td>jdbcacsess.sql.column.GetColumnBytesOrBinaryStream</TD>
			<td>
				16進文字列形式で扱います<br>
				読込バイト数が無制限の時はgetBytes<br>
				指定した時はgetBinaryStream
			</td>
		</tr>
		<tr>
			<td>BIT</TD>
			<td>
				△<br>
				参照のみ
			</td>
			<td>×</TD>
			<td>
				getBytes 又は<br>
				getBinaryStream
			</td>
			<td>jdbcacsess.sql.column.GetColumnBytesOrBinaryStream</TD>
			<td>
				バイト単位の桁数しか扱えません。<br>
				"対応してない"と考えてください
			</td>
		</tr>
		<tr>
			<td>BOOLEAN</TD>
			<td>○？</TD>
			<td>×</TD>
			<td>getObject</TD>
			<td>java.lang.Integer</TD>
			<td>
				何でintなのだろうか？,3,4,5,6,7,8,9への更新もできる。<br>
				"対応してない"と考えてください
			</td>
		</tr>
		</table>
	</p>
	<h2>
		<a name="sikumi">
		</a>
		データ表示更新の仕組み
	</h2>
	<p>上記データ型以外では、『クラス名@１６進文字列』が表示されたり、エラーが発生し、うまく扱えない可能性があります。</p>
	<p>データ表示更新の仕組みの簡単な解説と、その対応としてSQLデータ型マッピング方法を示します。</p>
	<h3>検索結果の表示</h3>
	<p>
		JDBCドライバは、DBMSのデータ型に応じたクラスのオブジェクトを返してくれるので、そのままのJTableに引渡し、
		DefaultTableCellRendererの表示に任せています。そして、DefaultTableCellRendererは表示する為に、そのオブジェクトのtoString()を呼び出します。
	</p>
	<p>特殊なデータ型を検索すると、『クラス名@１６進文字列』が画面表示されてしまうのですが、これは、検索結果オブジェクトのクラスでtoString()をオーバライドしていない為に、ObjectクラスのtoString()が実行された事を意味します。</P>
	<p>処理概要を、少し具体的に示します。</P>
	<p>
		<table >
		<tr>
			<th>　</th>
			<th>Intデータ型を検索した場合</th>
			<th>BLOBデータ型を検索した場合</th>
		</tr>
		<tr>
			<td>本ツールの結果取得処理がJDBCドライバのgetObjectを呼ぶ</TD>
			<td>java.lang.Integerのオブジェクトを得る</TD>
			<td>java.sql.Blobのオブジェクトを得る</TD>
		</tr>
		<tr>
			<td>
				Swingが表示データを要求するので検索結果を渡す。<br>
				SwingがDefaultTableCellRendereを呼ぶ。
			</td>
			<td>-</TD>
			<td>-</TD>
		</tr>
		<tr>
			<td>DefaultTableCellRendererがtoString()を呼ぶ</TD>
			<td>
				java.lang.Integer#toString()は<br>
				数値で構成される文字列を返す
			</td>
			<td>
				java.sql.Blob#toString()は<br>
				Object#toStringをオーバライドしていないので、<br>
				『クラス名@１６進文字列』を返す
			</td>
		</tr>
		<tr>
			<td>DefaultTableCellRendererの表示</TD>
			<td>
				JLabelにtoString()の結果設定。<br>
				また、数値系のクラスなので右詰表示する。
			</td>
			<td>JLabelに『クラス名@１６進文字列』を設定。</TD>
		</tr>
		</table>
	</p>
	<h3>getObjectに頼れないデータ型</h3>
	<p>処理基本をまとめると、こんな感じです。（データ型毎の処理を行わすに手を抜く作戦）</P>
	<ol>
		<li>
		画面表示したい内容＝検索結果オブジェクト#toString()　が成り立てば、JDBCドライバがどんなオブジェクトを返しても、特別な処理は不要<br>
		<li>検索結果オブジェクトの取得は、『検索結果データ型を判断せずに、適切なオブジェクトが受取れる』のでgetObject()を使用</LI>
	</ol>
	<p>
	但し、getObject()の使用には、ちょっと難があります。Oracleのように独自クラスのオブジェクトを返すJDBCドライバもあり、特別な処理は避けられません。<br>
	現在、以下の特別処理を行ってます。
	詳しい理由は忘れてしまったので、？の部分には嘘が含まれています（笑）。
	<ul>
		<li>
		バイナリ配列のデータ型
		<p>
			getObject()の結果で受取るデータ型が、byte[]なので、toString()出来ない？
			ツール独自のBinaryクラスを用意・独自のCellEditorも用意して特殊編集してます。
		</p>
		<li>
		Blob/Clobのデータ型
		<p>OracleのBlobは、getBlobでしか受取れない？</P>
		<li>
		OracleのDate型
		<p>
		OracleのDateは、小数点以下の秒を扱えないのに、getObject()でjava.sql.TimeStampが返る。java.sql.TimeStamp#toString()は、小数点以下の秒もゼロとして表現され、
		<code>"yyyy-mm-dd hh:mm:SS.0"</CODE>
		という形式となる。<br>
		何が問題かというと、この形式をそのまま、ＤＢ更新に使用すると".0"という部分が不正になり、JDBCドライバでエラーになります。<br>
		<ol>
			<li>
			".0"の部分を表示しない
			<li>更新時に".0"除く</LI>
		</ol>
		<p>のどちらかが必要になるですが、".0"が表示されるのはおかしいので、1.にしてます。</P>
		<li>
		OracleのTimeStamp型
		<p>
			getObject()でoracle.sql.TIMESTAMPが返ります。これは、toString()をオーバライドしていなみたいで、『クラス名@１６進文字列』が表示されてしまします。<br>
			getTimeStamp()で、java.sql.TimeStampのオブジェクトとして取得すれば、問題無いようです。
		</p>
		<li>
			MaxDBのLong型
			<p>
				getObject()でjava.io.Readerが返ります。これは、toString()をオーバライドしていなみたいで、『クラス名@１６進文字列』が表示されてしまします。<br>
				getString()/getClob()/getCharactorStream()のいずれかで取得すれば、問題無いようです。本ツールでは、getClob()で取得してます。
			</p>
		</li>
	</ul>
	<p>Oracleは特別処理が必要／JDBCドライバが独特 という事なのか？　他のDBMSも特別処理が必要だが気づいてない？　深く考えない事にしよう！</P>
	<h3>更新</h3>
	<p>更新時は、画面の場合とＣＳＶインポートの場合で異なります。</P>
	<h4>画面の場合</h4>
	<p>SwingのDefautTableCellEditorでは、オブジェクトのクラスは変化せず値だけ変化するので、検索結果オブジェクトクラスのまま、setObjet()にてJDBCドライバに渡します。つまり、getObject()のクラスのままsetObject()されます。</p>
	<p>SwingのDefautTableCellEditorがどのクラスに対応しているか？は、調べてないので分かりません。暇な時にソースを追ってみようと思います。（特殊なデータ型の更新で何が起こるかを"理解していない"と言う事です）</p>
	<h4>CSVインポートの場合</h4>
	<p>
		ファイルからは全てStringとして読み取り、そのStringオブジェクトをsetObjet()にて、JDBCドライバに渡します。String
		-&gt; DBMSのデータ型 の変換はJDBCドライバにお任せです。
	</p>
	<p>但し、OracleのDATE型では、日時文字列をTODATE関数で変換して扱いますが、JDBCでも同じ変換が必要になるようです。</p>
	<p>
		そこで、本ツールでは、TODATE関数の変換指示を不要にする為、
		<code>
			ALTER
			SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD
			HH24:MI:SS'
		</code>
		で、文字列の日時形式を設定変更しています。
	</p>
	<h3>バイナリ系データの更新</h3>
	<p>但し、バイナリに関しては特別で以下のようにしてます。</p>
	<h4>画面の場合</h4>
	<p>独自のセルエディターにてbyte[]に変換した値を、テーブルモデルが受け取り、setBytes()でJDBCドライバに渡しています</p>
	<p>なお、TableModelでは、jdbcacess.sql.Binaryオブジェクトで保持しています。</p>
	<h4>CSVインポートの場合</h4>
	<p>バイナリデータ型であるかを、テーブル定義から取得したjava.sql.Typesで判断します。そうであった場合は、ファイルから読込んだ16進文字列表現のStringを、byte[]に変換しsetBytes()でJDBCドライバに渡しています。</P>
	<h3>SQLデータ型マッピングの変更</h3>
	<p>ドキュメント執筆中。実装はしてあります。</p>
	<p>検索結果セル上で、ポップアップメニューの「SQLデータ型マッピング...」を選択すると、自由に設定変更できます。</p>

<!--#include file="footer.html" -->

</body>
</html>
