如何动态确定ResultSet列类型

问题描述:

我需要在运行时动态地为数据库中的所有表生成INSERT stmt。我逐个获取表内容(数据),并在运行时确定列类型,同时循环ResultSetMetaData以便为字符串类型添加双引号(“),而不为非字符串类型的列添加相同但是在实现当前逻辑的情况下,它忽略了第一条记录,并且对于表中所有剩余的记录来说工作得很好,我知道它为什么起作用,因为在获取rs.getColumnType(int columnIndex)时我们需要给出从1索引开始的列名。但不能够建立逻辑,这样它会检查的第一行还而不是此刻忽略它..如何动态确定ResultSet列类型

请参考下面的代码片段

if (rs != null) { 
    while (rs.next()) { 
     sqlString = new StringBuffer(); 

     for (int i = 1; i <= columnCount; i++) { 
      Object obj = rs.getObject(i); 

      if (obj == null) { 
       sqlString.append("null"); 
       sqlString.append(","); 
      } 
      else 
      { 
       int sqlTypes = rsmd.getColumnType(i); 

       switch (sqlTypes) { 
        case Types.VARCHAR: 
         sqlString.append("\""); 
         if (obj != null) 
          sqlString.append(rs.getString(i)); 

         sqlString.append("\""); 
         sqlString.append(","); 
         break; 
        case Types.NULL: 
         sqlString.append("null"); 
         sqlString.append(","); 
         break; 
        case Types.CHAR: 
         sqlString.append("\""); 
         if (obj != null) 
          sqlString.append(rs.getString(i)); 

         sqlString.append("\""); 
         sqlString.append(","); 
         break; 
        case Types.TIMESTAMP: 
         sqlString.append("\""); 
         if (obj != null) 
          sqlString.append(rs.getTimestamp(i)); 

         sqlString.append("\""); 
         sqlString.append(","); 
         break; 
        case Types.DOUBLE: 
         if (obj != null) 
          sqlString.append(rs.getDouble(i)); 

         sqlString.append(","); 
         break; 
        case Types.INTEGER: 
         if (obj != null) 
          sqlString.append(rs.getInt(i)); 

         sqlString.append(","); 
         break; 
        case Types.SMALLINT: 
         if (obj != null) 
          sqlString.append(rs.getInt(i)); 

         sqlString.append(","); 
         break; 
        case Types.DECIMAL: 
         if (obj != null) 
          sqlString.append(rs.getBigDecimal(i)); 

         sqlString.append(","); 
         break; 

        /*default: 
         if (obj != null) 
          sqlString.append(obj.toString()); 

         sqlString.append(","); 
         break;*/ 
       } 
      } 
     } 
+0

为什么你迭代所有行? “while(rs.next())” 您只需一次获取ResultSetMetaData!每行都有完全相同的元数据。你不需要调用“rs.next()” –

+0

同意,但我需要迭代所有行,因为我需要获取数据以及为该行生成INSERT stmt,因此rs.next(),不知道这是否回答您的查询 –

+0

如果我理解你是正确的,比你的任务是从MySQL数据库导出数据。有些工具可以做得比你自己的程序好得多。 请考虑在导出运行时数据发生变化时的问题。特别是当一个表引用另一个时。 我会寻找合适的工具来完成出口工作。 –

你有没有试过用while循环这样做:

if (rs != null) { 
    do{ 
    sqlString = new StringBuffer(); 

    for (int i = 1; i <= columnCount; i++) { 
     Object obj = rs.getObject(i); 

     if (obj == null) { 
      sqlString.append("null"); 
      sqlString.append(","); 
     } 
     else 
     { 
      int sqlTypes = rsmd.getColumnType(i); 

      switch (sqlTypes) { 
       case Types.VARCHAR: 
        sqlString.append("\""); 
        if (obj != null) 
         sqlString.append(rs.getString(i)); 

        sqlString.append("\""); 
        sqlString.append(","); 
        break; 
       case Types.NULL: 
        sqlString.append("null"); 
        sqlString.append(","); 
        break; 
       case Types.CHAR: 
        sqlString.append("\""); 
        if (obj != null) 
         sqlString.append(rs.getString(i)); 

        sqlString.append("\""); 
        sqlString.append(","); 
        break; 
       case Types.TIMESTAMP: 
        sqlString.append("\""); 
        if (obj != null) 
         sqlString.append(rs.getTimestamp(i)); 

        sqlString.append("\""); 
        sqlString.append(","); 
        break; 
       case Types.DOUBLE: 
        if (obj != null) 
         sqlString.append(rs.getDouble(i)); 

        sqlString.append(","); 
        break; 
       case Types.INTEGER: 
        if (obj != null) 
         sqlString.append(rs.getInt(i)); 

        sqlString.append(","); 
        break; 
       case Types.SMALLINT: 
        if (obj != null) 
         sqlString.append(rs.getInt(i)); 

        sqlString.append(","); 
        break; 
       case Types.DECIMAL: 
        if (obj != null) 
         sqlString.append(rs.getBigDecimal(i)); 

        sqlString.append(","); 
        break; 

       /*default: 
        if (obj != null) 
         sqlString.append(obj.toString()); 

        sqlString.append(","); 
        break;*/ 
      } 
     }while (rs.next()); 
    } 
+0

没有。它引发同样的错误,即列索引超出范围,0

+0

以上评论道歉,它工作得很好。欣赏!! –