源错误: 
行 21:     {
行 22:         string strcmd = "select dirflg from picturedetails where id=" + strid;
行 23:         return Boolean.Parse(DBUtil.SqlExecuteScalar(strcmd).ToString());行 24:     }
行 25:     public static DataTable getpicturedetails()
 源文件: d:\校园一点通\App_Code\DBUtil_Picture.cs    行: 23 
那位高手帮忙我看一下上面的错误出在哪? 多谢了  其中类DBUtil的部分代码如下:
 public static object  SqlExecuteScalar(SqlCommand objcommand)
        {
            SqlConnection objconnection = new SqlConnection(strconnect);
            objcommand.Connection = objconnection;
            try
            {
                if (objconnection.State == ConnectionState.Closed)
                {
                    objconnection.Open();
                }
                return objcommand.ExecuteScalar();
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                if (objconnection.State == ConnectionState.Open)
                {
                    objconnection.Close();
                }
            }
        }
        public static object SqlExecuteScalar(string strcmd)
        {
            SqlCommand obj = new SqlCommand(strcmd);
            return SqlExecuteScalar(obj);
        }
表picturedetails有6个字段,id(int)  name(varchar(200))  url(varchar(500))  
dirflg(bit)   parentid(int)  creatdate(datetime)  
就url可以为空值,其余的都不可以为空
我在表中用SQL 2005 就插入了一个元组id=1 name=root  url=null dirflg是bool型的我输了一个数字“1” 

解决方案 »

  1.   

    数据库里的bool值取出来是0或者1吧。
    你在使用tostring就变成了"0"或者"1";再使用
    Boolean.Parse(“1”);或者Boolean.Parse(“0”);就不对了,Boolean只接受"true"或者"false"作为参数。你可以试试解析成intreturn int.Parse(DBUtil.SqlExecuteScalar(strcmd).ToString())==0?false:true ;
    注意上面是C#的语法.
      

  2.   

    既然能肯定不会有null,那直接用
    return Boolean.Parse(DBUtil.SqlExecuteScalar(strcmd));
    应该就可以了。
      

  3.   

    首先这段代码写的很丑,对从数据库拿出来的数据不进行dbnull判断,特别是ExecuteScalar,很容易返回dbnull(如果没有找到记录就是dbnull),如果是dbnull,bool.parse就会报错。
      

  4.   


    纠正一下,ExecuteScalar在没有找到记录时返回null。在找到记录但是记录为空值时返回dbnull。
    这段代码确实会造成很多问题。
      

  5.   

    先判断SqlExecuteScalar的返回值,再转换类型
      

  6.   

    顶下,
    可以用try catch住,这样可以看的到详细错误
    估计是DBNull.Value的问题。
    可以用bool.tryparse();
      

  7.   

    既然数据库中把dirflg设置为bit,返回时,不可能返回1或0,肯定是返回了true或者是false,2楼说的,我个人不赞同
    不是转换类型的问题,
    可以推断,可能是返回了Null,未实例化对象,抛出的异常,
    我觉得一个是不是应该写一个CheckObject的类,SafeBool(object ob)这样的一个方法,就不会出现这样的情况了,把转换封装在CheckObject类中!
             /// <summary>
            /// 转换对象到布尔型
             /// </summary>
            /// <param name="obj"></param>
            /// <returns></returns>
            public static bool SafeBool(object obj)
            {
                return (obj != null) ? SafeBool(obj.ToString()) : false;        }
      

  8.   

    /// <summary>
            /// 验证是否为Bool类型
            /// </summary>
            /// <param name="ob"></param>
            /// <returns></returns>
            public static bool IsBool(object ob)
            {
                try
                {
                    bool.Parse(ob.ToString());
                    return true;
                }
                catch
                {
                    return false;
                }
            }