- PR -

MySQLでキー以外すべて最終行の値が返ってくる

1
投稿者投稿内容
Samiadon
会議室デビュー日: 2003/10/08
投稿数: 16
お住まい・勤務地: 東京都神戸市浪速区猿猴橋町三条下ル
投稿日時: 2004-07-17 18:12
どうもMySQL側の問題のような気もするのですが、間違いがありましたらご指摘をお願い致します。

テーブル名 TEST に、
ID char(5) primary key,
NAME varchar(20) not null,
AGE int
の列を作成し、

'00001', '山田 太郎', 15
'00002', '佐藤 花子', 16
'00003', '田中 美沙', 17

の3行を登録しました。
そこに、以下のコードで書かれたメソッドに
SELECT * FROM TEST
の文を投げたところ、以下のような結果が返ってきました。
'00001', '田中 美沙', 17
'00002', '田中 美沙', 17
'00003', '田中 美沙', 17
SQL文を変更して、
SELECT * FROM TEST ORDER BY AGE
とすると正常に出力されました。

データセットのコードは以下の通りです。何かとんでもない勘違いがありましたらご指摘をお願い致します。

コード:
ResultSet rs;
//PreparedStatementのexecuteQuery()よりSQL発行してrsに結果を代入

//結果セットのメタデータからカラム名を取得
ResultSetMetaData data = rs.getMetaData();
int cnt = data.getColumnCount();
String[] name = new String[cnt];
for (int i = 0; i < cnt; i++)
    name[i] = data.getColumnName(i + 1);

//各レコード毎に値を抽出してリストに追加
while (rs.next()) {
    HashMap map = new HashMap();
    for (int i = 0; i < cnt; i++)
        map.put(name[i], rs.getObject(i + 1));
    list.add(map);
}



動作環境
Windows XP HomeEdition
Apache 2.0.49 + Tomcat 5.0.27 + MySQL 5.0.0a
ぼんじぃ
ベテラン
会議室デビュー日: 2004/05/21
投稿数: 70
投稿日時: 2004-07-18 00:00
データ取得時のSQLと表示部分のソースがないんで何ともいえないんですが、
とりあえず、SQLとプログラムのどちらが原因か明確にしてみてはいかがでしょう?

MySQLクライアントで同じSQLを実行してみて同じ結果ならばSQLかMySQLに問題がありそうです。
SQLかMySQLで問題がなければプログラムに問題があるのではないでしょうか?

あと、取得するデータがわかっているのであればレコードに対応するクラスを
作ることをおすすめします。

Samiadon
会議室デビュー日: 2003/10/08
投稿数: 16
お住まい・勤務地: 東京都神戸市浪速区猿猴橋町三条下ル
投稿日時: 2004-07-20 16:29
データ取得時のSQLは "SELECT * FROM TEST WHERE ID = ?" です。
データの確認は頭掲コードの最後に
System.out.println(list);
を挿入して確認しました。

いろいろ試してみた結果、

頭掲のコードのうち、PreparedStatement を Statement に変更すると正常に
動作することが分かりました。
しかしバインド変数が使えないのは痛いです。

ここで思ったのですが、現在MySQLへの接続部分は
java.sql.*
の使用しているのですが、やはり
com.mysql.jdbc.*
を使用しなければならないのでしょうか?

そうしますと、接続プール部分を以下のように定義しているのですが、
MySQL用に改変するにはどのようにすればよいのでしょうか?
ただimportを変更するだけではDataSourceのConnectionを使用できないので、
代替となるようなサンプルがあればご教示をお願い致します。

コード:
public class ConnectionPoolFactory extends BasePoolableObjectFactory {

    /** 接続文字列 */
    private static final String CONNECT_STRING = "java:comp/env/jdbc/hoge";

    public Object makeObject() throws Exception {
        Context ict = new InitialContext();
        DataSource ds = (DataSource)ict.lookup(CONNECT_STRING);
        return ds.getConnection();
    }
}



このコードはMySQLを使用するにあたってのテスト用に作成しているものです。
今までは共通チームから提供されたOracleDBへの接続メソッドを使用するだけの立場だったのですが、
今回初めてMySQLを使用した開発に携わることになり、四苦八苦しながら勉強しております。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-07-20 16:44
引用:

Samiadonさんの書き込み (2004-07-20 16:29) より:
ここで思ったのですが、現在MySQLへの接続部分は
java.sql.*
の使用しているのですが、やはり
com.mysql.jdbc.*
を使用しなければならないのでしょうか?


標準APIで提供されている部分はインタフェースのみで、実際にはJDBCドライバの実装クラスに
よって動いているので、そこを変えても何も変わりません。
#というか、コンパイルエラーになると思いますが

なんとなくドライバのバグのような気がしますが、以下を確認してください。
・JDBCドライバは何を使っているか
・データソースの設定はどうなっているか
1

スキルアップ/キャリアアップ(JOB@IT)