[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends:00118] MySQL を用いたプログラムで insert が正常に行われません



こんにちは。くろたろうです。いろいろ試してみたんですが、
どうしても直らないので、よろしくお願いします。
※MySQLのMLにも同様のメールを送信しました。かぶった方、
毎度申し訳ないです。

(環境)
・JDK:J2SDK1.4.1
・MYSQL:mysql-4.0.1.2
・JDBCドライバ:gweMysqlJDBC_extra4

(やろうとしていること)
java.sql.ResultSetの更新系メソッドを用いてデータのinsert
を行いたい。

(問題点)
データのinsertが、決まった行でしか行われません。二度、三
度とinsertを行う度、ava.sql.ResultSet.moveToInsertRow()
メソッドを使用して挿入行を指定しているのですが、プログラ
ムを立ち上げる前に存在するテーブルの、最終行を常に更新し
てしまいます。
※executeQuery()を使用して、直接insert文を投げても同じ結
果になってしまいました。
※setFetchDirection(ResultSet.FETCH_FORWARD)も使用してみ
ましたが、結果は同じでした。

以下に、実行結果とソースを掲載します。

(ソース)

//InsertData.java
import java.sql.*;
import java.util.*;

public class InsertData{
 //Field
 Vector rows;
 //Constructor
 public InsertData(Vector rows){
  this.rows = rows;
  try{
   //DBへの接続
   DBAccessor dbAccessor = new DBAccessor();
   //ResultSetの取得
   ResultSet rs = dbAccessor.getResultSet();
   //既存の行数を取得(データ番号を割り振るため)
   rs.last();
   int lastRow = rs.getRow();
   //データの挿入
   for(int i = rows.size();i > 0;i--){
    doInsert(長いので割愛します);
   }
   //DB接続の終了
   dbAccessor.closeResultSet(); 
      dbAccessor.closeStatement();
      dbAccessor.closeConnection();
      dbAccessor2 = null;
    }catch(SQLException sqlEx){
      sqlEx.printStackTrace();
    }
  }
  private void
doInsert(ResultSet rs,int lastRow,java.sql.Date date,
int raceSeq,int firstPrise,float odds) throws
SQLException{
  //カーソルをinsert行に移動
  rs.moveToInsertRow();
  //カラム値の更新
  rs.updateInt(1,lastRow);
  rs.updateDate(2,date);
  rs.updateInt(3,raceSeq);
  rs.updateInt(4,firstPrise);
  rs.updateFloat(5,odds);
  //insertの実行
  rs.insertRow();
  }
}

(実行結果)
(1)insert実行前のデータです。SEQ列の番号は整列してい
ます。(このデータは手動で作成しました。)
mysql> select * from master;
+-----+------------+---------+------------+------+
| SEQ | DAY        | RaceSEQ | FirstPrise | ODDS |
+-----+------------+---------+------------+------+
|   1 | 2002-09-08 |       1 |          2 |  2.7 |
|   2 | 2002-09-08 |       3 |          3 |  5.6 |
|   3 | 2002-09-08 |       6 |          3 |  6.6 |
|   4 | 2002-09-08 |       7 |          4 |    8 |
|   5 | 2002-09-09 |       1 |          1 |  5.7 |
|   6 | 2002-09-09 |       2 |          3 |  3.3 |
+-----+------------+---------+------------+------+
6 rows in set (0.00 sec)
(2)一度目のinsert実行後です。SEQ列の「7」というデー
タをひとつだけ挿入しました。正常です。

mysql> select * from master;
+-----+------------+---------+------------+------+
| SEQ | DAY        | RaceSEQ | FirstPrise | ODDS |
+-----+------------+---------+------------+------+
|   1 | 2002-09-08 |       1 |          2 |  2.7 |
|   2 | 2002-09-08 |       3 |          3 |  5.6 |
|   3 | 2002-09-08 |       6 |          3 |  6.6 |
|   4 | 2002-09-08 |       7 |          4 |    8 |
|   5 | 2002-09-09 |       1 |          1 |  5.7 |
|   6 | 2002-09-09 |       2 |          3 |  3.3 |
|   7 | 1970-01-01 |       5 |          5 |   58 |
+-----+------------+---------+------------+------+
7 rows in set (0.00 sec)

(3)二度目のinsertです。SEQ列の「8」とういうデータをinsert
しましたが、順序が入れ替わっています。この後、何度データ
を入れても、プログラムを一番初めに起動したときのデータ挿
入位置に、新しいデータが挿入されてしまいます。

mysql> select * from master;
+-----+------------+---------+------------+------+
| SEQ | DAY        | RaceSEQ | FirstPrise | ODDS |
+-----+------------+---------+------------+------+
|   1 | 2002-09-08 |       1 |          2 |  2.7 |
|   2 | 2002-09-08 |       3 |          3 |  5.6 |
|   3 | 2002-09-08 |       6 |          3 |  6.6 |
|   4 | 2002-09-08 |       7 |          4 |    8 |
|   5 | 2002-09-09 |       1 |          1 |  5.7 |
|   6 | 2002-09-09 |       2 |          3 |  3.3 |
|   8 | 1970-01-01 |       5 |          5 |   58 |
|   7 | 1970-01-01 |       5 |          5 |   58 |
+-----+------------+---------+------------+------+
8 rows in set (0.00 sec)

__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!
http://bb.yahoo.co.jp/