未执行语句句柄: getMetaData

zhounanbin5055 2011-02-12 12:39:09
Connection conn = this.getSession().connection();
PreparedStatement pt = conn.prepareStatement(sql);
ResultSetMetaData metaData = pt.getMetaData();
........

pt.close();
conn.close();


pt.getMetaData() 报错

java.sql.SQLException: 未执行语句句柄: getMetaData


请问这是什么问题
...全文
1999 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dever2011 2013-03-04
  • 打赏
  • 举报
回复
我也是需要一样的问题,根据楼上的提示,现在解决啦
率性编程 2011-12-08
  • 打赏
  • 举报
回复
原来如此!
zhh3715 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 heardy 的回复:]
ResultSet rs = stm.executeQuery(sql);
ResultSetMetaData metaData = rs.getMetaData();

是通过ResultSet里面的getMetaData()方法 不是PreparedStatement
[/Quote]

二者都可以,问题是没有执行execute方法
zhounanbin5055 2011-02-12
  • 打赏
  • 举报
回复
一个人都没有么...
zhounanbin5055 2011-02-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 heardy 的回复:]
Java code

package cn.com.sparknet;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
……
[/Quote]


THX 已经解决问题
heardy 2011-02-12
  • 打赏
  • 举报
回复

package cn.com.sparknet;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

public class T {

public static void main(String[] args) throws SQLException {

String sql = "";
DataSource ds = null;// 获取数据源
Connection conn = ds.getConnection();
Statement stm = conn.createStatement();
ResultSet rs = stm.executeQuery(sql);
PreparedStatement pstm = conn.prepareStatement(sql);
ResultSet rs2 = pstm.executeQuery();
ResultSetMetaData metaData = pstm.getResultSet().getMetaData();// pstm.getMetaData();//rs2.getMetaData();

while (rs2.next()) {
System.out.println(rs2.getInt(1) + " " + rs2.getString(2) + " "
+ rs2.getInt(3));
}
int count = metaData.getColumnCount();
System.out.println(count);
String[] name = new String[count];
for (int i = 0; i < count; i++) {
name[i] = metaData.getColumnName(i + 1);
System.out.println(name[i]);
}
}
}


这个是我调试的代码


你试试看

需要修改的
String sql = "";
DataSource ds = null;// 获取数据源
heardy 2011-02-12
  • 打赏
  • 举报
回复
我用的是Statement 如果要用PreparedStatement 可以这样

PreparedStatement  pstm = conn.prepareStatement(sql);
ResultSet rs2 = pstm.executeQuery();
ResultSetMetaData metaData = pstm.getResultSet().getMetaData();//或者 rs2.getMetaData(); 或者 pstm.getMetaData();


原来发现 是你没有了ResultSet rs2 = pstm.executeQuery();

所以获取不了
zhounanbin5055 2011-02-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 heardy 的回复:]
ResultSet rs = stm.executeQuery(sql);
ResultSetMetaData metaData = rs.getMetaData();

是通过ResultSet里面的getMetaData()方法 不是PreparedStatement
[/Quote]


是一样的..用resultset取这个方法也是一样报这个错误 之前我用preparedstatement取该方法,已经都运行成功了,还取出了列名 但是放假回来一运行就报这个错误 期间是有更新过数据库 但是在客户的测试环境的数据库是没动过的 现在也出现该问题 所以应该是和数据库的变化没有关系

有哪位遇到过这个问题么 已经和挺多人讨论过 都找不到问题...
heardy 2011-02-12
  • 打赏
  • 举报
回复
ResultSet rs = stm.executeQuery(sql);
ResultSetMetaData metaData = rs.getMetaData();


是通过ResultSet里面的getMetaData()方法 不是PreparedStatement
heardy 2011-02-12
  • 打赏
  • 举报
回复
Connection conn = ds.getConnection();
Statement stm = conn.createStatement();
ResultSet rs = stm.executeQuery(sql);
ResultSetMetaData metaData = rs.getMetaData();

int count = metaData.getColumnCount();
System.out.println(count);
String[] name = new String[count];
for (int i = 0; i < count; i++) {
name[i] = metaData.getColumnName(i + 1);
System.out.println(name[i]);
}
dracularking 2011-02-12
  • 打赏
  • 举报
回复
看他解释是这样的:
SQLException - if a database access error occurs or this method is called on a closed PreparedStatement

1.数据库访问错误
2.PreparedStatement关闭

可能是数据库方面的变化导致访问错误? 好好排查一下呢
zhounanbin5055 2011-02-12
  • 打赏
  • 举报
回复
我就是用这方法获取字段名 可是之前还可以运行 现在报这个错误 未执行语句句柄 这个实在不懂 不知道是什么原因 sql语句肯定没有问题 我试了最简单的select语句也是报错
heardy 2011-02-12
  • 打赏
  • 举报
回复
ResultSetMetaData rsmt=rs.getMetaData();

得到结果集(rs)的结构信息,比如字段数、字段名等。


使用rs.getMetaData().getTableName(1))就可以返回表名


rs.getMetaData().getColumnCount()

取得列数

例子:

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");//得到查询结果,一个数据集
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount(); //得到数据集的列数

rsmd中的结构:

om.mysql.jdbc.ResultSetMetaData@132e13d - Field level information:
com.mysql.jdbc.Field@1617189[catalog=test,tableName=MyBean,originalTableName=mybean,columnName=id,originalColumnName=id,mysqlType=3(FIELD_TYPE_LONG),flags= PRIMARY_KEY, charsetIndex=63, charsetName=US-ASCII]
com.mysql.jdbc.Field@64f6cd[catalog=test,tableName=MyBean,originalTableName=mybean,columnName=name,originalColumnName=name,mysqlType=253(FIELD_TYPE_VAR_STRING),flags=, charsetIndex=8, charsetName=Cp1252]

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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