【问题标题】:How do you get values from all columns using ResultSet.getBinaryStream() in jdbc?如何在 jdbc 中使用 ResultSet.getBinaryStream() 从所有列中获取值?
【发布时间】:2014-09-16 14:37:47
【问题描述】:

如何使用 jdbc 将整个表写入平面文件(文本文件)?到目前为止,我尝试了以下方法:

Statement statement = connection.createStatement();
   ResultSet result = statement.executeQuery("SELECT * FROM tablename");
   BufferedInputStream buffer;
   FileOutputStream out = new FileOutputStream("flatfile.txt");
   while(result.next() )
   {
      buffer =  new BufferedInputStream(result.getBinaryStream("????") );
      byte[] buf = new byte[4 * 1024]; //4K buffer
      int len;
      while( (len = buffer.read(buf, 0, buf.length) ) != -1 )
      {
          out.write(buf, 0, len );
      }
   }
   out.close();

“???”只是我的占位符。我被困在作为参数传递的内容上。

【问题讨论】:

  • 你有什么问题?
  • 我只是替换'????'用“”来获取所有列,或者 ResultSet 或其他类中是否有另一个函数来获取整行?我只想要整行。不只是该记录的一列。我还没有要测试的数据库连接,所以我只是想提前弄清楚,所以我准备好了。
  • ResultSet 不提供处理整行的方法。您需要单独处理列。您可能会发现 getMetaData() 方法很有用。
  • Plus getBinaryStream() 仅适用于 BLOB 列 - 仅此而已。
  • 好吧,这就是我的想法,java.sql.Statement 似乎除了 executeQuery() 之外没有其他任何东西,那么还有其他类可以帮助解决这个问题吗?

标签: java sql jdbc db2 resultset


【解决方案1】:

您可以使用以下代码从表中获取所有列名和整个数据。 writeToFile 方法将包含写入文件的逻辑(如果这还不够明显:))

    ResultSetMetaData metadata = rs.getMetaData();
    int columnCount = metadata.getColumnCount();    
    for (int i = 1; i <= columnCount; i++) {
        writeToFile(metadata.getColumnName(i) + ", ");      
    }
    System.out.println();
    while (rs.next()) {
        String row = "";
        for (int i = 1; i <= columnCount; i++) {
            row += rs.getString(i) + ", ";          
        }
        System.out.println();
        writeToFile(row);

    }

【讨论】:

  • 啊,可惜没有ResultSet.getRow方法!
  • @gokul_uf,要获取特定行,我们必须使用 absolute(rowNum) 将光标移动到 ResultSet 中的相应行,然后处理行内的列。 ResultSet.getRow 本身会混淆要返回哪一行??
【解决方案2】:

这是我从 JDBC 连接转储表的方法,如果您想查看内存(例如:HSQL)数据库中的所有行,这对于调试非常有用:

  public static void spitOutAllTableRows(String tableName, Connection conn) {
    try {
      System.out.println("current " + tableName + " is:");
      try (PreparedStatement selectStmt = conn.prepareStatement(
              "SELECT * from " + tableName, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
           ResultSet rs = selectStmt.executeQuery()) {
        if (!rs.isBeforeFirst()) {
          System.out.println("no rows found");
        }
        else {
          System.out.println("types:");
          for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {
            System.out.print(rs.getMetaData().getColumnName(i + 1) + ":" + rs.getMetaData().getColumnTypeName(i + 1) + " ");
          }
          System.out.println();
          while (rs.next()) {
            for (int i = 1; i < rs.getMetaData().getColumnCount() + 1; i++) {
              System.out.print(" " + rs.getMetaData().getColumnName(i) + "=" + rs.getObject(i));
            }
            System.out.println("");
          }
        }
      }
    }
    catch (SQLException e) {
      throw new RuntimeException(e);
    }
  }

输出是这样的

 current <yourtablename> is:
 types:ID:INT YOURCOLUMN1:VARCHAR YOURCOLUMN2:VARCHAR
 ID=1 YOURCOLUMN1=abc YOURCOLUMN2=null
 ID=2 YOURCOLUMN1=def YOURCOLUMN2=ghi
 ...

【讨论】:

    【解决方案3】:

    result.getBinaryStream("????") 只会返回您作为占位符放置的该列的值。

    如果要获取所有列,需要使用ResultSetMetaData from ResultSet

        ResultSetMetaData metadata = resultSet.getMetaData();
        int columnCount = metadata.getColumnCount();
        for (int i=1; i<=columnCount; i++) 
        {
            String columnName = metadata.getColumnName(i);
            System.out.println(columnName);
        }
    

    【讨论】:

    • 谢谢 sendon1982,我想我可以使用 getBinaryCount() 循环遍历表中的每一列,然后传入列索引以打印出整个表。我只是想知道是否有一种方法可以用一个函数来吐出整个表,但这就是全部。
    • 不客气。不,你必须使用循环来一一显示。
    猜你喜欢
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2020-12-01
    • 2019-05-16
    • 2015-04-05
    • 2011-02-06
    • 2021-04-25
    相关资源
    最近更新 更多