[英]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。
如果您認為您的計數將溢出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.