statement exceed!! 数据库操作问题!进者有分!!不够再加! 问题可能出在lwdb对象上,也许它在每次执行sql的时候都新开连接,次数一多就超过数据库允许的连接数了,这种情况你关resultset是没用的。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 to bjzhanghao你这里所说的新开连接指的是新开statement吗?这个类是一个朋友给我用的,关于这个类的代码如下:package unistock;import javax.swing.JComponent;import java.sql.*;import javax.swing.JWindow;import javax.swing.JComponent;import java.net.*;import java.lang.*;import java.io.*;import java.util.*;import com.borland.dx.sql.dataset.*;public class LWDBoperator extends JComponent { private String UserName="root"; private String PWD=""; private String url ; private Connection con; private Statement stmt; private ResultSet rs = null; // private Database database1 = new Database(); public LWDBoperator(){ try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch(java.lang.ClassNotFoundException e){ System.err.println("sun.jdbc.odbc.JdbcOdbcDriver " + e.getMessage()); } catch(Exception e) { e.printStackTrace(); } }/////////////////////////////////返回mysql 连接,connection///////////////////////////// public Connection Connect(String dbname){ try{ url="jdbc:odbc:"+dbname; con=DriverManager.getConnection(url); //stmt= conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); System.out.println("db connect success"); return con; } catch(Exception e){ System.err.println("db connect err"+e.getMessage()); return null; } }/////////////////////////////////////关闭连接///////////////////////////////// public void close(){ try{ con.close(); System.err.println("db colse success"); } catch(Exception e){ System.err.println("db colse err"+e.getMessage()); } }/////////////////////////////////////////////// 用于进行记录的查询操作,用于select 语句。//参数:sql语句,//返回:ResultSet对象/////////////////////////////////////////// public ResultSet executeQuery(String sql) { try { stmt= con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); //System.out.print("sqlis :||"+sql+"||"); rs = stmt.executeQuery(sql); return rs; } catch(SQLException ex) { System.err.println("db.executeQuery: " + ex.getMessage()); return null; } }////////////////////////////////////////////////用于进行add或者update,insert,del等的记录的操作,//入口参数:sql语句//返回 :true,false////////////////////////////////////////////// public boolean executeUpdate(String sql) { boolean bupdate=false; try { stmt= con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); int rowCount = stmt.executeUpdate(sql); if (rowCount!=0) bupdate=true; } catch(SQLException ex) { System.err.println("db.executeUpdate: " + ex.getMessage()); } return bupdate; } ////////////////////////////////////////////////用于进行表结构的操作,creat drop,modify等。//入口参数:sql语句//返回 :true,false////////////////////////////////////////////// public boolean executeTable(String sql) { boolean bupdate=false; try { stmt= con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); System.out.print("对表的操作的 sqlis :||"+sql+"||"); stmt.executeUpdate(sql); bupdate=true; } catch(SQLException ex) { System.err.println("db.executeTable: " + ex.getMessage()); } return bupdate; } ////////////////////////// //返回数据库的信息 ////////////////////////// public Statement getLWPAIDStatement(){ try{ return con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); } catch(java.sql.SQLException e){ System.err.println("getAISPStatement():"+e.getMessage()); return null; } } public DatabaseMetaData getLWPAIDMetaData(){ try{ return con.getMetaData(); } catch(java.sql.SQLException e){ System.err.println("getAISPMetaData():"+e.getMessage()); return null; } }} 你试试在executeQuery方法返回rs以前加上stmt.close()可能吧,如果是这个问题的话,在executeUpdate方法也类似处理 不能加啊!加上去后好象rs就无法被return了!结果集为空 给你提个建议 没有合适的环境给你测试了 只供参考 你的rs.close() 是有用的 但是 你为什么没有调用 LWDBoperator 的close() 来关闭con 呢? 你调用了LWDBoperator的 executeQuery(String ) 方法 使 它的con 保持了连结 却没有再关闭这些连结!!!! 下面是从数据库里提取用户的ID和密码进行验证,如果先关掉stmt,那么结果总是返回No such customID .... 也就是rs里没有记录!void btnEnter_actionPerformed(ActionEvent e) { String customID = jTCustomID.getText(); String password = new String(jPassField.getPassword()); if(customID != null&&password != null){ int i=-1; lwdb.Connect("Stock"); try{ ResultSet rs = lwdb.executeQuery("SELECT Password FROM Person WHERE customID = "+customID); boolean more = rs.next(); while(more){ if(password.equalsIgnoreCase(rs.getString("Password"))){ i+=1; } more = rs.next(); } //con.close(); }catch(Exception ex){ System.err.println(ex.getMessage()); } if(i>=0){ System.out.println("Enter successfully!"); Frame2 frame2 = new Frame2(); frame2.show(); this.dispose(); }else{ System.out.println("No such custom!Please check your customID and Password!"); jTCustomID.setText(""); jPassField.setText(""); jTCustomID.grabFocus(); } }else{ System.out.println("Please enter customID and password!"); return ; }} 关键是在每次对数据库操作后(你是否调用了 LWDBoperator 的 close() 方法(谁叫你不用连结池呢)) 具体的位置 你应该根据你的业务逻辑 仔细的考虑后 自行决定位置如果Connection 的 连结不关闭 数量大了后 一定会出问题的!!!!! to: qxjavajava(射手座 =--->听歌看海)我从数据库里提取出customID然后加到JList里去,然后当选中其中某个customID时旁边的JtabbedPane里就出现这个custom的信息,如果每个valuechanged事件都要触发一次对数据库的连接,那样太麻烦我想要的效果是在操作JLIST时只连一次,每次只是重复地使用lwdb.executeQuery(sql)select各个customID对应的信息 我都说了..每次操作底时候:1.连接connect()2.执行sql.....3.关闭rs.close()4.关闭数据库connect..close()如果需要下面一个连接就重复上面的动作...否则..你肯定是不可以的...哥们!!! 可以的话,你还是使用连接池吧。这样你的问题都解决了。而且conn.close()一执行,所有的stmt和rs都关闭了。另外,JDBC-ODBC bridge driver的性能也不太好,数据量一多是会有问题的。 线程同步问题 简单的问题 急急,自己搞不定,请大家一起来帮忙解决: 关于w3c.dom 免费发短消息,不能发的请班主扣我分 一个关于Jini的问题? 简单的画图功能,可没效果 java取客户端mac地址为什么报java.io.IOException: CreateProcess error=2 安装JBuiler 6的困惑 Java中n!的算法?怎么算? JDK 1.2在XP下需要配置吗?怎样配置呢? 几行代码,也编译不过,大家给我看看。
你这里所说的新开连接指的是新开statement吗?
这个类是一个朋友给我用的,关于这个类的代码如下:
package unistock;import javax.swing.JComponent;
import java.sql.*;
import javax.swing.JWindow;
import javax.swing.JComponent;
import java.net.*;
import java.lang.*;
import java.io.*;
import java.util.*;
import com.borland.dx.sql.dataset.*;public class LWDBoperator extends JComponent {
private String UserName="root";
private String PWD="";
private String url ;
private Connection con;
private Statement stmt;
private ResultSet rs = null;
// private Database database1 = new Database(); public LWDBoperator(){
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(java.lang.ClassNotFoundException e){
System.err.println("sun.jdbc.odbc.JdbcOdbcDriver " + e.getMessage());
}
catch(Exception e) {
e.printStackTrace();
} }
//////////////////////////////
///返回mysql 连接,connection
/////////////////////////////
public Connection Connect(String dbname){
try{
url="jdbc:odbc:"+dbname;
con=DriverManager.getConnection(url);
//stmt= conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
System.out.println("db connect success");
return con;
}
catch(Exception e){
System.err.println("db connect err"+e.getMessage());
return null;
}
}
//////////////////////////////////
///关闭连接
/////////////////////////////////
public void close(){
try{
con.close();
System.err.println("db colse success");
}
catch(Exception e){
System.err.println("db colse err"+e.getMessage());
}
}
/////////////////////////////////////////////
// 用于进行记录的查询操作,用于select 语句。
//参数:sql语句,
//返回:ResultSet对象
///////////////////////////////////////////
public ResultSet executeQuery(String sql) {
try {
stmt= con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
//System.out.print("sqlis :||"+sql+"||");
rs = stmt.executeQuery(sql);
return rs;
}
catch(SQLException ex) {
System.err.println("db.executeQuery: " + ex.getMessage());
return null;
}
}
//////////////////////////////////////////////
//用于进行add或者update,insert,del等的记录的操作,
//入口参数:sql语句
//返回 :true,false
//////////////////////////////////////////////
public boolean executeUpdate(String sql) {
boolean bupdate=false;
try {
stmt= con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
int rowCount = stmt.executeUpdate(sql);
if (rowCount!=0) bupdate=true;
}
catch(SQLException ex) {
System.err.println("db.executeUpdate: " + ex.getMessage());
}
return bupdate;
}
//////////////////////////////////////////////
//用于进行表结构的操作,creat drop,modify等。
//入口参数:sql语句
//返回 :true,false
//////////////////////////////////////////////
public boolean executeTable(String sql) {
boolean bupdate=false;
try {
stmt= con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
System.out.print("对表的操作的 sqlis :||"+sql+"||");
stmt.executeUpdate(sql);
bupdate=true;
}
catch(SQLException ex) {
System.err.println("db.executeTable: " + ex.getMessage());
}
return bupdate;
}
//////////////////////////
//返回数据库的信息
//////////////////////////
public Statement getLWPAIDStatement(){
try{
return con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
}
catch(java.sql.SQLException e){
System.err.println("getAISPStatement():"+e.getMessage());
return null;
}
} public DatabaseMetaData getLWPAIDMetaData(){
try{
return con.getMetaData();
}
catch(java.sql.SQLException e){
System.err.println("getAISPMetaData():"+e.getMessage());
return null;
}
}
}
可能吧,如果是这个问题的话,在executeUpdate方法也类似处理
加上去后好象rs就无法被return了!
结果集为空
No such customID .... 也就是rs里没有记录!
void btnEnter_actionPerformed(ActionEvent e) {
String customID = jTCustomID.getText();
String password = new String(jPassField.getPassword());
if(customID != null&&password != null){ int i=-1; lwdb.Connect("Stock");
try{
ResultSet rs = lwdb.executeQuery("SELECT Password FROM Person WHERE customID = "+customID); boolean more = rs.next();
while(more){
if(password.equalsIgnoreCase(rs.getString("Password"))){
i+=1;
}
more = rs.next();
}
//con.close();
}catch(Exception ex){
System.err.println(ex.getMessage());
} if(i>=0){
System.out.println("Enter successfully!");
Frame2 frame2 = new Frame2();
frame2.show();
this.dispose();
}else{
System.out.println("No such custom!Please check your customID and Password!");
jTCustomID.setText("");
jPassField.setText("");
jTCustomID.grabFocus();
}
}else{
System.out.println("Please enter customID and password!");
return ;
}
}
我从数据库里提取出customID然后加到JList里去,然后当选中其中某个customID时
旁边的JtabbedPane里就出现这个custom的信息,
如果每个valuechanged事件都要触发一次对数据库的连接,那样太麻烦
我想要的效果是在操作JLIST时只连一次,每次只是重复地使用lwdb.executeQuery(sql)
select各个customID对应的信息
每次操作底时候:
1.连接connect()
2.执行sql.....
3.关闭rs.close()
4.关闭数据库connect..close()如果需要下面一个连接就重复上面的动作...
否则..你肯定是不可以的...哥们!!!