用swing,awt编写数据库程序时出现错误,详情请进,帮帮忙,谢谢!!!

Leony 2003-05-27 06:07:59
Exception occurred:
Message:[Microsoft][ODBC SQL Server Driver]连接占线导致另一个 hstmt
SQL state: S1000
Vendor code : 0
--------------------
请问是什么问题啊,如何解决?hstmt是何意思啊?
...全文
50 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hlding 2003-05-30
  • 打赏
  • 举报
回复
问题出在:openConnection方法中调用了setupTree,而setupTree中代码编写有错误,第一个ResultSet用于取表集合,而在每一个表中又使用了ResultSet取出单个表的记录集,也就是说使用了2次ResultSet,而在循环中的ResultSet操作后也没有关闭,这样做是不允许的,自然就会出现这种异常,不知道你听明白了没有?
Leony 2003-05-30
  • 打赏
  • 举报
回复
还是出现以上错误,怎么办啊~~~~~~~~~~~~~~~~~~~~~
Leony 2003-05-30
  • 打赏
  • 举报
回复
谢谢了,试一试先
trust_me 2003-05-30
  • 打赏
  • 举报
回复
楼上的可能性很大
这样试试:statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
tommorrow 2003-05-30
  • 打赏
  • 举报
回复
好像是前一个SQL没执行完,你又执行了第二条SQL。每个SQL后COMMIT一次看看。
Leony 2003-05-30
  • 打赏
  • 举报
回复
此问题已经解决
之前的错误是因为在一个ResultSet的循环中使用了另一个ResultSet,如果两个分开执行则没有问题,是可以同时存在两个ResultSet的。
先将第一个ResultSet保存至Vector中,再用Vector去循环,这种就不会出现错误
谢谢hlding(淋东)
Leony 2003-05-30
  • 打赏
  • 举报
回复
hlding(淋东) 你说得对
但是我一定要这样做的啊,第二个ResultSet(表的列)是需要每一个ResultSet(表)来定的
而且每个表的每个列都要列出来 ,我不能关闭啊,但不关闭又不行,我该如何是好啊?

Leony 2003-05-29
  • 打赏
  • 举报
回复
高手,帮帮忙吧,提手之劳,可解小弟燃眉之急啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~
nodreamer 2003-05-28
  • 打赏
  • 举报
回复
晕,怎么这么长呀
你实现的是什么功能呀?
Leony 2003-05-28
  • 打赏
  • 举报
回复
ResultSet columnNames = metadata.getColumns(null,null,tableName,null);

while(columnNames.next())
tableNode.add(
new DefaultMutableTreeNode(columnNames.getString("COLUMN_NAME")));

}
}

public void actionPerformed(ActionEvent e)
{
Object source = e.getSource();
if(source == database ||
source == userIDInput ||
source == passwordInput)
{
url = database.getText();
userID = userIDInput.getText();

char[] pw = passwordInput.getPassword();
if(pw!=null)
password = new String(pw);
if(url == null || url.length()==0)
{
status.setText("Please specify a database URL ");
return;
}
openConnection();
password = null;
}
}

public void valueChanged(TreeSelectionEvent e)
{
TreePath[] paths = dbTree.getSelectionPaths();
if(paths == null)
return;
boolean tableSelected = false;
String column;
String table;
String columnsParam = null;
String tableParam = null;
String message = null;

for(int j = 0; j < paths.length ; j++)
{
switch(paths[j].getPathCount())
{
case 2:
tableParam = (String)(((DefaultMutableTreeNode)
(paths[j].getPathComponent(1))).getUserObject());
columnsParam = "*";
tableSelected = true;
message = "Complete " + tableParam + " table displayed";
break;
case 3:
table = (String)(((DefaultMutableTreeNode)
(paths[j].getPathComponent(1))).getUserObject());
if(tableParam == null)
tableParam = table;
else if(tableParam!=table)
break;
column = (String)(((DefaultMutableTreeNode)
(paths[j].getPathComponent(2))).getUserObject());
if(columnsParam == null)
columnsParam = column;
else
columnsParam += "," + column;
message = columnsParam + " displayed from "
+ tableParam + " table";
break;
}
if(tableSelected)
break;
}
try
{
tableModel.setResultSet(statement.executeQuery("select " +
columnsParam + " from " + tableParam));
tablePane.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createLineBorder(Color.darkGray),
tableParam,
TitledBorder.CENTER,
TitledBorder.DEFAULT_POSITION));
}
catch(SQLException sqle)
{
message = "selection event Error\n" + sqle.getMessage();
System.out.println(message);
}
if(message != null)
status.setText(message);

}

private String userID = "sa";
private String password = "1111";
private String url = "jdbc:odbc:test";

private JTextField database = new JTextField(url);
private JTextField userIDInput = new JTextField(userID);
private JPasswordField passwordInput = new JPasswordField(password);
private JTextArea status = new JTextArea(3,30);

private DefaultMutableTreeNode dbNode;
private DefaultTreeModel dbTreeModel;
private JTree dbTree;
private JScrollPane treePane;

ResultsModel tableModel;
private JTable table;
JScrollPane tablePane;

private String[] drivers = {"sun.jdbc.odbc.JdbcOdbcDriver"};

Connection connection;
Statement statement;

class WindowHandler extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
dispose();
System.exit(0);

}
}
}

