[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/