RSS订阅
用户名: 密码:

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

2007-07-07 07:43:13 作者:探索者 来源: 浏览次数:0 网友评论 0

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

问题1:i ert+select方案

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

executeQuery('SELECT last_i ert_id() ')这样的方式,否则会抛出异常:java.sql.SQLException: Can not i ue 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=myd electMethod=cursor"
driverCla ame="com.microsoft.sqlserver.jdbc.SQLServerDriver"
================
2005
================
url="jdbc:sqlserver://localhost:1433;DatabaseName=myd electMethod=cursor"
driverCla ame="com.microsoft.jdbc.sqlserver.SQLServerDriver"
如果没注意这点,必将出现异常:Ca ot load JDBC driver cla 'com.microsoft.jdbc.sqlserver.SQLServerDriver'
做好第二步,出现

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

否则会发生异常:Ca ot load JDBC driver cla 'com.microsoft.sqlserver.jdbc.SQLServerDriver'

测试示例方法:

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


  } finally ...{
  freeCo ection(co , tmt);
  }
  } 

相关文章

[错误报告] [推荐] [收藏] [打印] [关闭] [返回顶部]

最新图片文章

最新文章


关于本站帮助(?)┊广告服务版权声明业务合作加盟我们网站地图联系我们
Copyright © 2005-2008 www.phpip.com online services. All rights reserved. 陕ICP备05002402号
在线管理员 QQ:271162318 17864997