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

简介:
+关注继续查看

背景:系统要支持多种数据库,统一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是支持的,所以下下来看看

使用小结:

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 classcom.microsoft.jdbc.sqlserver.SQLServerDriver
做好第二步,出现

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

否则会发生异常:Cannot load JDBC driver classcom.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);
}












本文转自lzf0530377451CTO博客,原文链接:http://blog.51cto.com/8757576/1565213 ,如需转载请自行联系原作者



相关实践学习
使用交互方式创建数据表
本次实验主要介绍如何在RDS-SQLServer数据库中使用交互方式创建数据表。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
SQL 机器学习/深度学习 Go
SQL Server如何用SQL实现一批字符串的全部组合
原文:SQL Server如何用SQL实现一批字符串的全部组合 在SQL Server中,如何用SQL去实现得到一批字符串的全部组合呢?这个是同事在实际需求当中遇到的一个问题,他的具体需求如下所示:   传入参数格式为'1,2,3,224,15,6'   'A,BC,GHT,TTY,B,E' ...
991 0
|
SQL 程序员 数据库
SQL Server 表的管理_关于事务的处理的详解(案例代码)
原文:SQL Server 表的管理_关于事务的处理的详解(案例代码) SQL Server 表的管理_关于事务的处理的详解(案例代码) 一、SQL 事务 1.1SQL 事务   ●事务是在数据库上按照一定的逻辑顺序执行的任务序列,既可以由用户手动执行,也可以由某种数据库程序自动执行。
1256 0
|
SQL 存储 数据库
SQL Server 百万级数据提高查询速度的方法
原文:SQL Server 百万级数据提高查询速度的方法 1.应尽量避免在 where 子句中使用!=或操作符,否则将引擎放弃使用索引而进行全表扫描。 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2511 0
|
SQL 数据库 Go
使用sql语句创建修改SQL Server标识列(即自动增长列)
原文:使用sql语句创建修改SQL Server标识列(即自动增长列) 一、标识列的定义以及特点SQL Server中的标识列又称标识符列,习惯上又叫自增列。该种列具有以下三种特点:1、列的数据类型为不带小数的数值类型2、在进行插入(Insert)操作时,该列的值是由系统按一定规律生成,不允许空值3、列值不重复,具有标识表中每一行的作用,每个表只能有一个标识列。
1825 0
|
SQL 数据库 Go
SQL Server 数据库所有表增加同一列
SET @COLUMN_NAME = 'ColumnNameYouWantToAdd'; SET @COLUMN_DATATYPE = 'DataTypeOfColumn'; ------------------------------------------------Code----...
1047 0
推荐文章
更多