如何从JDBC结果集中获取列数?


92

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

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

Answers:


250

您可以从ResultSetMetaData获取列号:

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

int columnsNumber = rsmd.getColumnCount();

1
了解CSV JDBC驱动程序及其ResultSetMetaData实现如何处理可变长度CSV记录将很有趣。例如,如果您指定SELECT * FROM sample并且每行包含不同数量的字段,那么是否要为迭代的每一行重新评估列数?
rhu 2010年

@rhu很简单。不会,因为元数据与您所在的行无关。因此,大概是找到的最大列数。
罗恩侯爵

8
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调用填充。
马克·斯图尔特

2
那不是rsmd.getColumnName(1)和rsmd.getColumnTypeName(1)吗?我们正在打印“第一列”,而不是第二列。
民建联

5

您可以通过代码获得的结果集中数(因为DB用于PostgreSQL):

//加载PostgreSQL驱动
Class.forName(“ org.postgresql.Driver”);

字符串url =“ jdbc:postgresql:// localhost / test”;
属性props = new Properties();
props.setProperty(“ user”,“ mydbuser”);
props.setProperty(“ password”,“ mydbpass”);
连接conn = DriverManager.getConnection(url,props);

//创建语句
语句stat = conn.createStatement();

//获取结果集
ResultSet rs = stat.executeQuery(“从MY_TABLE中选择c1,c2,c3,c4,c5”);

//从结果集中给出元数据
ResultSetMetaData rsmd = rs.getMetaData();

//来自元数据对象的列数
int numOfCols = rsmd.getColumnCount();

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

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

至少但并非最不重要的是,您不仅可以获得有关表的信息,而且还可以获得有关DB的信息,如何在此处此处找到信息


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

            }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.