Как получить количество столбцов из набора результатов JDBC?


92

Я использую CsvJdbc (это JDBC-драйвер для csv-файлов) для доступа к csv-файлу. Я не знаю, сколько столбцов содержит csv-файл. Как я могу узнать количество столбцов? Есть ли для этого какая-нибудь JDBC-функция? Я не могу найти никаких методов для этого в java.sql.ResultSet.

Для доступа к файлу я использую код, аналогичный примеру на сайте CsvJdbc.

Ответы:


250

Вы можете получить номер столбца из ResultSetMetaData :

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

int columnsNumber = rsmd.getColumnCount();

1
Было бы интересно понять, как драйвер JDBC CSV и его ResultSetMetaDataреализация обрабатывают записи CSV переменной длины. например, если вы указали, SELECT * FROM sampleи каждая строка содержала разное количество полей, будет ли пересчитываться счетчик столбцов для каждой строки, которая была повторена?
rhu

@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)? Мы печатаем «1-й столбец», а не 2-й.
DAB

5

Количество столбцов в результирующем наборе, которое вы можете получить с помощью кода (в качестве БД используется PostgreSQL):

// загружаем драйвер для PostgreSQL
Class.forName ("org.postgresql.Driver");

Строка url = "jdbc: postgresql: // localhost / test";
Свойства props = новые свойства ();
props.setProperty («пользователь», «mydbuser»);
props.setProperty («пароль», «mydbpass»);
Подключение соединения = DriverManager.getConnection (url, props);

// создаем инструкцию
Заявление stat = conn.createStatement ();

// получаем набор результатов
ResultSet rs = stat.executeQuery ("ВЫБРАТЬ c1, c2, c3, c4, c5 ИЗ 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));
                }

            }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.