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

[jfriends:00105] MySQL を用いた DB プログラムで、更新処理が行えません



また、わからないことができました^^; どうかよろしくお願
いします。

(環境)
・JDK:J2SDK1.4.1
・MYSQL:mysql-4.0.1.2
・JDBCドライバ:mysql-connector-java-3.0.6-stable

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

(問題点)
まず、ResultSetのmoveToInsertRow()を用いると、以下の例外
が発生します。
com.mysql.jdbc.NotUpdatable: Result Set not updatable.This
result set must
come
from a statement that was created with a result set type
of
ResultSet.CONCUR_UPD
ATABLE, the query must select only one table, and must
select all primary
keys f
rom that table. See the JDBC 2.1 API Specification,
section 5.6 for more
details

しかし、ResultSet取得時には、下記のようにResultSet.CONCUR_UPDATABLE
を指定し
て、書き込み可能な処理モードを設定しています。
Statement stmt =
con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATAB
LE);

そこで、以下の文をこの直後に実行して、ResultSetの処理モ
ードを確認しました。
 switch (rset.getConcurrency())
    {
      case ResultSet.CONCUR_UPDATABLE:
        System.out.println ("Result set concurrency:
ResultSet.CONCUR_UPDATABLE");
        break;
      case ResultSet.CONCUR_READ_ONLY:
        System.out.println ("Result set concurrency:
ResultSet.CONCUR_READ_ONLY");
        break;
      default:
        System.out.println ("Invalid type");
        break;
    }

すると、結果は「READ_ONLY」であることが判明し、Connection.createStatement
文
で与えたCONCUR_UPDATABLEが設定されていないことが分かりま
した。
※ちなみに、直にinsert文を発行すれば問題なく実行されまし
た。また、データベー
スへのアクセス権も確認しました。

更新可能なResultSetを取得するには、どうすればよいでしょ
うか?よろしくお願い
します。

--------------------------------------------------------------------------
--------------------------------------------------------------------------
※↓以下に全ソースを掲載します。

(InsertData.java)
//InsertData.java

import java.sql.*;
import java.util.*;

public class InsertData{
 public InsertData(){
  try{
   //DBへの接続
   Class.forName("com.mysql.jdbc.Driver").newInstance();
   Connection con = DriverManager.getConnection(
      
"jdbc:mysql://localhost/db1?useUnicode=true&characterEncoding=SJIS",
"***", "***");
   //↓ここでConnectionにResultSet.CONCUR_UPDATABLEを指
定してResultSetを取得
しています。。
   Statement stmt =
con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATAB
LE);
   ResultSet rset = stmt.executeQuery("select * from
master;");
   //↓select文の内容を表示しています。
   while(rset.next()){
    System.out.println(rset.getInt(1) + ":" +
rset.getDate(2) + ":" +
rset.getInt(3) + ":" + rset.getInt(4) + ":" +
rset.getFloat(5));
   }
   //↓ResultSetのモードを確認しています。
   //結果は、ReadOnlyでした・・・
   switch (rset.getConcurrency()){
         case ResultSet.CONCUR_UPDATABLE:
           System.out.println ("Result set concurrency:
ResultSet.CONCUR_UPDATABLE");
           break;
         case ResultSet.CONCUR_READ_ONLY:
           System.out.println ("Result set concurrency:
ResultSet.CONCUR_READ_ONLY");
           break;
         default:
           System.out.println ("Invalid type");
           break;
   }
   //insertDataメソッドでinsertを実行しています。
   insertData(rset,7,new
java.sql.Date(1000000),10,10,100.5f);
   //Close the result set
   rset.close();
   //更新後の確認です。
   rset = stmt.executeQuery("select * from master");
   while(rset.next()){
    System.out.println(rset.getInt(1) + ":" +
rset.getDate(2) + ":" +
rset.getInt(3) + ":" + rset.getInt(4) + ":" +
rset.getFloat(5));
   }
   rset.close();
   stmt.close();
   con.close();
  } catch (Exception e0) {
   e0.printStackTrace();
  }
 }
 //Method
 public static void main(String[] args){
  InsertData id = new InsertData();
 }
 //insertメソッド
 public void insertData(ResultSet rset,int
seq,java.sql.Date day,int
raceSeq,int firstPrise,float odds){
  try{
   System.out.println("insert data");
   //カーソルをinsert行に移動
   //※ここで例外が発生しました。
   rset.moveToInsertRow();
   //値の追加
   rset.updateInt(1,seq);
   rset.updateDate(2,day);
   rset.updateInt(3,raceSeq);
   rset.updateInt(4,firstPrise);
   rset.updateFloat(5,odds);
   //insert処理の実行
   rset.insertRow();
  }catch(SQLException e1){
   e1.printStackTrace();C:\demo\InsetDemo>java InsertData

  }
 }
}

--------------------------------------------------------------------------
--------------------------------------------------------------------------
※↓以下は実行時の画面です。

C:\demo\InsetDemo>java InsertData
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.0
5:2002-09-09:1:1:5.7
6:2002-09-09:2:3:3.3
Result set concurrency: ResultSet.CONCUR_READ_ONLY
insert data
com.mysql.jdbc.NotUpdatable: Result Set not updatable.This
result set must
come
from a statement that was created with a result set type
of
ResultSet.CONCUR_UPD
ATABLE, the query must select only one table, and must
select all primary
keys f
rom that table. See the JDBC 2.1 API Specification,
section 5.6 for more
details
.
        at
com.mysql.jdbc.UpdatableResultSet.moveToInsertRow(UpdatableResultSet.
java:495)
        at InsertData.insertData(InsertData.java:59)
        at InsertData.<init>(InsertData.java:34)
        at InsertData.main(InsertData.java:51)
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.0
5:2002-09-09:1:1:5.7
6:2002-09-09:2:3:3.3

C:\demo\InsetDemo>



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