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

sql|解决|问题

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

作者fbysss
msn:jameslastchina@hotmail.com 
blog:blog.csdn.net/fbysss
声明:本文由fbysss原创,转载请注明出处
关键字:自动增长列,jdbc,sqlserver2005

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

时间: 2024-11-01 01:01:06

SQL jdbc解决自动自动增长列统一处理问题纪实的相关文章

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 is

asp.net中sql server插入数据时获取自增长列数据

最近的数据库编程中需要在执行sql insert后检索自增长列的值.数据库中获取这个值很简单:返回最后插入记录的 自动编号直接使用SELECT IDENT_CURRENT('TableName') 即可. 还可以用如下代码  代码如下 复制代码 select @@identity 在insert后执行这一句就行了.在网上看有人在insert之前加了一句:  代码如下 复制代码 set nocount on; 这一句 表示不要返回查询的行计数. 于是:    代码如下 复制代码 set nocou

SQL Server 2012 自动增长列,值跳跃问题

原文:SQL Server 2012 自动增长列,值跳跃问题   介绍 从 SQL Server 2012 版本开始, 当SQL Server 实例重启之后,表格的自动增长列的值会发生跳跃,而具体的跳跃值的大小是根据增长列的数据类型而定的.如果数据类型是 整型(int),那么跳跃值为 1000:如果数据类型为 长整型(bigint),那么跳跃值为 10000.从我们的项目来看,这种跳跃问题是不能被接受的,尤其是展示在客户端的时候.这个奇怪的问题只在 SQL Server 2012 及更高的版本中

如何让PowerDesigner支持自动生成含SQL Server 2000的表和列注释的角本

server 翁 彦 PowerDesigner是Sybase公司著名的产品,我从16-bit的windows开始,就接触并使用这个工具,应该说是有很深的感情.PowerDesigner是DBA和软件架构师设计的利器,随着版本的不断升级,PowerDesigner提供了更多更强大的功能.仅以本篇为开始,向大家介绍一些PowerDesinger中的使用技巧,帮助大家更好地更有效率地使用这个CASE工具. 问题的提出 我曾经在很多网上看到有朋友问起,在PowerDesigner的Physical M

推荐SQL Server 重新恢复自动编号列的序号的sql代码

在sql server中经常有这样的问题:         一个表采用了自动编号的列之后,由于测试了好多数据,自动编号已累计了上万个.现在正是要用这个表了,测试数据已经删了,遗留下来的问题 就是 在录入新的数据,编号只会继续增加,已使用过的但已删除的编号就不能用了, 谁知道如何解决此问题? truncate命令不但会清除所有的数据,还会将IDENTITY的SEED的值恢复到原是值. 而DBCC CHECKIDENT则更加方便一些,可以在不删除数据的情况下指定SEED的值.  1. truncat

Oracle中实现自动增长列

oracle --在users表的userid列上实现自动增长列--需要同时使用序列和行级触发器 create sequence seq_userid;   --创建序列 create or replace trigger users_bir  --创建行级触发器before insert on usersfor each rowdeclare  tempnum number;begin  select seq_userid.nextval into tempnum from dual;  :n

java web-求解:为什么不能读取自动增长列的值,在修改过程中传值?

问题描述 求解:为什么不能读取自动增长列的值,在修改过程中传值? 解决方案 你的4后面有个空格,所以没法转换成数字 解决方案二: 异常显示是空格的问题.你可以检查下数据库中存的值是不是有空格,然后再检查下数据展示的代码是不是有空格. 如果数据库没有问题,就可能是这个值在页面是可编辑的,所以会接收到了误操作的空格.

《SQL Server企业级平台管理实践》读书笔记——SQL Server如何设置自动增长和自动收缩项

原文:<SQL Server企业级平台管理实践>读书笔记--SQL Server如何设置自动增长和自动收缩项 SQL Server允许用户设置数据库初始值和最大值,可以通过自动增长或者自动收缩进行配置.通过这些配置,我们可以防止数据库空间问题而导致的应用程序修改失败或者SQL Server磁盘空间耗尽的事情发生.一般来讲,如果数据库不是很忙,默认的设置为自动增长,这种方式能够满足大部分的需求.但是在大量并发的情况下,申请数据文件和日志文件增长本身是一件非常消耗系统资源和影响性能的工作.所以如果

【Mysql 学习】自动增长列

--对于innodb表,自动增长列必须是索引.如果是组合索引,也必须是前导列. mysql> create table innodb_auto     -> ( id1 int not null auto_increment,     -> id2 int not null,     -> val varchar(10),     -> index(id2,id1)     -> ) engine=innodb; ERROR 1075 (42000): Incorrec