JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » JDBC/SQL討論區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 關於CachedRowSetImpl問題,想請教各位 [精華]
Millerlai





發文: 56
積分: 1
於 2003-09-06 20:39 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我是參考http://servlet.java.sun.com/javaone/sf2003/conf/sessions/display-1757.en.lite 的投影片範例做的
想請教各位,我在取出資料放在CachedRowSet之後,進行以下的操作
1
2
3
4
5
6
      crs.moveToInsertRow();
      crs.updateString("ID", "PR-10004");
      crs.updateString("Name", "C#");
      crs.updateString("Type", "Program");
      crs.insertRow();
      crs.acceptChanges();

的動作為何會出現以下的錯誤訊息,是不是有哪些地方我沒有注意到?
能否提示我,需要在什麼地方做修正,謝謝。
1
2
3
4
java.sql.SQLException: Invalid operation while on insert row
  at com.sun.rowset.CachedRowSetImpl.acceptChanges(CachedRowSetImpl.java:641)
  at TEST.TEST_JSR114.TEST_CachedRowSetImpl(TEST_JSR114.java:94)
  at TEST.TEST_JSR114.main(TEST_JSR114.java:130)

程式碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
  
try {
      Class.forName(CLASS);//net.sourceforge.jtds.jdbc.Driver
      CachedRowSet crs = new CachedRowSetImpl();
      crs.setCommand(Command);//"Select * from SKILL"
      crs.setUrl(URL);//"jdbc:jtds:sqlserver://127.0.0.1:1433/TEST2";
      crs.setUsername(ID);//"Admin"
      crs.setPassword(PASSWORD);//"1234"
      crs.execute();
      while (crs.next()) {
        String id = crs.getString("ID");
        String name = crs.getString("Name");
        String type = crs.getString("Type");
        System.out.println(id +"  ,  "+ name +"  ,  "+type);
      }
      /**************輸出結果***************
       PR-10001  ,  Java  ,  Program
       PR-10002  ,  C++  ,  Program
       PR-10003  ,  VB  ,  Program
      **************************************/
 
      crs.moveToInsertRow();
      crs.updateString("ID", "PR-10004");
      crs.updateString("Name", "C#");
      crs.updateString("Type", "Program");
      crs.insertRow();
      crs.acceptChanges();
      /*
             Class.forName(CLASS);
             connection = DriverManager.getConnection(URL, ID, PASSWORD);
             preparedStatement = connection.prepareStatement(Command,
          ResultSet.TYPE_SCROLL_SENSITIVE,
          ResultSet.CONCUR_UPDATABLE);
             resultSet = preparedStatement.executeQuery();
             CachedRowSetImpl crs = new CachedRowSetImpl();
             crs.populate(resultSet);
             while (crs.next()) {
        System.out.println(crs.getString(1));
             }
             crs.setTableName("SKILL");
             connection.close(); //關閉連線後
             crs.moveToInsertRow();
             crs.updateString("ID", "PR-10004");
             crs.updateString("Name", "C#");
             crs.updateString("Type", "Program");
             crs.insertRow();
             Connection newConnection = DriverManager.getConnection(URL, ID, PASSWORD); //再次取得連線
             crs.acceptChanges(newConnection);
       */
    }
    catch (ClassNotFoundException ex) {
      ex.printStackTrace();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
 
  }


Millerlai edited on 2003-09-07 00:05
reply to postreply to post
作者 Re:關於CachedRowSetImpl問題,想請教各位 [Re:Millerlai]
Millerlai





發文: 56
積分: 1
於 2003-09-12 01:49 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
嗯....沒人回答我..大概是我問的問題太濫了...sorry各位........
我剛剛又try了一下試出來了....我自己回答好了...XD

