Làm cách nào để lấy số cột từ Tập kết quả JDBC?


92

Tôi đang sử dụng CsvJdbc (nó là trình điều khiển JDBC cho tệp csv) để truy cập tệp csv. Tôi không biết tệp csv chứa bao nhiêu cột. Làm thế nào tôi có thể nhận được số lượng cột? Có chức năng JDBC nào cho việc này không? Tôi không thể tìm thấy bất kỳ phương pháp nào cho việc này trong java.sql.ResultSet.

Để truy cập tệp, tôi sử dụng mã tương tự như ví dụ trên trang web CsvJdbc.

Câu trả lời:


250

Bạn có thể lấy số cột từ ResultSetMetaData :

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

int columnsNumber = rsmd.getColumnCount();

1
Sẽ rất thú vị khi hiểu cách trình điều khiển CSV JDBC và ResultSetMetaDataviệc triển khai nó xử lý các bản ghi CSV có độ dài thay đổi. ví dụ: Nếu bạn đã chỉ định SELECT * FROM samplevà mỗi hàng chứa một số trường khác nhau, thì số lượng cột có được đánh giá lại cho mỗi hàng đã được lặp lại không?
rhu

@rhu Thật dễ dàng. Nó sẽ không, vì siêu dữ liệu độc lập với hàng bạn đang ở. Vì vậy, có lẽ đó là số cột tối đa được tìm thấy.
Marquis of Lorne

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
Có ai biết không? Là rs.getMetaData()phương pháp đắt tiền? Nó có truy vấn cơ sở dữ liệu mỗi khi nó được gọi hay không?
Fandi Susanto

Cuộc rs.getMetaData()gọi có thể chuyên sâu; nhưng một khi bạn có đối tượng rsmdthì thường không có lệnh gọi bổ sung nào đến cơ sở dữ liệu được thực hiện khi gọi các phương thức trên đối tượng siêu dữ liệu; tất cả siêu dữ liệu được điền bằng lệnh gọi getMetaData.
Mark Stewart

2
Đó không phải là rsmd.getColumnName (1) và rsmd.getColumnTypeName (1)? Chúng tôi đang in "cột thứ nhất", không phải cột thứ hai.
DAB

5

Số cột trong tập kết quả mà bạn có thể nhận được bằng mã (vì DB được sử dụng PostgreSQL):

// tải trình điều khiển cho PostgreSQL
Class.forName ("org.postgresql.Driver");

String url = "jdbc: postgresql: // localhost / test";
Properties props = new Properties ();
props.setProperty ("người dùng", "mydbuser");
props.setProperty ("mật khẩu", "mydbpass");
Conn kết nối = DriverManager.getConnection (url, đạo cụ);

// tạo câu lệnh
Câu lệnh stat = conn.createStatement ();

// lấy một tập kết quả
ResultSet rs = stat.executeQuery ("CHỌN c1, c2, c3, c4, c5 FROM MY_TABLE");

// từ tập hợp kết quả cung cấp siêu dữ liệu
ResultSetMetaData rsmd = rs.getMetaData ();

// số cột từ đối tượng siêu dữ liệu
int numOfCols = rsmd.getColumnCount ();

Nhưng bạn có thể nhận được nhiều thông tin meta hơn về các cột:

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

Và ít nhất nhưng không kém phần quan trọng, bạn có thể nhận được một số thông tin không chỉ về bảng mà còn về DB, cách thực hiện bạn có thể tìm thấy ở đâyở đây .


4

Sau khi thiết lập kết nối và thực hiện truy vấn, hãy thử điều này:

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

-1

Thao tác này sẽ in dữ liệu trong các cột và đến dòng mới khi đến cột cuối cùng.

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

            }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.