Jak uzyskać liczbę kolumn z zestawu wyników JDBC?


92

Używam CsvJdbc (jest to sterownik JDBC dla plików csv), aby uzyskać dostęp do pliku csv. Nie wiem, ile kolumn zawiera plik CSV. Jak mogę sprawdzić liczbę kolumn? Czy jest do tego jakaś funkcja JDBC? Nie mogę znaleźć żadnej metody na to w java.sql.ResultSet.

Aby uzyskać dostęp do pliku, używam kodu podobnego do przykładu na stronie CsvJdbc.

Odpowiedzi:


250

Możesz pobrać liczbę kolumn z ResultSetMetaData :

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

int columnsNumber = rsmd.getColumnCount();

1
Byłoby interesujące zrozumieć, jak sterownik CSV JDBC i jego ResultSetMetaDataimplementacja obsługują rekordy CSV o zmiennej długości. np. jeśli określiłeś SELECT * FROM samplei każdy wiersz zawierał inną liczbę pól, czy liczba kolumn zostanie ponownie obliczona dla każdego wiersza, który został poddany iteracji?
rhu

@rhu To proste. Nie, ponieważ metadane są niezależne od wiersza, w którym się znajdujesz. Więc przypuszczalnie jest to maksymalna liczba znalezionych kolumn.
Markiz 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
Czy ktoś wie? Czy rs.getMetaData()metoda jest droga? Czy wysyła zapytanie do bazy danych za każdym razem, gdy jest wywoływana, czy nie?
Fandi Susanto

rs.getMetaData()Połączenie może być intensywny; ale kiedy już masz obiekt, rsmdzwykle nie są wykonywane żadne dodatkowe wywołania bazy danych podczas wywoływania metod na obiekcie metadanych; wszystkie metadane są wypełniane wywołaniem getMetaData.
Mark Stewart

2
Czy nie powinno to być rsmd.getColumnName (1) i rsmd.getColumnTypeName (1)? Drukujemy „pierwszą kolumnę”, a nie drugą.
DAB,

5

Liczba kolumn w zestawie wyników, które można uzyskać za pomocą kodu (ponieważ DB jest używany jako PostgreSQL):

// załaduj sterownik dla PostgreSQL
Class.forName ("org.postgresql.Driver");

String url = "jdbc: postgresql: // localhost / test";
Właściwości props = new Properties ();
props.setProperty ("użytkownik", "mydbuser");
props.setProperty ("hasło", "mydbpass");
Connection conn = DriverManager.getConnection (url, props);

// tworzenie instrukcji
Instrukcja stat = conn.createStatement ();

// uzyskaj zestaw wyników
ResultSet rs = stat.executeQuery ("SELECT c1, c2, c3, c4, c5 FROM MY_TABLE");

// ze zbioru wyników podaj metadane
ResultSetMetaData rsmd = rs.getMetaData ();

// liczba kolumn z obiektu metadanych
int numOfCols = rsmd.getColumnCount ();

Ale możesz uzyskać więcej metainformacji o kolumnach:

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

I przynajmniej, ale nie mniej ważne, możesz uzyskać informacje nie tylko o tabeli, ale także o DB, jak to zrobić, możesz znaleźć tutaj i tutaj .


4

Po nawiązaniu połączenia i wykonaniu zapytania spróbuj tego:

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

-1

Spowoduje to wydrukowanie danych w kolumnach i przejście do nowej linii po osiągnięciu ostatniej kolumny.

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

            }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.