注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

【原】MSSQL数据库 :利用存储过程获取数据库最近插入的记录的自增ID数值  

2010-12-29 13:03:24|  分类: 数据库 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
之前遇到过几次,对于MySQL,参考:http://zhanyonhu.blog.163.com/blog/static/16186044201092265747731/
对于MySQL,据说存储过程效率很低,故不采用。

对于MSSQL,参考:MSSQL如何获得新插入记录的ID值?
http://blog.csdn.net/liujien/archive/2007/01/18/1486366.aspx

一、
存储过程,可以认为是数据库操作中的一个原子操作,可以保证操作的原子性(不可分割性),也就是说,可以保证大量数据并发插入时,获取到正确的自增ID,防止获取到”脏数据“。
(1)创建存储过程:
CREATE PROCEDURE insert_and_get_id
AS
INSERT INTO [ProDB].[dbo].[Cls]
           ([AsID])
     VALUES
           ('a');
SELECT @@IDENTITY as 'ID';
GO
(2)执行存储过程
exec insert_and_get_id
(3)销毁存储过程
drop PROCEDURE insert_and_get_id;

二、
以上,基本上实现需求,但是,存在缺陷:不通用。我不能对每个数据表都创建一个存储过程吧,也不应该对每个数据插入语句都写一个存储过程,所以,应该修改一下。

(1)创建通用的、获取最后插入的自增ID的存储过程
CREATE PROCEDURE insert_and_get_id
@SqlString nvarchar(4000)
AS
BEGIN
    execute(@SqlString);
    SELECT @@IDENTITY as 'ID';
END
(2)调用存储过程
exec insert_and_get_id "INSERT INTO [PsDB].[dbo].[cls] ([AsID]) VALUES('a')"

(3)不需要继续使用时,使用下面的方法销毁:
drop PROCEDURE insert_and_get_id;

三、
以上虽然可以,但是VC中无法取得结果(自增ID),于是:
参考:MSSQL+ODBC:如何获取存储过程的查询数据集?
http://zhanyonhu.blog.163.com/blog/static/161860442010112944644974/

(1)创建通用的、获取最后插入的自增ID的存储过程
CREATE PROCEDURE insert_and_get_id
    @SqlString nvarchar(4000),
    @id bigint Output
AS
BEGIN
    execute(@SqlString);
    set @id = @@IDENTITY;
END
(2)调用
DECLARE @ID bigint;
exec insert_and_get_id ’INSERT INTO [PsDB].[dbo].[cls] ([AsID]) VALUES(‘'a’')‘, @ID out;
select ID=@ID;

(3)不需要继续使用时,使用下面的方法销毁:
drop PROCEDURE insert_and_get_id;

但是,结果是,还是失败!看来是我的程序的问题。

四、事务锁
基本上可以肯定,事务锁肯定能解决我的问题。可能是我的程序只支持一次一个查询?但如果使用事务锁,我就可以每次查询一个语句,因为数据库已经加锁,所以,可以保证不会出现脏数据。

五、ADO
http://msdn.microsoft.com/zh-cn/library/ms808559.aspx
ADO方式确实可以实现,上面的链接中就是针对多数据集操作的例子!

最终解决方法:放弃ODBC API,改用ADO实现。


至此,完全解决。
MySQL的,效率虽低,如果插入操作不是很频繁,也可以使用。

附:
开头的标识符太长,最大长度为128
http://hi.baidu.com/maomaoyusp/blog/item/ec06a6342a051fb2d0a2d3ab.html/cmtid/a89fec1140281ac8a6ef3f7c

By:章永辉
  评论这张
 
阅读(2346)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016