如何动态确定结果集列类型

How To determine the ResultSet Column type dynamically

我需要在运行时为数据库中的所有 table 动态生成一个 INSERT stmt。我正在逐一获取 table 内容(数据),并在运行时确定列类型,同时循环遍历 ResultSet 和 ResultSetMetaData,以便为字符串类型添加双引号(“),而不是为非添加相同的内容字符串类型的列。然而,在当前逻辑实现的情况下,它忽略了第一条记录,并且对 table 中的所有剩余记录都工作得很好。我知道它为什么工作,因为在获取 rs.getColumnType(int columnIndex) 时我们需要给出从 1 个索引开始的列名..但无法构建逻辑以便它也检查第一行而不是暂时忽略它..

请看下面的代码片段

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;*/
                }
            }
        }

你试过像这样使用 do 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());
    }