2016-08-12 3 views
1

Мне нужно генерировать INSERT stmt для всех таблиц в DB динамически во время выполнения. Я собираю содержимое таблицы (данные) один за другим и определяю тип столбца во время выполнения при циклическом выполнении ResultSet & ResultSetMetaData, чтобы добавить Double Quotes (") для типа String и не добавляя то же самое для типов строк без строк Однако при реализации текущей логики она игнорирует первую запись и отлично работает для всех остальных записей в таблице. Я знаю, почему она работает, так как при извлечении 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. В основном проблема заключается в том, что цикл начинается с 1-го индекса, как это требуется для fetColumnType(), и указатель rs перемещается в первую строку, когда я делаю rs.getObject (я). Надеюсь, вы понимаете ситуацию. –

+0

Извинения за комментарий выше, он отлично работает. Цените !! –

Смежные вопросы