首先请原谅我的英语。我收到这个错误___ 当我尝试将对象从execucalar()显式转换为long时,它给出不能取消框 executioncalar()to long。
虽然在转换为System.Decimal类型时没有出错。
long? id = (long?)ppwDb.ExecuteScalar(ppwDbCmd); //RAISE eXCEPTION
decimal? id = (decimal?)ppwDb.ExecuteScalar(ppwDbCmd);***// NO eXCEPTION
AND的值为(id = 9874563),表示长距离。
答案 0 :(得分:4)
你必须投两次:
long? id = (long?) (decimal?) ppwDb.ExecuteScalar(ppwDbCmd);
第一次演员将取消装箱decimal?
。第二个演员将执行从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;
答案 1 :(得分:2)
试试这个
object retVal = selectCommand.ExecuteScalar();
long? Id = (retVal == DBNull.Value) ? null : Convert.ToInt64(retVal);
答案 2 :(得分:1)
object value = selectCommand.ExecuteScalar(ppwDbCmd);
long? l = (value != null)?Convert.ToInt64(value):null;
上面应该工作,用对象代替长?直接地,你在返回上面的null语句中明确检查null。
原因是返回的值(作为对象)不是有效的int; 因此,隐式演员不起作用。如果你说转换为int, 你明确地将它转换为int截断中的任何双重因子 返回号码。