检查Sybase中是否使用JDBC自动增加列

时间:2009-02-16 15:50:08

标签: java jdbc metadata sybase

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

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.

是否还有另一个问题,Sybase中的列是否自动递增? 我认为“IS_AUTOINCREMENT”是JDBC4的一个功能,而jTDS是JDBC4兼容的驱动程序。

7 个答案:

答案 0 :(得分:3)

Sybase使用'identity'列而不是'default autoincrement',这就是我相信你收到此消息的原因。

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

标识列的行为也有一点不同,但这是暂时的。

答案 1 :(得分:1)

很抱歉,我误解了你在下面使用sp_help发现如果标识列包含1,那么该列是一个标识。

还有其他可用的方法。如果我知道你会对sp_help,sp_columns和从系统表中选择等SQL命令感到满意的话,那我就专注于Java方法了。

祝你好运。

答案 2 :(得分:0)

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

了DatabaseMetaData.getTypeInfo()

PS。对不起该网站的新用户,没有足够的点评论你的帖子:(

答案 3 :(得分:0)

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");

答案 4 :(得分:0)

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



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);}


答案 5 :(得分:0)

如果您希望查询检查列是否为identity,则可以使用系统表syscolumns。因此,根据sybase infocenter,syscolumns中列status的值128是identity。

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

答案 6 :(得分:0)

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: 
}
}