【问题标题】:Getting the JDBC column types获取 JDBC 列类型
【发布时间】:2013-08-05 04:31:03
【问题描述】:

我需要在表格中询问我的列 jdbc 类型,今天我循环抛出我的列然后询问它的类型,请参阅下面的代码:

public int getColumnDataTypeFromDB(String columnName) {
    int datatype = 0;

    ResultSet columns = null;
    try {
        String schema =
            getMetaDataCatalogName() != null
                ? getMetaDataCatalogName()
                : getMetaDataSchemaName();

        if (TableManagerFactory.isCatalogBasedDatabase()) {
            columns =
                getMetaData().getColumns(
                    schema,
                    null,
                    tableName,
                    columnName);
        } else {
            columns =
                getMetaData().getColumns(
                    null,
                    schema,
                    tableName,
                    columnName);
        }
        //          columns =
        //              getMetaData().getColumns(getMetaDataCatalogName(), getMetaDataSchemaName(), tableName, columnName);
        if (columns.next()) {
            datatype = columns.getInt("DATA_TYPE");
        }
    } catch (SQLException ex) {
        Log.error(
            this,
            "Error while getting columns information: " + ex.getMessage(),
            ex);
        //return false;
    } catch (DDLCreationException ex) {
        Log.error(this, ex.getMessage());
    } finally {
        try {
            if (columns != null) {
                columns.close();
            }
        } catch (SQLException ex) {
        Log.error(this, ex.getLocalizedMessage());
        }
    }

    return datatype;
}

我可以同时获取此类表中的所有列元数据吗? 如果是的话,我该怎么做??

【问题讨论】:

  • 你试过答案了吗?

标签: java jdbc resultset


【解决方案1】:

您似乎正在寻找列的数据类型,然后 getColumnTypeName 将是一个

System.out.println(rsMaster.getMetaData().getColumnName(1));
System.out.println(rsMaster.getMetaData().getColumnType(1));
System.out.println(rsMaster.getMetaData().getColumnTypeName(1));
System.out.println(rsMaster.getMetaData().getColumnDisplaySize(1));
System.out.println(rsMaster.getMetaData().getColumnLabel(1));

【讨论】:

    【解决方案2】:

    使用 jdbc ResultSetMetaData 类获取表列的详细信息。

     ResultSet res=stmt.executeQuery("select * from tableName where 1<0");
     ResultSetMetaData rsmd=res.getMetaData();
     rsmd.getColumnType(1);
     rsmd.getColumnLabel(1);
     rsmd.getColumnDisplaySize(1);
    

    【讨论】:

    • 如果查询返回 0 行,这将执行得更好。为了加快速度,您应该真正使用“select * from tableName where 1 = 2”
    • @lance-java, "为了加快速度,你应该真正使用 "select * from tableName where 1 = 2" 不是一个准确的语句,因为它取决于执行查询的数据库引擎。我已经与执行全表扫描的数据库合作,以确定没有满足条件“1 = 2”的记录。我同意“如果从查询中返回 0 行,这将执行得更好”,但它需要以特定于执行查询的引擎的方式完成。
    • 为什么是where 1&lt;0? (或来自@lance-java 的1=2
    【解决方案3】:

    DatabaseMetaData.getColumns(..) 的参数应该是LIKE 模式。所以如果你想从一个表中获取所有的列,你只需将"%"传递给最后一个参数columnNamePattern

    getMetaData().getColumns(null, schema, tableName, "%");
    

    某些驱动程序(也)在此处允许null,但并非所有驱动程序都这样做(JDBC 规范和 API 文档并不完全清楚是否允许此参数)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多