繁体   English   中英

Java ResultSet列数始终为1

[英]Java ResultSet Column count is always 1

我想显示一个表的列号,但它始终显示数字1。我编写了以下代码:

Class.forName(JDBC_DRIVER);
java.sql.Connection con=DriverManager.getConnection(DB_URL,USER,PASS); 

try (Statement stmt = (Statement) con.createStatement()) {
            String sql;

            sql = "SELECT count(*) FROM information_schema.columns WHERE 
                   table_name=\"my_b\"";

            try ( 
                ResultSet rs = stmt.executeQuery(sql)) {
                int columCount = rs.getMetaData().getColumnCount();
                System.out.println("Column number is: "+columCount);
            }
            stmt.close();
            con.close();

错误在哪里?

问题在于ResultSet.getColumnCount返回查询结果集中的列数,而不是表中的列数。

如果您试图获取表中的列数,则您所拥有的查询是正确的。 您只需要检索查询的结果,而不是其元数据。

        String sql = "SELECT count(*) FROM information_schema.columns WHERE table_name=\"my_b\"";

        try ( 
            ResultSet rs = stmt.executeQuery(sql));
            rs.next();
            int columCount = rs.getInt(1);
            System.out.println("Column number is: " + columCount);
        }

首先,您不需要很长时间就可以使用Class.forName加载JDBC驱动程序。 其次,您正在选择一个值,但是正在读取元数据。 第三,当使用try-with-resources您不需要显式的close调用(例如,您的Connection应该在finally关闭)。 最后,使用PreparedStatement并绑定参数。 喜欢,

java.sql.Connection con = DriverManager.getConnection(DB_URL, USER, PASS);
String query = "SELECT count(*) FROM information_schema.columns WHERE table_name=?";
try (PreparedStatement stmt = con.prepareStatement(query)) {
    stmt.setString(1, "my_b");
    try (ResultSet rs = stmt.executeQuery()) {
        if (rs.next()) {
            int columCount = rs.getInt(1);
            System.out.println("Column number is: " + columCount);
        } else {
            System.out.println("No rows");
        }
    }
} finally {
    con.close();
}

您不是在获取查询结果,而是在询问结果集元数据该结果集有多少列。 并且由于您的查询仅产生单个列(即COUNT(*) ),因此ResultSetMetaData.getColumnCount()的结果为1 ,并且该值正确。

如果要获取查询结果 ,则需要从结果集中获取查询结果:

try (ResultSet rs = stmt.executeQuery(sql)) {
    if (rs.next()) {
        int columnsNumber = rs.getInt(1);
        System.out.println("Column number is: "+columnsNumber );
    }
}
Class.forName(JDBC_DRIVER);
java.sql.Connection con=DriverManager.getConnection(DB_URL,USER,PASS); 

try (Statement stmt = (Statement) con.createStatement()) {
            String sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS  WHERE table_schema = 'database_name' AND table_name = 'table_name'"

            try ( 
                ResultSet rs = stmt.executeQuery(sql)) {
                //int columCount = rs.getMetaData().getColumnCount();
                ResultSetMetaData rsmd = rs.getMetaData();

                int columnsNumber = rsmd.getColumnCount();
                System.out.println("Column number is: "+columnsNumber );


            }
            stmt.close();
            con.close();

请尝试SELECT * FROM information_schema.columns WHERE table_name=\\"my_b\\"

在查找所有列时,只需忽略count(*)因为这将返回单个结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM