我抓住了最后一个rowid,我正在做这个select @@IDENTITY
pk = (long)cmd.ExecuteScalar();
我得到一个无效的类型转换bc这是int而不是long。为什么这不会很久?我可以让它回来很久吗?
现在的解决方案是使用
pk = Convert.ToInt64(cmd.ExecuteScalar());
答案 0 :(得分:8)
使用SCOPE_IDENTITY ... 正确和decimal(38,0)无论如何......
SELECT CAST(SCOPE_IDENTITY() AS bigint)
但是,您应该注意@@ IDENTITY decimal(38,0)
这是因为它必须包含任何可以自动编号的数据类型,例如decimal和bigint
编辑:
显然它是由unboxing引起的。 YMMV。
答案 1 :(得分:3)
在您的SQL查询中,将@@IDENTITY
转换为bigint
:
select CONVERT(bigint, @@IDENTITY) ...
答案 2 :(得分:3)
SELECT CAST(@@ IDENTITY AS BIGINT)可能吗?
答案 3 :(得分:2)
@@ IDENTITY是一个int,因为它的范围被认为是足够的。
数据类型
范围 - (存储)
<强> BIGINT 强>
-2 ^ 63(-9,223,372,036,854,775,808)至2 ^ 63-1(9,223,372,036,854,775,807) - ( 8字节)
<强> INT 强>
-2 ^ 31(-2,147,483,648)至2 ^ 31-1(2,147,483,647) ( 4字节)
<强> SMALLINT 强>
-2 ^ 15(-32,768)到2 ^ 15-1(32,767) ( 2个字节)
<强> TINYINT 强>
0到255 ( 1 Byte )
答案 4 :(得分:2)
这不起作用,因为ExecuteScalar返回一个对象。这将是一个盒装整数。它只能被取消装箱到一个整数,其他任何东西都会产生一个类型转换异常。 C#语言规范在第4.3.2节中没有浪费很多单词:
对非可空值类型的取消装箱操作包括首先检查对象实例是否为给定的非可空值类型的盒装值,然后将值复制出实例的
将它转换为长按不是明智之举。没有什么可以做的,最终不会产生某种SQL错误。就像自己递增一样。
答案 5 :(得分:0)
ADO.NET
将@@IDENTITY
的类型转换为decimal
,而开销最小的最有效方法如下:
long id = Decimal.ToInt64( (decimal)cmd.ExecuteScalar() );
但是请注意,long
不能代表 MSSQL 的NUMERIC(38,0)
的整个范围。