【问题标题】:Check if a column is auto incremented in Sybase with JDBC使用 JDBC 在 Sybase 中检查列是否自动递增
【发布时间】:2010-10-07 21:55:38
【问题描述】:

要检查列是否自动递增,我可以执行以下操作

Connection con = ...    
DatabaseMetaData meta = con.getMetaData();
ResultSet metaCols = meta.getColumns(catalog, schema, table, "%");
while ( metaCols.next() )   
     String value = rs.getString("IS_AUTOINCREMENT")    
  ...

除了 Sybase 数据库外工作正常。我已经尝试使用 jTDS 和 JConnect 驱动程序,但是使用这两个驱动程序我都得到了这个异常:

java.sql.SQLException: Invalid column name IS_AUTOINCREMENT.

是否有另一个 get 发现,Sybase 中的列是否自动递增? 我认为“IS_AUTOINCREMENT”是 JDBC4 的一个特性,而 jTDS 是一个 JDBC4 兼容的驱动程序。

【问题讨论】:

  • 对于未来的人,您可以查看我的以下答案以检查列是否为身份

标签: java jdbc metadata sybase


【解决方案1】:

Sybase 使用“身份”列而不是“默认自动增量”,这就是我相信您收到此消息的原因。

尝试检查 TYPE_NAME 列是否包含关键字“身份”。

身份列的行为也有些不同,但这是一个问题。

【讨论】:

  • 标识或标识列不存在。但感谢您的建议。请参阅我在您提示后找到的答案。
【解决方案2】:

对不起,我误解了你在下面使用 sp_help 发现如果标识列包含 1 则该列是标识。

还有其他可用的方法。如果我知道您会对 SQL 命令(例如 sp_help、sp_columns 和从 systemtables 中选择)感到满意,我可以在几秒钟内给您答案,我当时正专注于 Java 方法。

祝你好运。

【讨论】:

    【解决方案3】:

    您使用的是什么版本的 JConnect?尝试使用 6。它应该可以使用:

    DatabaseMetaData.getTypeInfo()

    PS。对不起,刚接触这个网站,没有足够的积分来评论你的帖子:(

    【讨论】:

    • DatabaseMetaData.getTypeInfo() 只返回数据库支持的数据类型。但是这些信息对查找标识列没有帮助。
    【解决方案4】:

    sp_help 提供了我需要的所有信息。 此 SP 返回几个 ResultSet。 第三个 ResultSet 包含我需要的信息。

    Statement stmt = con.createStatement();
    stmt.executeQuery("sp_help " + table);
    stmt.getMoreResults();
    stmt.getMoreResults();
    ResultSet rs = stmt.getResultSet();
    //...
    while( rs.next() )
       boolean identity = rs.getBoolean("Identity");
    

    【讨论】:

      【解决方案5】:

      这是获取身份信息最简单的方法

      
      
      ResultSet tableInfo = tableInfoQuery.executeQuery("SELECT * FROM " + tableName + " WHERE 1=2");
      ResultSetMetaData rsMetaData = tableInfo.getMetaData();
      for (int i = 1; i < = rsMetaData.getColumnCount(); i++)
      {rsMetaData.isAutoIncrement(i);}
      
      
      

      【讨论】:

        【解决方案6】:

        如果要查询列是否标识,可以使用系统表syscolumns。所以根据sybase infocenter,syscolumns 中status 列的值128 是标识。

        select * from sysobjects so
        inner join syscolumns sc on so.id=sc.id
        where so.name='EX_EMPLOYEE' and sc.name='ID' and sc.status=128
        

        【讨论】:

          【解决方案7】:
          Connection conn; <...create connection...>
          ResultSet rs1 = conn.createStatement().executeQuery("SELECT * FROM table1");
          ResultSetMetaData rsmd1 = rs1.getMetadata();
          for (int i=1;i<rsmd1.getColumnCount();i++) { 
          switch (rsmd1.getColumnTypeName(i).toUpperCase())
            case "ID":
              System.out.println("Identity column: " + rsmd1.getColumnName(i));
              break;
            default: 
          }
          }
          

          【讨论】:

            猜你喜欢
            • 2012-11-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-15
            • 1970-01-01
            • 1970-01-01
            • 2014-11-22
            • 1970-01-01
            相关资源
            最近更新 更多