繁体   English   中英

如何动态确定ResultSet列类型

[英]How To determine the ResultSet Column type dynamically

我需要在运行时为数据库中的所有表动态生成INSERT stmt。 我正在一张一张地获取表内容(数据)并在运行时确定列类型,同时遍历ResultSet和ResultSetMetaData以便为字符串类型添加双引号(“)而不为非字符串类型的列添加相同的内容但是,在实现当前逻辑的情况下,它会忽略第一条记录,并且对于表中的所有剩余记录都可以正常工作。我知道它为什么起作用,因为在获取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());
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM