我需要在運行時動態地爲數據庫中的所有表生成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;*/
}
}
}
爲什麼你迭代所有行? 「while(rs.next())」 您只需一次獲取ResultSetMetaData!每行都有完全相同的元數據。你不需要調用「rs.next()」 –
同意,但我需要迭代所有行,因爲我需要獲取數據以及爲該行生成INSERT stmt,因此rs.next(),不知道這是否回答您的查詢 –
如果我理解你是正確的,比你的任務是從MySQL數據庫導出數據。有些工具可以做得比你自己的程序好得多。 請考慮在導出運行時數據發生變化時的問題。特別是當一個表引用另一個時。 我會尋找合適的工具來完成出口工作。 –