发新话题

JDBC 3.0 获得数据库的自动生成的数值

一般是数据库中 Id 列是自动增长,比如MySQL 和 SQLServer 的主键,以及使用默认值的字段
先看代码
 
      pstat = con.prepareStatement(insertSQ, Statement.RETURN_GENERATED_KEYS); // 这句的参数是关键
      // 这里是其他的一些SQL参数
      if (pstat.executeUpdate() == 1) {
        rs = pstat.getGeneratedKeys();  // 用来获得生成的数值
        if (rs.next()) {
          long newId = Long.parseLong(rs.getString(1)); // 拿到数值
        }
    }
提示
JDBC3.0是1个jar,2.0是3个jar
在3.0里面的URL和Driver是这样写的
jdbc:sqlserver://localhost
com.microsoft.sqlserver.jdbc.SQLServerDriver
请注意看,和2.0的区别
jdbc:microsoft:sqlserver://localhost
com.microsoft.jdbc.sqlserver.SQLServerDriver


RETURN_GENERATED_KEYS
static final int RETURN_GENERATED_KEYS
该常量指示生成的键应该可用于获取。

getGeneratedKeys
ResultSet getGeneratedKeys() throws SQLException
获取由于执行此 Statement 对象而创建的所有自动生成的键。如果此 Statement 对象没有生成任何键,则返回空的 ResultSet 对象。
注:如果未指定表示自动生成键的列,则 JDBC 驱动程序实现将确定最能表示自动生成键的列。


返回:
包含通过执行此 Statement 对象自动生成的键的 ResultSet 对象
抛出:
SQLException - 如果发生数据库访问错误,或者在已关闭的 Statement 上调用此方法
SQLFeatureNotSupportedException - 如果 JDBC 驱动程序不支持此方法
从以下版本开始:
1.4
快乐渡过每一天,减肥坚持每一天



编辑 回复 快速回复 TOP
这句代码 pstat = con.prepareStatement(insertSQ, Statement.RETURN_GENERATED_KEYS);
这句总是报以下这个异常啊!搞了半天弄不出来,只能在请教了!
Exception in thread "main" java.lang.AbstractMethodError: com.microsoft.jdbc.sqlserver.SQLServerConnection.prepareStatement(Ljava/lang/String;I)Ljava/sql/PreparedStatement;

还有 setPreparedStatementValue(pstat, base); 这又是什么意思,我没有在 JDK 中找到这个方法啊
问题可能有点傻啊!哈,先谢了

编辑 回复 快速回复 TOP
因为你的驱动不是JDBC3.0 的
到我网站的 下载资源 里面下载最新的JDBC驱动吧!就在菜单里面

那个 set是我自己的一个方法,我一会修改一下,哈哈哈!
快乐渡过每一天,减肥坚持每一天
编辑 回复 快速回复 TOP
我现在用的 JDBC 驱动共有3个jar 包。
JDBC3.0 只有一个 jar 包吗?
编辑 回复 快速回复 TOP
3个jar的是老板本的,到本站的[下载资源] 获取最新的驱动吧!
快乐渡过每一天,减肥坚持每一天
编辑 回复 快速回复 TOP
朋友,这个 jar 包是不是不支持 SQLServer 2000 啊,我在只倒入这个包的情况下,程序并不能访问数据库啊!
编辑 回复 快速回复 TOP
3.0的URL和Driver已经变了,和老版本的不同,我更新一下我的帖子吧!
快乐渡过每一天,减肥坚持每一天
编辑 回复 快速回复 TOP
这下可以了!非常感谢~~以后补分给你,呵呵~
编辑 回复 快速回复 TOP
天在使用 JDBC 3.0 时,发现这样的现象:
PreparedStatement ps = con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
这段代码中由于设置了 "ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE" ,给我抛了个异常:

com.microsoft.sqlserver.jdbc.SQLServerException: 不支持此游标类型/并发组合。
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.<init>(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.<init>(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.makeStatement(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.prepareStatement(Unknown Source)
at test.Test.main(Test.java:21)

我用的是 SQLServer 2000 这个是兼容性的问题吗?
编辑 回复 快速回复 TOP
快乐渡过每一天,减肥坚持每一天
编辑 回复 快速回复 TOP
恩谢了!
知道 [url=mk:@MSITStore:G:\TOOLS\JAVA\JDK1.5API_CN.CHM::/java/sql/Connection.html#prepareStatement(java.lang.String, int, int, int)]prepareStatement[/url]([url=mk:@MSITStore:G:\TOOLS\JAVA\JDK1.5API_CN.CHM::/java/lang/String.html]String[/url] sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) 这个方法。
以前用的 JDBC 也有这个方法,但也有 [url=mk:@MSITStore:G:\TOOLS\JAVA\JDK1.5API_CN.CHM::/java/sql/Connection.html#prepareStatement(java.lang.String, int, int)]prepareStatement[/url]([url=mk:@MSITStore:G:\TOOLS\JAVA\JDK1.5API_CN.CHM::/java/lang/String.html]String[/url] sql, int resultSetType, int resultSetConcurrency) 这个方法。
我在使用 JDBC3.0 的时候就是使用这个方法生成 [url=mk:@MSITStore:G:\TOOLS\JAVA\JDK1.5API_CN.CHM::/java/sql/PreparedStatement.html]PreparedStatement[/url] 对象的。结果出了异常。是 JDBC3.0 不支持这个方法了吗?
编辑 回复 快速回复 TOP
恩谢了!知道 prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) 这个方法。
以前用的 JDBC 也有这个方法,但也有 prepareStatement(String sql, int resultSetType, int resultSetConcurrency) 这个方法。
我在使用 JDBC3.0 的时候就是使用这个方法生成 prepareStatement 对象的。结果出了异常。是 JDBC3.0 不支持这个方法了吗?
编辑 回复 快速回复 TOP
学习了,不错!!!!!!!!
编辑 回复 快速回复 TOP
菜鸟提问:
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery("select * from UserTable");
String username = scan.next();
String pwd = scan.next();
rs.beforeFirst();
这段代码怎么改就不会再抛出:不支持不支持此游标类型/并发组合的Exception 了
编辑 回复 快速回复 TOP
好东西,遇到了问题,在Google上搜索到的,谢谢竹子提供。。
Everyone is No 1~``
编辑 回复 快速回复 TOP
编辑 回复 快速回复 TOP
发新话题