Як отримати кількість стовпців з набору результатів 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
Було б цікаво зрозуміти, як драйвер CSV JDBC та його 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

Кількість стовпців у наборі результатів, які ви можете отримати за допомогою коду (як DB використовується PostgreSQL):

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

URL-адреса рядка = "jdbc: postgresql: // localhost / test";
Властивості props = new Properties ();
props.setProperty ("користувач", "mydbuser");
props.setProperty ("пароль", "mydbpass");
Підключення conn = DriverManager.getConnection (url, реквізит);

// створити оператор
Виписка 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.