2010年8月16日月曜日

javaのsqlアクセスメソッドgetStringで文字化け(2)?

以前にjavaプログラミングで、MSAccessデータベースにアクセスする際の文字化けについてお話しました。どのようにコーディングするのかコメントがありましたので、私がYawdbaで使用しているコードの抜粋を説明します。

◆以下のコーディングでODBCデータソースにアクセスします。
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
cnn = DriverManager.getConnection("jdbc:odbc:" + "データソース");

◆取得したODBCデータソースコネクション(cnn)クラスのcreateStatementメソッドを呼び出し、SQL文を実行するStatementインタフェースを以下のように取得します。

stmt = cnn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);

◆StatementインタフェースのexecuteQueryメソッドにより、SQL Query文を実行します。
rset =stmt.executeQuery("SELECT * From myTable"); 

◆SQL文が実行したら、取得したResultSetインタフェースオブジェクト(rset)を使って取得するレコード行を設定した後、レコード内のカラム位置(1~)を指定してデータを取得します。
このとき、このデータの型によって動作が異なります。

> データ型がVARCHAR以外なら、通常のgetStringメソッドを使ってデータを取得します。
val = rset.getString(カラム位置);


>データ型がVARCHARなら、ストリームを使ってデータを取得します。
/* データ取得するためのリーダー(myReader)をgetCharacterStreamメソッドで取得します */
Reader              myReader = rset.getCharacterStream(カラム位置);
/* 取得するデータの表示サイズをgetColumnDisplaySizeメソッドで取得し、そのサイズ分のStringBufferを確保しておきます */
StringBuffer       sb = new StringBuffer(該当フィールド表示サイズ);

try    {
        int    c;
        /* 取得したmyReaderを使ってreadメソッドで1文字づつ取得します。*/
        while((c = myReader.read()) != -1) {
        if(c != 0)  /* c == 0の場合には、文字列データとして不正なのでスキップ */
                       sb.append((char)c); /* 取得した文字列をStringBufferに追加します */
                }
        }
        catch (Exception e)
               エラー処理
        }
        val = (sb.length() == 0)?null:sb.toString(); /* StringBufferを文字列に変換します。 */
}


現在開発しているYawdbaもある程度形になれば、Yawdbaのサイトで公開したいと思いますが、暫く時間をください。

0 件のコメント:

コメントを投稿