Java.sql.ResultSet থেকে কলামের নামগুলি পুনরুদ্ধার করুন


233

সঙ্গে java.sql.ResultSetএকটি উপায় আছে হিসেবে একটি কলাম নাম পেতে হয় Stringকলাম এর সূচীতে ব্যবহার করে? আমি এপিআই ডকের মাধ্যমে দেখেছি কিন্তু আমি কিছুই খুঁজে পাচ্ছি না।

উত্তর:


372

আপনি ResultSetমেটাডেটা থেকে এই তথ্যটি পেতে পারেন । রেজাল্টসেটমেটাডেটা দেখুন

যেমন

 ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
 ResultSetMetaData rsmd = rs.getMetaData();
 String name = rsmd.getColumnName(1);

এবং আপনি সেখান থেকে কলামের নাম পেতে পারেন। যদি তুমি করো

select x as y from table

তারপরে rsmd.getColumnLabel()আপনাকে পুনরুদ্ধারকৃত লেবেলের নামও পাবেন।


22
আপনি rsmd.getColumnLabelযদি লেবেলগুলি সহ কলামগুলি পুনরুদ্ধার করেন তবে দেখুন (উদাহরণস্বরূপSELECT columnName AS ColumnLabel
T30

15
আপনি কলামের গণনাটি 1 থেকে শুরু করে দেখে অবাক হয়ে যেতে পারেন আপনি কলামের মাধ্যমে পুনরাবৃত্তি করতে পারেনfor (int i = 1; i <= rsmd.getColumnCount(); i++) String name = rsmd.getColumnName(i);
Alphaaa

না getColumnName()মূল কলামের নামের আসতে যদি ব্যবহার না ASনামকরণের ওরফে?
সদস্যরা

2
@membersound হ্যাঁ, নথিভুক্ত যেমন তার Javadoc : "একটি এসকিউএল যদি ASনির্দিষ্ট করা না থাকে, থেকে ফিরে মান getColumnLabelদ্বারা ফিরে মান হিসাবে একই হবে getColumnNameপদ্ধতি।" । প্রায় সব ক্ষেত্রে আপনার getColumnLabelপরিবর্তে ব্যবহার করা উচিত getColumnName
মার্ক রোটিভেল

1
টেবিল খালি থাকলে এটি ব্যর্থ হবে।
অ্যান্ড্রোনিক্স

140

উপরের উত্তরগুলি ছাড়াও, যদি আপনি একটি গতিশীল ক্যোয়ারী নিয়ে কাজ করছেন এবং আপনি কলামের নামগুলি জানতে চান তবে কলাম কতগুলি কলাম রয়েছে তা আপনি জানেন না, আপনি প্রথমে কলামগুলির সংখ্যা পেতে রেজাল্টসেটমেটাডেটা অবজেক্টটি ব্যবহার করতে পারেন এবং তারপরে চক্রটি চালিয়ে যেতে পারেন ।

ব্রায়ানের কোড সংশোধন:

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();

// The column count starts from 1
for (int i = 1; i <= columnCount; i++ ) {
  String name = rsmd.getColumnName(i);
  // Do stuff with name
}

এটা ঠিক না? (int i = 1; i <= কলামাউন্ট + 1; i ++) এর জন্য {...}
মার্টিন

3
@ মার্টিন নো, কারণ এটি কলামটি এন + 1 পাওয়ার চেষ্টা করবে যা বিদ্যমান নেই। আপনি যদি একেবারে সংক্ষিপ্ত হতে চান, তবে তা হবে i <= columnCount
সিনটেক

21

আপনি এর জন্য রেজাল্টসেটমেটাডেটা ( http://java.sun.com/javase/6/docs/api/java/sql/ResultSetMetaData.html ) অবজেক্টটি ব্যবহার করতে পারেন:

ResultSet rs = stmt.executeQuery("SELECT * FROM table");
ResultSetMetaData rsmd = rs.getMetaData();
String firstColumnName = rsmd.getColumnName(1);

1
থ্যাঙ্কস এটি আমাকে সহায়তা করেছিল ... আমি এটি হিসাবে ব্যবহার করেছি: ফলাফলসেট.সেটস্ট্রিং (ফলাফলসেট.ফাইন্ডকালাম ("পুরো নাম"))
সি

প্রাপ্ত রেকর্ডগুলি 1 এ সীমাবদ্ধ করুন Otherwise যেমন টেরেডিটাবেসের জন্য: "টেবিলের নমুনা 1 থেকে 1 নির্বাচন করুন" কোয়েরিটি ব্যবহার করুন
জোসেপেইনকমাল

11

এই প্রশ্নটি পুরানো এবং ঠিক আগের উত্তরগুলিও রয়েছে। তবে আমি যখন এই বিষয়টি পেয়েছি তখন আমি যা খুঁজছিলাম তা এই সমাধানের মতো। আশা করি এটি কাউকে সাহায্য করবে।

// Loading required libraries    
import java.util.*;
import java.sql.*;

public class MySQLExample {
  public void run(String sql) {
    // JDBC driver name and database URL
    String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    String DB_URL = "jdbc:mysql://localhost/demo";

    // Database credentials
    String USER = "someuser"; // Fake of course.
    String PASS = "somepass"; // This too!

    Statement stmt = null;
    ResultSet rs = null;
    Connection conn = null;
    Vector<String> columnNames = new Vector<String>();

    try {
      // Register JDBC driver
      Class.forName(JDBC_DRIVER);

      // Open a connection
      conn = DriverManager.getConnection(DB_URL, USER, PASS);

      // Execute SQL query
      stmt = conn.createStatement();
      rs = stmt.executeQuery(sql);
      if (rs != null) {
        ResultSetMetaData columns = rs.getMetaData();
        int i = 0;
        while (i < columns.getColumnCount()) {
          i++;
          System.out.print(columns.getColumnName(i) + "\t");
          columnNames.add(columns.getColumnName(i));
        }
        System.out.print("\n");

        while (rs.next()) {
          for (i = 0; i < columnNames.size(); i++) {
            System.out.print(rs.getString(columnNames.get(i))
                + "\t");

          }
          System.out.print("\n");
        }

      }
    } catch (Exception e) {
      System.out.println("Exception: " + e.toString());
    }

    finally {
      try {
        if (rs != null) {
          rs.close();
        }
        if (stmt != null) {
          stmt.close();
        }
        if (conn != null) {
          conn.close();
        }
      } catch (Exception mysqlEx) {
        System.out.println(mysqlEx.toString());
      }

    }
  }
}

5

এসকিউএলাইট 3

GetMetaData () ব্যবহার করে;

DatabaseMetaData md = conn.getMetaData();
ResultSet rset = md.getColumns(null, null, "your_table_name", null);

System.out.println("your_table_name");
while (rset.next())
{
    System.out.println("\t" + rset.getString(4));
}

সম্পাদনা: এটি পোস্টগ্রাসএসকিউএল এর সাথেও কাজ করে


এটি একটি টেরাদাটা ডাটাবেসে চেষ্টা করে ত্রুটি পেয়েছে "[টেরাদাতা ডেটাবেস] [টেরাজেডিবিসি 16.20.00.02] [ত্রুটি 9719] [এসকিউএলস্টেট এইচওয়াই 1000] কিউভিসিআই বৈশিষ্ট্যটি অক্ষম করা আছে।"
জোসেপেনুমকাল

2
import java.sql.*;

public class JdbcGetColumnNames {

    public static void main(String args[]) {
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/komal", "root", "root");

            st = con.createStatement();

            String sql = "select * from person";
            rs = st.executeQuery(sql);
            ResultSetMetaData metaData = rs.getMetaData();

            int rowCount = metaData.getColumnCount();

            System.out.println("Table Name : " + metaData.getTableName(2));
            System.out.println("Field  \tDataType");

            for (int i = 0; i < rowCount; i++) {
                System.out.print(metaData.getColumnName(i + 1) + "  \t");
                System.out.println(metaData.getColumnTypeName(i + 1));
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

সারণীর নাম: ব্যক্তি মাঠের ডেটা টাইপ আইডি VARCHAR cname VARCHAR dob DATE


1

যখন আপনার কলামের নামগুলি দরকার তবে এন্ট্রিগুলি ধরতে চান না:

PreparedStatement stmt = connection.prepareStatement("SHOW COLUMNS FROM `yourTable`");

ResultSet set = stmt.executeQuery();

//store all of the columns names
List<String> names = new ArrayList<>();
while (set.next()) { names.add(set.getString("Field")); }

দ্রষ্টব্য: কেবল মাইএসকিউএল নিয়ে কাজ করে


1
এটি কেবল আমার জন্য কাজ করেছিল !!। এই জন্য নিচে আসতে হবে। কেন নিশ্চিত হন না কেন কলমনেম (i) এবং গিফট কলাম লেবেল (i), আমাকে অপ্রত্যাশিত অদ্ভুত ডেটা পুনরুদ্ধার করলেন। অনেক ধন্যবাদ!
ভিপিএন নেগি

খুশি এই আপনাকে সাহায্য!
হান্টার এস

1
while (rs.next()) {
   for (int j = 1; j < columncount; j++) {
       System.out.println( rsd.getColumnName(j) + "::" + rs.getString(j));      
   }
}

6
দয়া করে, আপনি আরও বিস্তারিত ব্যাখ্যা দিয়ে আপনার উত্তরটি প্রসারিত করতে পারেন? এটি বোঝার জন্য খুব দরকারী হবে। ধন্যবাদ!
ভেজঞ্চিক

1

এসকিউএল স্টেটমেন্টগুলি যা একটি ডাটাবেস ক্যোয়ারী থেকে ডেটা পড়ে থাকে ফলাফল ফলাফলের মধ্যে ডেটা ফেরত দেয়। নির্বাচনের বিবৃতি হ'ল একটি ডাটাবেস থেকে সারিগুলি নির্বাচন করার এবং ফলাফল সেটে তাদের দেখার আদর্শ উপায়। **java.sql.ResultSet**ইন্টারফেস একটি ডাটাবেস ক্যোয়ারী ফলাফল সেট প্রতিনিধিত্ব করে।

  • পদ্ধতিগুলি পান: কার্সার দ্বারা নির্দেশিত বর্তমান সারির কলামগুলিতে ডেটা দেখতে ব্যবহৃত হয়।

ব্যবহার MetaData of a result set to fetch the exact column count

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();
boolean b = rsmd.isSearchable(1);

http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSetMetaData.html

এবং আরও ডেটা মডেল টেবিল এ আবদ্ধ করতে আরও

public static void main(String[] args) {
    Connection conn = null;
    Statement stmt = null;
    try {
        //STEP 2: Register JDBC driver
        Class.forName("com.mysql.jdbc.Driver");

        //STEP 3: Open a connection
        System.out.println("Connecting to a selected database...");
        conn = DriverManager.getConnection(DB_URL, USER, PASS);
        System.out.println("Connected database successfully...");

        //STEP 4: Execute a query
        System.out.println("Creating statement...");
        stmt = conn.createStatement();

        String sql = "SELECT id, first, last, age FROM Registration";
        ResultSet rs = stmt.executeQuery(sql);
        //STEP 5: Extract data from result set
        while(rs.next()){
            //Retrieve by column name
            int id  = rs.getInt("id");
            int age = rs.getInt("age");
            String first = rs.getString("first");
            String last = rs.getString("last");

            //Display values
            System.out.print("ID: " + id);
            System.out.print(", Age: " + age);
            System.out.print(", First: " + first);
            System.out.println(", Last: " + last);
        }
        rs.close();
    } catch(SQLException se) {
        //Handle errors for JDBC
        se.printStackTrace();
    } catch(Exception e) {
        //Handle errors for Class.forName
        e.printStackTrace();
    } finally {
        //finally block used to close resources
        try {
            if(stmt!=null)
                conn.close();
        } catch(SQLException se) {
        } // do nothing
        try {
            if(conn!=null)
                conn.close();
        } catch(SQLException se) {
            se.printStackTrace();
        } //end finally try
    }//end try
    System.out.println("Goodbye!");
}//end main
//end JDBCExample

এখানে খুব সুন্দর টিউটোরিয়াল: http://www.tutorialspPoint.com/jdbc/

ResultSetMetaData meta = resultset.getMetaData();  // for a valid resultset object after executing query

Integer columncount = meta.getColumnCount();

int count = 1 ; // start counting from 1 always

String[] columnNames = null;

while(columncount <=count) {
    columnNames [i] = meta.getColumnName(i);
}

System.out.println (columnNames.size() ); //see the list and bind it to TableModel object. the to your jtbale.setModel(your_table_model);

0

@ সিনটেক ঠিক আছে।

যদি আপনার টেবিলটি খালি থাকে তবে আপনার সারণী কলামের নামগুলি পাওয়া দরকার যা আপনি আপনার কলামটি ভেক্টর হিসাবে টাইপ করতে পারেন, নিম্নলিখিতটি দেখুন:

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();

Vector<Vector<String>>tableVector = new Vector<Vector<String>>(); 
boolean isTableEmpty = true;
int col = 0;

 while(rs.next())
    {
      isTableEmpty = false;  //set to false since rs.next has data: this means the table is not empty
       if(col != columnCount)
          {
            for(int x = 1;x <= columnCount;x++){
                 Vector<String> tFields = new Vector<String>(); 
                 tFields.add(rsmd.getColumnName(x).toString());
                 tableVector.add(tFields);
             }
            col = columnCount;
          }
     } 


      //if table is empty then get column names only
  if(isTableEmpty){  
      for(int x=1;x<=colCount;x++){
           Vector<String> tFields = new Vector<String>(); 
           tFields.add(rsmd.getColumnName(x).toString());
           tableVector.add(tFields);
        }
      }

 rs.close();
 stmt.close();

 return tableVector; 

0
ResultSet rsTst = hiSession.connection().prepareStatement(queryStr).executeQuery(); 
ResultSetMetaData meta = rsTst.getMetaData();
int columnCount = meta.getColumnCount();
// The column count starts from 1

String nameValuePair = "";
while (rsTst.next()) {
    for (int i = 1; i < columnCount + 1; i++ ) {
        String name = meta.getColumnName(i);
        // Do stuff with name

        String value = rsTst.getString(i); //.getObject(1);
        nameValuePair = nameValuePair + name + "=" +value + ",";
        //nameValuePair = nameValuePair + ", ";
    }
    nameValuePair = nameValuePair+"||" + "\t";
}

0

আপনি যদি বসন্তের jdbctemplate ব্যবহার করতে চান এবং সংযোগ কর্মীদের সাথে ডিল করতে না চান, আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

jdbcTemplate.query("select * from books", new RowCallbackHandler() {
        public void processRow(ResultSet resultSet) throws SQLException {
            ResultSetMetaData rsmd = resultSet.getMetaData();
            for (int i = 1; i <= rsmd.getColumnCount(); i++ ) {
                String name = rsmd.getColumnName(i);
                // Do stuff with name
            }
        }
    });

0

ফলসেট.টেটমেটাডেটা () থেকে আপনি কলামের নাম এবং মান পেতে পারেন; এই কোডটি আমার পক্ষে কাজ করে:

Connection conn = null;
PreparedStatement preparedStatement = null;
    try {
        Class.forName("com.mysql.cj.jdbc.Driver");
        conn = MySQLJDBCUtil.getConnection();
        preparedStatement = conn.prepareStatement(sql);
        if (params != null) {
            for (int i = 0; i < params.size(); i++) {
                preparedStatement.setObject(i + 1, params.get(i).getSqlValue());
            }
            ResultSet resultSet = preparedStatement.executeQuery();
            ResultSetMetaData md = resultSet.getMetaData();
            while (resultSet.next()) {
                int counter = md.getColumnCount();
                String colName[] = new String[counter];
                Map<String, Object> field = new HashMap<>();
                for (int loop = 1; loop <= counter; loop++) {
                    int index = loop - 1;
                    colName[index] = md.getColumnLabel(loop);
                    field.put(colName[index], resultSet.getObject(colName[index]));
                }
                rows.add(field);
            }
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if (preparedStatement != null) {
            try {
                preparedStatement.close();
            }catch (Exception e1) {
                e1.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    return rows;

0

আমি জানি, এই প্রশ্নের ইতিমধ্যে উত্তর দেওয়া হয়েছে তবে সম্ভবত আমার মতো কারও DatabaseMetaDataকাছে সূচকের পরিবর্তে লেবেল থেকে একটি কলামের নাম অ্যাক্সেস করতে হবে:

ResultSet resultSet = null;
DatabaseMetaData metaData = null;

    try {
        metaData  = connection.getMetaData();
        resultSet = metaData.getColumns(null, null, tableName, null);

        while (resultSet.next()){
            String name = resultSet.getString("COLUMN_NAME");
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.