900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > sql server jdbc解决自动增长列统一处理问题纪实

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

时间:2022-09-10 00:47:36

相关推荐

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

今天小编给大家展示的是sql server jdbc解决自动增长列统一处理问题纪实,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!

背景:系统要支持多种数据库,统一insert的时候获取自动增长列的处理方式

问题1:insert+select方案

sqlserver2000可以使用insertSql+ SELECT @@IDENTITY AS 'Identity'的方式来获得,但是mysql则只能使用executeUpdate(insertSql);

executeQuery('SELECTlast_insert_id() ')这样的方式,否则会抛出异常:: Can not issue data manipulation statements with executeQuery()

而两句话分开处理,总让人感觉不放心,如果并发操作比较多,存在潜在的危险。

问题2:getGeneratedKeys方案

mysql的驱动支持jdbc3.0,实现了getGeneratedKeys(),但sqlserver2000 jdbc驱动不支持getGeneratedKeys()

解决思路:

google了一下,据说是支持的,所以下下来看看

下载地址:url:

使用小结:

1.jdbc驱动是支持jdbc 3.0 的。也就是说,的确支持getGeneratedKeys()方法。

2.jdbc驱动url和包组织变动较大。

举例对比:

================

2000

================

url=""

driverClassName=""

================

================

url=""

driverClassName=""

如果没注意这点,必将出现异常:Cannot load JDBC driver class''

做好第二步,出现

3.包的位置:环境变量CLASSPATH不是必须的。但必须放置在中(如果是租用空间,可能得跟对方商量了,看是否支持的驱动)。

否则会发生异常:Cannot load JDBC driver class''

测试示例方法:

publicString executeUpdate(String sql) throwsSQLException ...{

Connection conn = getConnection();

PreparedStatement pstmt = null;

try ...{

/**//*注意:jdbc3.0提供了"用来指明需要从中获得自动增长列值,

如果不设置该参数,在执行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);

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。