关于SQL Server CE:Int64是否等于C#中的long?

Isn't an Int64 equal to a long in C#?

我一直在通过sqlceConnection在C中使用SQL和数据库。我一直在使用ExecuteReader来读取结果和记录ID的bigint值,这些记录ID被读取到long中。

今天,我一直在使用基于计数的语句("select count(*)from x")的SQL语句,并一直在使用executescalar读取这些单值结果。

然而,我遇到了一个问题。我似乎无法将这些值存储到一个长数据类型中,我到目前为止一直在使用这种数据类型。我可以把它们存进Int64。

我一直在使用bigint作为记录ID来获取最大的潜在记录数。

因此,bigint 8字节是int64。long不等于int64吗,因为两者都是64位有符号整数?

所以,为什么我不能把一个int64转换成一个long?

1
2
3
long recordCount =0;

recordCount = (long)selectCommand.ExecuteScalar();

错误是:

Specified cast is not valid.

我能把一个大字读成一个长字。这不是问题。我无法将SQL计数读取为长。

count返回一个int(int32),因此问题实际上是将int32强制转换为long。


long是.NET中的Int64;它只是C中的别名。您的问题是将返回值强制转换为long,除非我们确定知道从您的查询返回的类型,否则我们不知道您为什么会收到错误。SQL bigint必须可转换为long

如果是计数(*)返回,则为Int32。您需要使用Convert类:

1
long l = Convert.ToInt64(selectCommand.ExecuteScalar());


如果您认为计数将溢出int/int32,那么应该在SQL中使用count_big(),它具有正确的返回类型。

至于为什么演员不工作,我不确定。以下C:

1
2
3
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
long lCount = (long)cmd.ExecuteScalar();
Int64 iCount = (Int64)cmd.ExecuteScalar();

编译到此IL:

1
2
3
4
5
6
7
8
9
10
11
12
L_0000: nop
L_0001: newobj instance void [System.Data]System.Data.SqlClient.SqlCommand::.ctor()
L_0006: stloc.0
L_0007: ldloc.0
L_0008: callvirt instance object [System.Data]System.Data.Common.DbCommand::ExecuteScalar()
L_000d: unbox.any int64
L_0012: stloc.1
L_0013: ldloc.0
L_0014: callvirt instance object [System.Data]System.Data.Common.DbCommand::ExecuteScalar()
L_0019: unbox.any int64
L_001e: stloc.2
L_001f: ret

也就是说,它们似乎编译成相同的代码。