您的位置:首页技术文章
文章详情页

sql server2005 jdbc解决自动自动增长列统一处理问题纪实

【字号: 日期:2024-07-05 18:47:45浏览:3作者:猪猪

作者fbysssmsn:jameslastchina@hotmail.com; blog:blog.csdn.net/fbysss声明:本文由fbysss原创,转载请注明出处 关键字:自动增长列,jdbc,sqlserver2005

背景:系统要支持多种数据库,统一insert的时候获取自动增长列的处理方式问题1:insert+select方案sqlserver2000可以使用insertSql; + SELECT @@IDENTITY AS 'Identity'的方式来获得,但是mysql则只能使用executeUpdate(insertSql); executeQuery('SELECT last_insert_id() ')这样的方式,否则会抛出异常:java.sql.SQLException: Can not issue data manipulation statements with executeQuery()而两句话分开处理,总让人感觉不放心,如果并发操作比较多,存在潜在的危险问题2:getGeneratedKeys方案mysql的驱动支持jdbc3.0,实现了getGeneratedKeys()但sqlserver2000 jdbc驱动不支持getGeneratedKeys()解决思路:google了一下,据说2005是支持的,所以下下来看看下载地址:url:http://download.microsoft.com/download/2/8/9/289dd6a3-eeeb-46dc-9045-d0c6b59bfbc1/sqljdbc_1.1.1501.101_chs.exe使用小结:1.2005jdbc驱动是支持jdbc 3.0 的。也就是说,的确支持getGeneratedKeys()方法。2.2005jdbc驱动url和包组织变动较大。举例对比:(请仔细看好了,一不小心看不出差别!)================2000================url='jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb;SelectMethod=cursor'driverClassName='com.microsoft.sqlserver.jdbc.SQLServerDriver'================2005================url='jdbc:sqlserver://localhost:1433;DatabaseName=mydb;SelectMethod=cursor'driverClassName='com.microsoft.jdbc.sqlserver.SQLServerDriver'如果没注意这点,必将出现异常:Cannot load JDBC driver class'com.microsoft.jdbc.sqlserver.SQLServerDriver'做好第二步,出现3.包的位置:环境变量CLASSPATH不是必须的。但sqljdbc.jar必须放置在tomcat/common/lib中(如果是租用空间,可能得跟对方商量了,看是否支持2005的驱动)。否则会发生异常:Cannot load JDBC driver class'com.microsoft.sqlserver.jdbc.SQLServerDriver'

测试示例方法:

public; String executeUpdate(String sql) throws;SQLException ...{ Connection conn = getConnection(); PreparedStatement pstmt = null; try ...{ /**//*注意:jdbc3.0提供了Statement.RETURN_GENERATED_KEYS'用来指明需要从Statement中获得自动增长列值, 如果不设置该参数,在执行getGeneratedKeys()时会抛出异常:'只有运行该语句,生成的键才会可用。'*/ pstmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); pstmt.executeUpdate(); ResultSet rs =; pstmt.getGeneratedKeys();//为了insert准备 if (rs.next())...{ return rs.getString(1); } return '-1'; } catch (SQLException ex) ...{ throw new SQLException( '执行SQL语句失败。' + ex.toString() + '; sql:'+sql);

} finally ...{ freeConnection(conn,pstmt); } }

标签: JDBC