【问题标题】:Can not unbox bigint to long无法将 bigint 拆箱到 long
【发布时间】:2012-09-19 08:02:08
【问题描述】:

首先请原谅我的英语。我收到这个错误__ 当我尝试将对象从 executescalar() 显式转换为 long 时,它给出了无法拆箱 执行scalar() to long .

while 转换为 System.Decimal 类型时不会出错。

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

id 的 AND 值为 (id = 9874563) ,表示在长范围内。

【问题讨论】:

    标签: c# asp.net .net sql-server


    【解决方案1】:

    你必须投两次:

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

    第一个演员将拆箱decimal?。第二个演员将从decimal? 转换为long?。您不能跳过第一个演员表,因为 decimal? 不能拆箱为 long?

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

    但是,如果 id 为空,我怀疑 ppwDb.ExecuteScalar(ppwDbCmd) 会返回 DBNull.Value。在这种情况下,您将不得不对该值进行特殊处理:

    object result = ppwDb.ExecuteScalar(ppwDbCmd);
    long? id = result != DBNull.Value ? (long?) (decimal) result : null;
    

    【讨论】:

      【解决方案2】:

      试试这个

      object retVal = selectCommand.ExecuteScalar();
      long? Id = (retVal == DBNull.Value) ? null : Convert.ToInt64(retVal);
      

      【讨论】:

        【解决方案3】:
        object value = selectCommand.ExecuteScalar(ppwDbCmd);
        long? l =  (value != null)?Convert.ToInt64(value):null;
        

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

        原因是返回的值(作为 object )不是有效的 int ; 因此,隐式强制转换不起作用。如果您说转换为 int , 您将其显式转换为 int 截断 返回号码。

        【讨论】:

        • @IvanG '如果您在 return 中有 null,则上述语句会给出您必须小心的异常。' - 你需要处理这种情况。
        • 如果selectCommand.ExecuteScalar()返回null值,Convert.ToInt64()返回的值将是0,也就是说你无法区分selectCommand.ExecuteScalar()返回的是0还是null。
        猜你喜欢
        • 1970-01-01
        • 2020-12-30
        • 1970-01-01
        • 2015-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多