c#连接sql数据库 存储过程用了@@identity就出错

来源:百度知道 编辑:UC知道 时间:2024/05/30 21:11:04
举个例子

alter proc asd
@name varchar(20) output
as
select @name=JManagerNane from jiaojie where JID=@@identity
我的C#代码调用过程中就不能返回输出参数


alter proc asd
@name varchar(20) output
as
select @name=JManagerNane from jiaojie where JID=1

就能返回

到底为什么啊!!!!!!!!!!在线等 大家救命啊
再SQL里面调用存储过程 都是正确的 都能返回正确的值
@@identity 是sql 数据库的全局变量 显示该表最后1个插入的自增列的值

我都说了 我的存储进程 是没问题的 可以运行的 都会返回我要的账户名 admin 但是用C#的代码 调用这个存储过程 就返回的是空值 而用数字代替@@identity 就能返回admin

cmd = new SqlCommand("asd",conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@name",SqlDbType.VarChar,20);
//输出参数
cmd.Parameters["@name"].Direction = ParameterDirection.Output;

conn.Open();
//注意一定要执行命令
cmd.ExecuteNonQuery();

没有给@@identity赋值啊

select @name=JManagerNane from jiaojie where JID=@@identity
//这时候@@identity 可能为空值 或,结果太多种了,

select @name=JManagerNane from jiaojie where JID=1
//这时候只有一种结果

我就觉得奇怪:你单独运行select @name=JManagerNane from jiaojie where JID=@@identity
有返回值吗?@name手动赋值.....

select @name=JManagerNane from jiaojie where JID=@@identity
我的C#代码调用过程中就不能返回输出参数
就是说你经过多次测试确定当前存储过程没问题,
如果确定不同情况下@@identity成功返回不同值了。
那就把你调用这条存储过程的代码发上来看看

嗯,同意mao0510 的。
不在一个是事务里面,是不能取到@@identity 的 。
所以通常是在执行INSERT后,才能取到identity。

否则不就乱了套了:假如多个连接同时执行Insert,那么,每个连接取回来的identity的值如何区分阿??

一种可能是你在SQL里调用的时候,都是用的同一个连接。但在C#里面可能有连接池或者其他的因素,不能用一个连接了,所以就出现问题。

准确的讲,你的思路是不正确的,identity必须和INSERT合用,不明白你这个存储过程干啥用的。。。是取最后一个注册的用户名么??

存储过程在数据库中是否可以运行?

是否有返回结果?

@@identity 是在一次会话中才能用的,所谓一次会话,而就是一次数据库打开-关闭的过程。如果你把连接关闭了,再打开再去查@@IDENTITY,就是null的。