Мне нужно генерировать 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;*/
}
}
}
Почему вы повторяете все строки? "while (rs.next())" Вам нужно только один раз получить ResultSetMetaData! Каждая строка будет иметь одинаковые метаданные. Вам не нужно называть «rs.next()» –
Согласитесь, но мне нужно перебирать все строки, потому что мне нужно также получить данные, чтобы генерировать INSERT stmt для этой строки, следовательно, rs.next(), не уверен, что это ответит на ваш вопрос. –
Если вы правильно поняли, то ваша задача - экспортировать данные из базы данных mysql. Есть инструменты, которые могут сделать это намного лучше, чем ваша собственная программа. Пожалуйста, подумайте о проблемах, когда данные меняются при запуске вашего экспорта. В частности, когда таблица ссылается на другую. Я бы поискал правильный инструмент для выполнения экспортной работы. –