3

首先请原谅我的英语。我收到此错误__当我尝试将对象从 executescalar() 显式转换为 long 时,它给出了 can not unbox executescalar() to long 。

而转换为 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

你必须投两次:

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

第一个演员将拆箱decimal?。第二个演员将从decimal?to转换long?。你不能跳过第一个演员,因为 adecimal?不能拆箱到 a long?

这假定ppwDb.ExecuteScalar(ppwDbCmd)返回object,但返回的实际值是 a decimal?

但是,我怀疑如果 id 为空,则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;

上面应该工作,使用对象而不是长?直接地,你可以在 return 上面的语句中有 null 明确地检查 null。

原因是返回的值(作为 object )不是有效的 int ;因此,隐式强制转换不起作用。如果您说转换为 int ,则您将其显式转换为 int 截断返回数字中的任何双倍因子。

于 2012-09-19T08:08:33.770 回答