不写存储过程,插入数据并得到当前插入的主键

最近我公司的一个项目中,插入及更新数据都是调用存储过程实现的,也就是说如果有50个表,最表会有100个存储过程。100个存储过程维护起来是比较麻烦的,比如说你改了一个表,就要更改相应的两个存储过程,虽然我们的项目采用是程序根据表生成存储过程,但还是需要人去操作。
于是考虑对架构进行修改,初步的想法是不走存储过程,利用sp_executesql这个系统扩展存储过程来实现插入及修改数据的功能,这样就不用维护数量庞大的存储过程了。但在做的时候发现了一个问题,如何获取当插入记录的主键呢?用max之类的方法显然是不合适的,因为并发的时候可能会产生读错。
考虑能不能在执行sp_executesql的时候将@@Identity返回,于是在查询分析器中做一个测试,看在sql server中能不能支持,代码如下:
 DECLARE @sql NVARCHAR(4000)
 DECLARE @Result INT
 SET @sql = 'INSERT INTO Spec_Friends(f_Title, Spec_ID)
    VALUES (''abc'',0) SET @Return = @@Identity'
 exec sp_executesql @sql, N'@Return INT OUTPUT',@Result OUTPUT
 PRINT  @Result
执行后,print的结果是当然是对的,因为这是意料之中的事,关于sp_executesql可以见拙作: 动态组合sql语句详解 。但因为sp_executesql的特殊性,在程序中如何支持呢?C#中要执行一个存储过程,必需要得到存储过程的参数名,到网上查sp_executesql的参数名,居然一无所获,连MSDN也没有,看到只好自己想办法了。
系统存储过程没有找到sp_executesql!
sysobjects这个系统表也没有找到sp_executesql的影子!
终于在系统扩展存储过程中发现sp_executesql,但很遗憾的时找不到参数名称!!!
难道没有办法了么?忽然灵光一闪,用报错的方式让sql server自报家门,先直接执行sp_executesql,sql server报错,嘿,要的就是它报错,sql Server报的错误是:
消息 201,级别 16,状态 10,过程 sp_executesql,第 1 行
过程或函数 'sp_executesql' 需要参数 '@statement',但未提供该参数。
哈,原来第一个参数名是@statement,如法炮制,得到第二个参数是@parameters,返回C#,写出代码如下:
 public object ExecuteProc(string sql, SqlDbType returnType)
 {
 SqlParameter[] sqlParams = new SqlParameter[3];
 sqlParams[0] = new SqlParameter("@statement", SqlDbType.NVarChar, 500);
 sqlParams[0].Value = sql; //要执行的sql语句
 
 sqlParams[1] = new SqlParameter("@parameters", SqlDbType.NVarChar, 1000);
 sqlParams[1].Value = "@Return INT OUTPUT"; //传入返回信息
 
 sqlParams[2] = new SqlParameter("@Return", returnType);
 sqlParams[2].Direction = ParameterDirection.Output; //将结果返回
 
 new SQLOperator(this.    _SqlConn).ExecuteProcedure("sp_executesql", ref sqlParams);
 RETURN sqlParams[2].Value;
 }
试着执行一下,正确的结果被打印到浏览器中了!
说一个小插曲,在测试的时候因为需要把sql写成了INSERT INTO Spec_Friends(f_Title, Spec_ID) VALUES (''abc'',0),后来调试的时候没有改过来,死活得不到正确结果,上网拼命找原因,还以为自己哪儿写错了,结果折腾了半天才发现是自己先在调试的时候将SET @Return = @@Identity删除了,汗啊
  

注意:本文为我的独立博客镜像博客,自发表不再更新,原文可能随时被更新,敬请访问原文。同时,请大家不要在此评论,如果有什么看法,请点击这里:http://iove.net/1705/

本文来自http://iove.net,欢迎转载,转载敬请保留相关链接,否则视为侵权,原文链接:http://iove.net/1705/

转载于:https://www.cnblogs.com/conis/archive/2007/08/18/1720568.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值