Bagaimana cara mendapatkan jumlah kolom dari JDBC ResultSet?

92

Saya menggunakan CsvJdbc (ini adalah driver JDBC untuk file csv) untuk mengakses file csv. Saya tidak tahu berapa banyak kolom yang dikandung file csv. Bagaimana saya bisa mendapatkan jumlah kolom? Apakah ada fungsi JDBC untuk ini? Saya tidak dapat menemukan metode apa pun untuk ini di java.sql.ResultSet.

Untuk mengakses file tersebut, saya menggunakan kode yang mirip dengan contoh di website CsvJdbc.

Jonas
sumber

Jawaban:

250

Anda bisa mendapatkan nomor kolom dari ResultSetMetaData :

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

int columnsNumber = rsmd.getColumnCount();
Roma
sumber
1
Akan menarik untuk memahami bagaimana driver CSV JDBC dan ResultSetMetaDataimplementasinya menangani catatan CSV dengan panjang variabel. mis. Jika Anda menentukan SELECT * FROM sampledan setiap baris berisi jumlah bidang yang berbeda, apakah jumlah kolom akan dievaluasi ulang untuk setiap baris yang diiterasi?
rhu
@rhu Itu mudah. Tidak akan, karena metadata tidak bergantung pada baris mana Anda berada. Jadi mungkin itu adalah jumlah kolom maksimum yang ditemukan.
Marquis dari 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)); 
lokesh
sumber
1
Apakah ada yang tahu? Apakah rs.getMetaData()metodenya mahal? Apakah itu query database setiap kali dipanggil atau tidak?
Fandi Susanto
The rs.getMetaData()panggilan dapat intensif; tetapi setelah Anda memiliki objek, rsmdbiasanya tidak ada panggilan tambahan ke database yang dilakukan saat menjalankan metode pada objek metadata; semua metadata diisi dengan panggilan getMetaData.
Mark Stewart
2
Bukankah seharusnya itu rsmd.getColumnName (1) dan rsmd.getColumnTypeName (1)? Kami sedang mencetak "kolom pertama", bukan yang kedua.
DAB
5

Jumlah kolom dalam kumpulan hasil yang bisa Anda dapatkan dengan kode (karena DB digunakan PostgreSQL):

// muat driver untuk PostgreSQL
Class.forName ("org.postgresql.Driver");

String url = "jdbc: postgresql: // localhost / test";
Properti properti = properti baru ();
props.setProperty ("user", "mydbuser");
props.setProperty ("password", "mydbpass");
Sambungan koneksi = DriverManager.getConnection (url, props);

// buat pernyataan
Stat pernyataan = conn.createStatement ();

// dapatkan kumpulan hasil
ResultSet rs = stat.executeQuery ("PILIH c1, c2, c3, c4, c5 DARI MY_TABLE");

// dari kumpulan hasil berikan metadata
ResultSetMetaData rsmd = rs.getMetaData ();

// kolom dihitung dari objek metadata
int numOfCols = rsmd.getColumnCount ();

Tetapi Anda bisa mendapatkan lebih banyak informasi meta tentang kolom:

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

Dan setidaknya tidak sedikit, Anda bisa mendapatkan beberapa info tidak hanya tentang tabel tetapi tentang DB juga, bagaimana melakukannya dapat Anda temukan di sini dan di sini .

1ac0
sumber
4

Setelah membangun koneksi dan menjalankan kueri, coba ini:

 ResultSet resultSet;
 int columnCount = resultSet.getMetaData().getColumnCount();
 System.out.println("column count : "+columnCount);
Prabodh Hend
sumber
-1

Ini akan mencetak data dalam kolom dan muncul ke baris baru setelah kolom terakhir tercapai.

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

            }
nitish shah
sumber