如何从JDBC ResultSet中获取列数?

99

我正在使用CsvJdbc(它是一个用于csv文件的JDBC驱动程序)来访问一个csv文件。我不知道这个csv文件包含多少列。如何获取列数?是否有任何JDBC函数可以做到这一点?我在java.sql.ResultSet中找不到任何方法。

为了访问文件,我使用类似于CsvJdbc网站上的example代码。

5个回答

262

您可以从 ResultSetMetaData 中获取列数:

Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(query);
ResultSetMetaData rsmd = rs.getMetaData();

int columnsNumber = rsmd.getColumnCount();

2
了解CSV JDBC驱动程序及其ResultSetMetaData实现如何处理可变长度的CSV记录将是很有趣的。例如,如果您指定了SELECT * FROM sample,并且每行包含不同数量的字段,那么在迭代每行时,列计数是否会重新评估? - rhu
@rhu 这很简单。它不会,因为元数据独立于您所在的行。因此,假设它是找到的最大列数。 - user207421

9
PreparedStatement ps=con.prepareStatement("select * from stud");

ResultSet rs=ps.executeQuery();

ResultSetMetaData rsmd=rs.getMetaData();

System.out.println("columns: "+rsmd.getColumnCount());  
System.out.println("Column Name of 1st column: "+rsmd.getColumnName(1));  
System.out.println("Column Type Name of 1st column: "+rsmd.getColumnTypeName(1)); 

1
有人知道吗?rs.getMetaData() 方法昂贵吗?每次调用它时,它是否会查询数据库? - Fandi Susanto
rs.getMetaData() 调用可能会很耗费资源;但是一旦你拥有了 rsmd 对象,通常在调用元数据对象的方法时不需要再对数据库进行额外的调用;所有的元数据都将通过 getMetaData 调用填充。 - Mark Stewart
2
难道不应该是rsmd.getColumnName(1)和rsmd.getColumnTypeName(1)吗?我们正在打印“第一列”,而不是第二列。 - DAB

5

在使用PostgreSQL数据库时,您可以通过以下代码获取结果集中的列数

//加载PostgreSQL驱动程序
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://localhost/test"; Properties props = new Properties(); props.setProperty("user","mydbuser"); props.setProperty("password","mydbpass"); Connection conn = DriverManager.getConnection(url, props);
//创建语句 Statement stat = conn.createStatement();
//获取结果集 ResultSet rs = stat.executeQuery("SELECT c1, c2, c3, c4, c5 FROM MY_TABLE");
//从结果集中获取元数据 ResultSetMetaData rsmd = rs.getMetaData();
//从元数据对象中获取列数 int numOfCols = rsmd.getColumnCount();

但是您还可以获取有关列的更多元信息:

for(int i = 1; i <= numOfCols; i++)
{
    System.out.println(rsmd.getColumnName(i));
}

而且最后但同样重要的是,你不仅可以获取有关表格的信息,还可以获取有关数据库的信息,如何做到这一点,您可以在此处此处找到。

4

连接建立并执行查询后,请尝试以下操作:

 ResultSet resultSet;
 int columnCount = resultSet.getMetaData().getColumnCount();
 System.out.println("column count : "+columnCount);

-1

这将以列的形式打印数据,并在达到最后一列时换行。

ResultSetMetaData resultSetMetaData = res.getMetaData();
int columnCount = resultSetMetaData.getColumnCount();
for(int i =1; i<=columnCount; i++){
                if(!(i==columnCount)){

                    System.out.print(res.getString(i)+"\t");
                }
                else{
                    System.out.println(res.getString(i));
                }

            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接