Connection conn = this.getSession().connection();
        PreparedStatement pt = conn.prepareStatement(sql);
        ResultSetMetaData metaData = pt.getMetaData();
                    ........                     pt.close();
        conn.close();
pt.getMetaData() 报错  java.sql.SQLException: 未执行语句句柄: getMetaData
请问这是什么问题  

解决方案 »

  1.   

    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]
      

  2.   

    我就是用这方法获取字段名  可是之前还可以运行  现在报这个错误   未执行语句句柄  这个实在不懂  不知道是什么原因  sql语句肯定没有问题  我试了最简单的select语句也是报错
      

  3.   

    看他解释是这样的:
    SQLException - if a database access error occurs or this method is called on a closed PreparedStatement 1.数据库访问错误
    2.PreparedStatement关闭可能是数据库方面的变化导致访问错误? 好好排查一下呢
      

  4.   

    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]);
    }
      

  5.   

    ResultSet rs = stm.executeQuery(sql);
    ResultSetMetaData metaData = rs.getMetaData();
    是通过ResultSet里面的getMetaData()方法 不是PreparedStatement 
      

  6.   

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

  7.   

    我用的是Statement 如果要用PreparedStatement 可以这样PreparedStatement  pstm = conn.prepareStatement(sql);
    ResultSet rs2 = pstm.executeQuery();
    ResultSetMetaData metaData = pstm.getResultSet().getMetaData();//或者 rs2.getMetaData(); 或者 pstm.getMetaData();原来发现 是你没有了ResultSet rs2 = pstm.executeQuery();所以获取不了
      

  8.   


    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;// 获取数据源
      

  9.   


    二者都可以,问题是没有执行execute方法