2016-08-12 108 views
1

我需要在運行時動態地爲數據庫中的所有表生成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數據庫導出數據。有些工具可以做得比你自己的程序好得多。 請考慮在導出運行時數據發生變化時的問題。特別是當一個表引用另一個時。 我會尋找合適的工具來完成出口工作。 –

回答

2

你有沒有試過用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 <1。基本上問題是循環以第一個索引開始,因爲它是fetColumnType()所需的,並且rs指針移動到第一行,當我做rs.getObject一世)。希望你瞭解情況.. –

+0

以上評論道歉,它工作得很好。欣賞!! –