之前看Java Two的投影片看戴玉佩老師的投影片裡面用的方法是
用:傳統的方式先抓到ResultSet裡面去,然後再利用crs.populate(rs)轉到CashedRowSet裡面....
而我看前一篇我po的那個網址的投影片是直接使用CachedRowSet來取得結果
在最後crs.execute()其實應該就已經是歸還connection了,因為在CachedRowSetImpl它裡面呼叫的是this.setConnection(null);所以應該算是離線了....跟戴玉珮老師將Connection.close();我"猜測"可能意思差不多....只是要看實做Connection介面的Driver廠商如何實做?還希望有誰能夠解釋一下....^^

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
   try {
      Class.forName("net.sourceforge.jtds.jdbc.Driver");
      CachedRowSet crs = new CachedRowSetImpl();
      crs.setCommand("Select * from SKILL");
      crs.setUrl("jdbc:jtds:sqlserver://127.0.0.1:1433/CCPM");
      crs.setUsername("Admin");
      crs.setPassword("1234");
      crs.setTableName("SKILL");
      crs.execute();
      while (crs.next()) {
        String id = crs.getString("ID");
        String name = crs.getString("Name");
        String type = crs.getString("Type");
        System.out.println(id +"  ,  "+ name +"  ,  "+type);
      }
      crs.moveToInsertRow();
      crs.updateString("ID", "PR-0005");
      crs.updateString("Name", "C");
      crs.updateString("Type", "Program");
      crs.insertRow();
      crs.moveToCurrentRow();//之前會有問題好像是因為少了這行.....
      crs.acceptChanges();
    }
    catch (SQLException e) {
      e.printStackTrace();
    }
}
 


reply to postreply to post
作者 Re:關於CachedRowSetImpl問題,想請教各位 [Re:Millerlai]
albert_sung





發文: 3
積分: 0
於 2004-10-21 15:34 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
看您程式撰寫的方式似乎是使用 sun jdbc rowset 1.0.1,想請教一下是否這版本只適用於jdk1.5?若使用jdk1.4的話,是否只能使用 rowset 1.0?

reply to postreply to post
作者 Re:關於CachedRowSetImpl問題,想請教各位 [Re:albert_sung]
NcitZhang





發文: 9
積分: 0
於 2004-11-11 23:22 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
albert_sung wrote:
看您程式撰寫的方式似乎是使用 sun jdbc rowset 1.0.1,想請教一下是否這版本只適用於jdk1.5?若使用jdk1.4的話,是否只能使用 rowset 1.0?


我也想知道jdk1.5下怎么用rowset?我经常遇到Invalid cursor position。


reply to postreply to post
作者 Re:關於CachedRowSetImpl問題,想請教各位 [Re:Millerlai]
fiolvivi





發文: 1
積分: 0
於 2005-05-11 01:01 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
这么老的帖子被我GOOGLE到了,或许楼主已经成为了一个JAVA大牛,不知道楼主在普遍使用CachedRowSet的时候数据库服务器是否倒过。我个人的测试结果是:CachedRowSet控制的Connection无法被正确关闭,数个已经无用的Connection无法回收,我的建议是不要对CachedRowSet使用Class.forName和setUrl,如果你真的喜欢CachedRowSet,请execute(conn),acceptChanges(conn),... 当然不要忘了conn.close();

reply to postreply to post
作者 Re:關於CachedRowSetImpl問題,想請教各位 [Re:Millerlai]
chuang5089





發文: 254
積分: 0
於 2005-09-06 15:21 user profilesend a private message to usersend email to chuang5089reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
請問針對CachedRowSetImpl 我要怎樣使用
nextPage 這個 功能
當我declare crs.nextpage() 時會有這個 error called
Populate data before calling 所以請問是什麼原因

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 CachedRowSetImpl crs = new CachedRowSetImpl();
    crs = iface.getRowSet();
       
       crs.setPageSize(100);
        int i =0; 
 while(crs.nextPage()){
  System.out.println("" + i);
 while (crs.next()) {
   System.out.println("ID: " + crs.getInt(1) +
              ",  Name: " + crs.getString(2));
           
           System.out.println(crs.getObject(2));
                     
  }
  i++;
   }


reply to postreply to post
http://blog.yam.com/javanull/
作者 谢谢楼主的贴子和解答,我因同样问题受益. [Re:Millerlai]
wangzejian





發文: 1
積分: 0
於 2006-06-04 01:58 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
另外,我个人认为:

傳統的方式先抓到ResultSet裡面去,然後再利用crs.populate(rs)轉到CashedRowSet裡面....

再关闭ResultSet,

完了再更新,心理上感觉可靠的关闭了连结.


reply to postreply to post
» JWorld@TW »  JDBC/SQL討論區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8