如何动态确定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;*/
}
}
}
答
你有没有试过用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
以上评论道歉,它工作得很好。欣赏!! –
为什么你迭代所有行? “while(rs.next())” 您只需一次获取ResultSetMetaData!每行都有完全相同的元数据。你不需要调用“rs.next()” –
同意,但我需要迭代所有行,因为我需要获取数据以及为该行生成INSERT stmt,因此rs.next(),不知道这是否回答您的查询 –
如果我理解你是正确的,比你的任务是从MySQL数据库导出数据。有些工具可以做得比你自己的程序好得多。 请考虑在导出运行时数据发生变化时的问题。特别是当一个表引用另一个时。 我会寻找合适的工具来完成出口工作。 –