sqlserver2005jdbc解决自动增长列统一处理问题纪实

来源:互联网 发布:ubuntu12.04 软件源 编辑:程序博客网 时间:2024/05/18 01:16
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
.Tje738{display:none;}

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

问题1:insert+select方案

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

executeQuery('SELECTlast_insert_id()')这样的方式,否则会抛出异常:java.sql.SQLException:CannotissuedatamanipulationstatementswithexecuteQuery()

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

问题2:getGeneratedKeys方案

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

解决思路:

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

下载地址:url:http://download.microsoft/download/2/8/9/289dd6a3-eeeb-46dc-9045-d0c6b59bfbc1/sqljdbc_1.1.1501.101_chs.exe

使用小结:

1.2005jdbc驱动是支持jdbc3.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"
如果没注意这点,必将出现异常:Cannotloadjdbcdriverclass'com.microsoft.jdbc.sqlserver.sqlserverDriver'
做好第二步,出现

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

否则会发生异常:Cannotloadjdbcdriverclass'com.microsoft.sqlserver.jdbc.sqlserverDriver'

测试示例方法:

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


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

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击