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

2016-02-19 19:17 7 1 收藏

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

【 tulaoshi.com - 编程语言 】

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

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

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

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

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

来源:http://www.tulaoshi.com/n/20160219/1620626.html

延伸阅读
标签: SQLServer
  一、在Analysis Services项目中定义数据源视图 1、根据模板创建Analysis Services项目 BIDS(Business Intelligence Development Studio)利用模板创建不同类型的项目,Analysis Services项目即为其中的一个模板,而且这些模板是可自定义的。 2、定义数据源 使用Native OLE DB\Microsoft OLE DB Provider for SQL Server...
错误案例:在Microsoft Virtual PC 2007和一台笔记本电脑上安装MSDN订阅下载的SQL Server 2005企业版时出现问题。安装环境为windows Server 2003 企业版 + sp1,另外一个系统是带sp2的,安装用户使用超级管理员(Administrator)。在安装“Integration Services”步骤时出现安装错误,提示“错误: -2146233087”。 错误记录如下: ...
I/O吞吐量小,形成了瓶颈效应。 没有创建计算列导致查询不优化。 内存不足。 网络速度慢。 查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)。 锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)。 sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。 返回了不必要的行和列。 查...
标签: SQLServer
通用表表达式(CTEs)是SQL Server 2005的一项新功能。它们类似于alias(如在SELECT T1.* FROM MyTable T1中),不过功能更为强大。本质上,CTE是一个临时结果集,它仅仅存在于它发生的语句中。您可以在SELECT、INSERT、DELETE、UPDATE或CTEATE VIEW语句中建立一个CTE。CTE类似于派生表,但拥有几项优点。 CTE的优点 与派生表不同,CTE能...
先看下面一个嵌套的查询语句: select*fromperson.StateProvincewhereCountryRegionCodein (selectCountryRegionCodefromperson.CountryRegionwhereNamelike'C%') 上面的查询语句使用了一个子查询。虽然这条SQL语句并不复杂,但如果嵌套的层次过多,会使SQL语句非常难以阅读和维护。因此,也可以使用表变量的方式来...

经验教程

814

收藏

92
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部