簡體   English   中英

在C#中,Int64不等於long嗎?

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

我一直在使用SqlCeConnection在C#中使用SQL和數據庫。 我一直在使用ExecuteReader來讀取讀入Longs的記錄ID的結果和BigInt值。

今天我一直在玩SQL語句,這些語句使用基於COUNT的語句('SELECT COUNT(*)FROM X')並且一直在使用ExecuteScalar來讀取這些單值結果。

但是,我遇到了一個問題。 我似乎無法將值存儲到Long數據類型中,我一直在使用它。 我可以將它們存儲到Int64中。

我一直在使用BigInt作為記錄ID來獲取最大可能的記錄數。

因此,BigInt 8字節是Int64。 不是Long等於Int64,因為它們都是64位有符號整數?

因此,為什么我不能將Int64轉換為Long?

long recordCount =0;

recordCount = (long)selectCommand.ExecuteScalar();

錯誤是:

指定演員表無效。

我可以將BigInt讀成Long。 這不成問題。 我無法讀取SQL COUNT到long。

COUNT返回一個Int(Int32),所以問題實際上是將Int32轉換為long。

long.NET中的 Int64 ; 它只是C#中的別名。 您的問題是將返回值強制轉換為long ,除非我們知道您的查詢返回的類型,否則我們不知道您為什么會收到錯誤。 SQL BigInt必須可以轉換為long

如果是返回的COUNT(*),那么它是Int32。 您需要使用Convert類:

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

如果您認為您的計數將溢出int / Int32,則應該在SQL中使用COUNT_BIG() - 它具有正確的返回類型。


至於為什么演員不工作,我不確定。 以下C#:

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

編譯到這個IL:

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 

也就是說,它們似乎編譯成相同的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM