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

王朝学院·作者佚名  2009-11-17  
宽屏版  字体: |||超大  

背景:系统要支持多种数据库,统一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);

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有