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

发布于 2024-07-13 16:02:10 字数 546 浏览 6 评论 0原文

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

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_AUTOINCRMENT”是 JDBC4 的一项功能,而 jTDS 是 JDBC4 兼容的驱动程序。

To check if a column is auto incremented i can do the following

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

works fine except with Sybase databases. I've tried it with the jTDS and JConnect drivers, but with both drivers I get the this exception:

java.sql.SQLException: Invalid column name IS_AUTOINCREMENT.

Is there another the get find out, whether a column in Sybase is auto incremented or not?
I thought "IS_AUTOINCREMENT" is a feature with JDBC4 and jTDS is a JDBC4 compatible driver.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

春庭雪 2024-07-20 16:02:10

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

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

身份列的行为也有点不同,但这是一个题外话。

Sybase uses 'identity' columns rather than 'default autoincrement' which is why I believe you are getting this message.

Try checking if TYPE_NAME column contains keyword "identity".

The behaviour of identity columns is a little different also, but that is an aside.

等往事风中吹 2024-07-20 16:02:10

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

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

祝你好运。

Sorry, I misunderstood as you have found below using sp_help if the identity column contains a 1 then the column is an identity.

There are also other methods available. I was concentrating on Java methods when I could have given you the answer in seconds had I known you would be happy with SQL commands such as sp_help, sp_columns and selecting from systemtables.

Best of luck.

小帐篷 2024-07-20 16:02:10

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

DatabaseMetaData.getTypeInfo()

PS。 抱歉,刚来这个网站,没有足够的积分来评论您的帖子:(

What version of JConnect are you using? Try using 6. It should work using:

DatabaseMetaData.getTypeInfo()

PS. Sorry new to the site, not enough points to comment on your post :(

南风起 2024-07-20 16:02:10

sp_help 提供了我需要的所有信息。
该 SP 返回多个结果集。
第三个 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");

sp_help delivers all the information I need.
This SP returns several ResultSets.
The third ResultSet contains the information I need.

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");
眼眸里的快感 2024-07-20 16:02:10

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



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


This is the easiest way to get the identity information



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


栩栩如生 2024-07-20 16:02:10

如果您希望查询检查列是否相同,可以使用系统表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

If you want a query to check the column is identity, you can use system table syscolumns. So as per sybase infocenter the value 128 of column status in syscolumns is 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
梦晓ヶ微光ヅ倾城 2024-07-20 16:02:10
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: 
}
}
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: 
}
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文