首页 > 数据库 > SQL Server > 正文

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

2024-08-31 00:49:48
字体:
来源:转载
供稿:网友

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表