Leony 2003-05-28
  • 打赏
  • 举报
回复
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.*;
import javax.swing.tree.*;
import java.sql.*;
import javax.swing.event.*;

class DatabaseBrowse extends JFrame implements ActionListener,
TreeSelectionListener
{
public static void main(String[] args)
{
DatabaseBrowse theApp = new DatabaseBrowse();
}

public DatabaseBrowse()
{
super("数据库浏览器");

setBounds(0,0,600,500);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
addWindowListener(new WindowHandler());

JLabel dbURLLabel = new JLabel("数据库URL:");
JLabel userIDLabel = new JLabel("用户ID:",JLabel.RIGHT);
userIDLabel.setPreferredSize(dbURLLabel.getPreferredSize());
JLabel passwordLabel = new JLabel("密码:");
Box dbPane = Box.createHorizontalBox();
dbPane.add(dbURLLabel);
dbPane.add(database);

Box loginPane = Box.createHorizontalBox();
loginPane.add(userIDLabel);
loginPane.add(userIDInput);
loginPane.add(passwordLabel);
loginPane.add(passwordInput);

Box inputPane = Box.createVerticalBox();
inputPane.add(dbPane);
inputPane.add(loginPane);
getContentPane().add(inputPane,BorderLayout.NORTH);

status.setText("输入数据库URL");
status.setEditable(false);
status.setLineWrap(true);
status.setWrapStyleWord(true);
status.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
getContentPane().add(status,BorderLayout.SOUTH);

dbNode = new DefaultMutableTreeNode("没有任何数据库");
dbTreeModel = new DefaultTreeModel(dbNode);
dbTree = new JTree(dbTreeModel);
treePane = new JScrollPane(dbTree);
treePane.setBorder(BorderFactory.createLineBorder(Color.darkGray));

tableModel = new ResultsModel();
JTable table = new JTable(tableModel);
table.setAutoCreateColumnsFromModel(true);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tablePane = new JScrollPane(table);
tablePane.setBorder(BorderFactory.createLineBorder(Color.darkGray));

JSplitPane splitpane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
true,
treePane,
tablePane);
getContentPane().add(splitpane,BorderLayout.CENTER);
splitpane.setDividerLocation(150);


database.addActionListener(this);
userIDInput.addActionListener(this);
passwordInput.addActionListener(this);
dbTree.addTreeSelectionListener(this);

pack();
setVisible(true);
show();
database.requestFocus();

for(int i = 0;i < drivers.length;i++)
try
{
Class.forName(drivers[i]);
}
catch(ClassNotFoundException cnfe)
{
System.err.println(cnfe);
status.setText("Driver load failed: " + cnfe.getMessage());
}

}

public void openConnection()
{
try
{
if(connection!=null)
{
connection.close();
statement.close();

tableModel.setResultSet(null);
tablePane.setBorder(BorderFactory.createLineBorder(Color.darkGray));

dbNode = new DefaultMutableTreeNode("没有数据库");
dbTreeModel.setRoot(dbNode);
treePane.setBorder(BorderFactory.createLineBorder(Color.darkGray));
dbTreeModel.reload();
}

connection = DriverManager.getConnection(url,userID,password);
status.setText("已经建立数据库链接");
statement = connection.createStatement();

dbNode = new DefaultMutableTreeNode(url);
dbTreeModel.setRoot(dbNode);
setupTree(connection.getMetaData());

treePane.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createLineBorder(Color.darkGray),
url,
TitledBorder.CENTER,
TitledBorder.DEFAULT_POSITION));
dbTree.setRootVisible(false);
dbTreeModel.reload();
}
catch(SQLException sqle)
{
status.setText(sqle.getMessage());
do
{
System.err.println("Exception occurred:\nMessage:"+
sqle.getMessage());
System.err.println("SQL state: " + sqle.getSQLState());
System.err.println("Vendor code : " +
sqle.getErrorCode() + "\n--------------------");
}
while((sqle=sqle.getNextException())!=null);
}

}

private void setupTree(DatabaseMetaData metadata) throws SQLException
{
String[] tableTypes = {"TABLE"};
ResultSet tables = metadata.getTables(null,null,null,tableTypes);

String tableName;
DefaultMutableTreeNode tableNode;
while(tables.next())
{
tableName = tables.getString("TABLE_NAME");
tableNode = new DefaultMutableTreeNode(tableName);
dbNode.add(tableNode);
Leony 2003-05-28
  • 打赏
  • 举报
回复
什么情况会导致如此错误啊
Exception occurred:
Message:[Microsoft][ODBC SQL Server Driver]连接占线导致另一个 hstmt
SQL state: S1000
Vendor code : 0
hstmt是何意思呢?
Leony 2003-05-28
  • 打赏
  • 举报
回复
把一个数据库中的表及其字段列在一树中,点击树节点将出现表的数据及字段的内容,并显示在jtable控件中,有一类还贴出来。
juhwali 2003-05-28
  • 打赏
  • 举报
回复
代码不全,前面好象是把所有的表名取出来放到树里面,然后可能是要把数据取出来?
每次操作都重新连数据库是一种很傻的做法,恐怕问题在这里,因为你把记录集传来传去,如果连接关闭了,那记录集也失效了。代码太长,没时间给你改了。
amjn 2003-05-27
  • 打赏
  • 举报
回复
代码贴出来

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