วิธีรับจำนวนคอลัมน์จาก JDBC ResultSet


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 ง่ายนิดเดียว จะไม่เป็นเช่นนั้นเนื่องจากข้อมูลเมตาไม่ขึ้นอยู่กับแถวที่คุณอยู่ ดังนั้นจึงน่าจะเป็นจำนวนคอลัมน์สูงสุดที่พบ
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
มีใครรู้บ้าง? เป็นrs.getMetaData()วิธีการที่มีราคาแพง? มันค้นหาฐานข้อมูลทุกครั้งที่เรียกหรือไม่?
Fandi Susanto

การrs.getMetaData()โทรสามารถเข้มข้น แต่เมื่อคุณมีวัตถุrsmdแล้วมักจะไม่มีการเรียกฐานข้อมูลเพิ่มเติมเมื่อเรียกใช้เมธอดบนวัตถุข้อมูลเมตา ข้อมูลเมตาทั้งหมดจะถูกเติมด้วยการเรียก getMetaData
Mark Stewart

2
ไม่ควรเป็น rsmd.getColumnName (1) และ rsmd.getColumnTypeName (1)? เรากำลังพิมพ์ "คอลัมน์ที่ 1" ไม่ใช่คอลัมน์ที่ 2
DAB

5

จำนวนคอลัมน์ในชุดผลลัพธ์ที่คุณจะได้รับด้วยรหัส (เนื่องจาก DB ใช้ PostgreSQL):

// โหลดไดรเวอร์สำหรับ PostgreSQL
Class.forName ("org.postgresql.Driver");

สตริง url = "jdbc: postgresql: // localhost / test";
Properties props = คุณสมบัติใหม่ ();
props.setProperty ("ผู้ใช้", "mydbuser");
props.setProperty ("รหัสผ่าน", "mydbpass");
การเชื่อมต่อ = DriverManager.getConnection (url, props);

// สร้างคำสั่ง
Stat งบ = conn.createStatement ();

// รับชุดผลลัพธ์
ResultSet rs = stat.executeQuery ("SELECT c1, c2, c3, c4, c5 FROM MY_TABLE");

// จากชุดผลลัพธ์ให้ข้อมูลเมตา
ResultSetMetaData rsmd = rs.getMetaData ();

// คอลัมน์นับจากออบเจ็กต์ข้อมูลเมตา
int numOfCols = rsmd.getColumnCount ();

แต่คุณสามารถรับข้อมูลเมตาเพิ่มเติมเกี่ยวกับคอลัมน์:

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

และอย่างน้อย แต่ไม่น้อยคุณจะได้รับข้อมูลบางอย่างไม่ได้เป็นเพียงเกี่ยวกับตาราง แต่ประมาณ DB เกินไปวิธีที่จะทำคุณสามารถหาได้ที่นี่และที่นี่


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

            }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.