32

私はSqlCeConnectionを介して C# で SQL とデータベースをいじっています。ExecuteReaderを使用して、Longs に読み取られるレコード ID の結果とBigInt値を読み取っています。

今日、私は COUNT ベースのステートメント ('SELECT COUNT(*) FROM X') を使用する SQL ステートメントで遊んでおり、これらの単一値の結果を読み取るためにExecuteScalarを使用しています。

しかし、私は問題に遭遇しました。今まで使用していたLongデータ型に値を格納できないようです。それらを Int64 に格納できます。

レコード ID に BigInt を使用して、潜在的な最大レコード数を取得しています。

したがって、BigInt 8 バイトは Int64 です。どちらも 64 ビットの符号付き整数であるため、Long は Int64 と等しくありませんか?

したがって、Int64 を Long にキャストできないのはなぜですか?

long recordCount =0;

recordCount = (long)selectCommand.ExecuteScalar();

エラーは次のとおりです。

指定されたキャストは無効です。

BigInt を Long に読み込むことができます。問題ありません。SQL COUNT を long に読み込めません。

COUNT は Int (Int32) を返すため、実際には Int32 を long にキャストすることが問題です。

4

2 に答える 2

34

longInt64 .NET にあります。これは C# の単なるエイリアスです。問題は戻り値をキャストすることlongであり、クエリから返される型が確実にわからない限り、エラーが発生する理由はわかりません。SQL BigInt は に変換可能でなければなりませんlong

返されるのが COUNT(*) の場合、それは Int32 です。Convertクラスを使用する必要があります:

long l = Convert.ToInt64(selectCommand.ExecuteScalar());
于 2011-03-10T13:40:16.030 に答える
5

カウントが 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 

つまり、それらは同一のコードにコンパイルされるように見えます。

于 2011-03-10T14:08:42.897 に答える