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

假如wo捕获了ni

假如wo捕获了ni

2016-02-19 19:17

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

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

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  测试示例方法:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  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);
    }
  } 

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
sql server2005 jdbc解决自动增长列统一处理问题纪实

MS SQL SERVER2005 XML 最佳实践

SQLServer
MS SQL SERVER2005 XML 最佳实践

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

SQL Server 2005中处理表分区问题

编程语言 网络编程
SQL Server 2005中处理表分区问题

SQL Server2005 SQLCLR代码之CLR安全

SQLServer
SQL Server2005 SQLCLR代码之CLR安全

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

SQL Server2000+JDBC常见问题及解决

SQLServer
SQL Server2000+JDBC常见问题及解决

oracle中实现自动增长列

电脑网络
oracle中实现自动增长列

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

怎么设置加密文件夹

怎么设置加密文件夹

Dreamweaver MX 初探 - 第六天(1)

Dreamweaver MX 初探 - 第六天(1)
下拉加载更多内容 ↓