3

まず第一に、私の英語を許してください。このエラーが発生しています__オブジェクトをexecutecalar()からlongに明示的に変換しようとすると、executecalar()をlongにボックス化できません。

while は System.Decimal 型に変換するときにエラーを出しません。

long? id = (long?)ppwDb.ExecuteScalar(ppwDbCmd); //RAISE eXCEPTION
decimal? id = (decimal?)ppwDb.ExecuteScalar(ppwDbCmd);***// NO eXCEPTION

id の AND 値は (id = 9874563) で、長距離を意味します。

4

3 に答える 3

4

2回キャストする必要があります:

long? id = (long?) (decimal?) ppwDb.ExecuteScalar(ppwDbCmd);

最初のキャストは、decimal?. 2 番目のキャストは からdecimal?への変換を行いlong?ます。decimal?を にボックス化解除できないため、最初のキャストをスキップできませんlong?

ppwDb.ExecuteScalar(ppwDbCmd)これは が返されることを前提としていますobjectが、返される実際の値はdecimal?.

ただし、idがnullの場合はppwDb.ExecuteScalar(ppwDbCmd)返されると思います。DBNull.Valueその場合、その値に対して特別な処理を行う必要があります。

object result = ppwDb.ExecuteScalar(ppwDbCmd);
long? id = result != DBNull.Value ? (long?) (decimal) result : null;
于 2012-09-19T08:19:40.900 に答える
2

これを試して

object retVal = selectCommand.ExecuteScalar();
long? Id = (retVal == DBNull.Value) ? null : Convert.ToInt64(retVal);
于 2012-09-19T08:27:31.113 に答える
1
object value = selectCommand.ExecuteScalar(ppwDbCmd);
long? l =  (value != null)?Convert.ToInt64(value):null;

上記は動作するはずですが、長いのではなくオブジェクトを使用しますか? 上記のステートメントは明示的に null をチェックします。

その理由は、( object として) 返される Value が有効な int ではないためです。したがって、暗黙のキャストは機能しません。convert to int と言う場合は、明示的に int に変換して、返された数値の double 要素を切り捨てます。

于 2012-09-19T08:08:33.770 に答える