我用insert后跟select @@Identity的方法,执行ExecuteScalar后返回一个objcet,事实证明这个object的确是自动生成的值,但是它的类型居然是System.Decimal!我数据库里显然是int啊,为什么会返回这么奇怪的数据类型呢?
在SQL SERVER中可以使用三种方法来获取系统生成的标识值:
@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 这三个函数都返回最后生成的标识值。但是,它们在定义"最后"的作用域和会话上不同。
@@IDENTITY
返回最后插入的标识值。
语法
@@IDENTITY
返回类型
numeric
注释
在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY
中包含此语句产生的最后的标识值。若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回
NULL。若插入了多个行,则会产生多个标识值,@@IDENTITY
返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器,则语句执行后立即调用 @@IDENTITY
将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失败或大容量复制失败,或事务被回滚,则
@@IDENTITY 值不会还原为以前的设置。
如果在你进行insert操作的时间和检查@@IDENTITY的时间之间有另一个insert操作被执行,@@IDENTITY返回的不是系统为你的insert所生成的标识值,而是它为最近的一个insert操作所生成的标识值。
SCOPE_IDENTITY
返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。
……
更多 http://blog.csdn.net/vince6799/archive/2006/05/14/727925.aspx
根据引用的解释看,似乎 @@Identity 的返回类型是固定的,而对于 c# 大概就是 Decimal 了。你换用 SCOPE_IDENTITY 之类的试试呢,看解释它似乎是忠于原类型的。
SCOPE_IDENTITY !! 楼上解释的非常清楚了
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。
@@IDENTITY 返回的是numeric 类型。numeric(38,0)
在C#里自然对应decimal了。