1.主要是引用没有实例为空所造成的。

    技术2022-05-11  54

    异常详细信息:   System.NullReferenceException:   未将对象引用设置到对象的实例。  源错误:    行    27 :    {  行   28:   DataRow   SmallClassName   =DBOperate.GetDataRow("select   *   from   Small_Class   where     SmallClass_ID="+SmallClass_ID,"Small_Class","DBConnection");  行   29:   return   SmallClassName["SmallClass_ID"].ToString();  行   30:   }   行    31 :   }     源文件:   c:InetpubwwwrootTragramMiniWebTragMiniApp_CodeNavigation.cs         行:    29     堆栈跟踪:    [NullReferenceException:   未将对象引用设置到对象的实例。]        TangramMiniWeb.Navigation.GetSmallClassName(Int32   SmallClass_ID)    in    c:InetpubwwwrootTragramMiniWebTragMiniApp_CodeNavigation.cs: 29         TangramMiniWeb.pith.Page_Load(Object   sender,   EventArgs   e)    in    c:InetpubwwwrootTragramMiniWebTragMini anpith.aspx.cs: 132         System.Web.UI.Control.OnLoad(EventArgs   e)    + 99         System.Web.UI.Control.LoadRecursive()    + 47         System.Web.UI.Page.ProcessRequestMain(Boolean   includeStagesBeforeAsyncPoint,   Boolean   includeStagesAfterAsyncPoint)    + 1061   它的源码:   public     static     string      GetBigClassName( int    BigClass_ID)   {  DataRow   BigClassName   =DBOperate.GetDataRow("select   *   from   Big_Class   where   BigClass_ID="+BigClass_ID,"Big_Class","DBConnection");                          return   BigClassName["BigClass_ID"].ToString();                   }    public     static     string    GetSmallClassName( int    SmallClass_ID)   {  DataRow   SmallClassName   =DBOperate.GetDataRow("select   *   from   Small_Class   where     SmallClass_ID="+SmallClass_ID,"Small_Class","DBConnection");  return   SmallClassName["SmallClass_ID"].ToString();-------此句有问题,就是它测试不过去的?????????  }   用到的数据库的表为:  CREATE   TABLE   [dbo].[Small_Class](  [SmallClass_Id]   [ int ]   IDENTITY( 1 , 1 )   NOT   NULL,  [BigClass_Id]   [ int ]   NULL,  [SmallClass_Name]   [nvarchar]( 255 )   COLLATE   Chinese_PRC_CI_AS   NULL,  [Enable]   [ int ]   NULL,  [Memo]   [nvarchar]( 255 )   COLLATE   Chinese_PRC_CI_AS   NULL  primary   key   ([SmallClass_Id])  )         public     static    DataRow   GetDataRow( string    sql,    string    TableName,    string    dbname)                   {                          SqlConnection   sqlConnection   =   new   SqlConnection(strCon);                          SqlDataAdapter   sqlAdapter1   =   new   SqlDataAdapter(sql,   sqlConnection);                          DataSet   product   =   new   DataSet();                          sqlAdapter1.Fill(product,   TableName);                          return   product.Tables[0].Rows.Count   ==   0   ?   null   :   product.Tables[0].Rows[0];                  }   

     

     

     

     

    当时求解方法如下: 1 .主要是引用没有实例为空所造成的。  应该是那个查询语句   select    *    from   Small_Class    where      SmallClass_ID = " +SmallClass_ID, " Small_Class " , " DBConnection "    返回一个NULL,使得  DataRow   SmallClassName    =    null了。我把select    *    from   Small_Class    where      SmallClass_ID = " +SmallClass_ID放入SQL2005中进行测试,但这个 SmallClass_ID是外来的变量,所以我只能这样写了delcare @SmallClass_ID  int  select    *    from   Small_Class    where      SmallClass_ID = @SmallClass_ID结果数据正常,为了再具体点我取了个具体的值 select    *    from   Small_Class    where      SmallClass_ID = 1结果出现一行数据。可以证明我在SQL方面的语句是没有问题的。 2 .SmallClassName可能没有得到值SmallClassName[ " SmallClass_ID " ]就会出错. 断点看SmallClassName是否能得到值.没得到那就是DBOperate.GetDataRow(...)有问题了.                SmallClassName  =  DBOperate.GetDataRow( " select * from Small_Class where  SmallClass_ID= "   +  SmallClass_ID,  " Small_Class " " DBConnection " );               GetSmallClassName( 1 ) 经过测试发现这使程序进入死循环中,问题为空还没有解决。我思维回归到了   public     static    DataRow   GetDataRow( string    sql,    string    TableName,    string    dbname)                   {                          SqlConnection   sqlConnection   =   new   SqlConnection(strCon);                          SqlDataAdapter   sqlAdapter1   =   new   SqlDataAdapter(sql,   sqlConnection);                          DataSet   product   =   new   DataSet();                          sqlAdapter1.Fill(product,   TableName);                          return   product.Tables[0].Rows.Count   ==   0   ?   null   :   product.Tables[0].Rows                }     这样子就把return   product.Tables[ 0 ].Rows.Count    ==     0     ?     null    :   product.Tables[ 0 ].Rows改为原来的 return  product.table[ 0 ].rows.count or return  product.table[ 0 ].rows.count = 0 return  product.table[ 0 ].rows[ 0 ][ 0 ] return  product.table[ 0 ].rows[ 0 ]这样子都不行的。 3 . int  a = return  product.table[ 0 ].row.count  console.writeline( " s " );但这样子也没有返回值。并那问题依然存在。这种方法也不对。

     

    An unhandled exception of type 'System.StackOverflowException' occurred in App_Code.ovf-vfb-.dll 怎么会出现这超出栈的错误呀 那是死循环的原因。 4 .我的思维再次回到为空的问题上。代码为:   public   static   string  GetSmallClassName( int  SmallClass_ID)         {                        DATAROW    SmallClassName = DBOperate.GetDataRow("select * from Small_Class where  SmallClass_ID=" + SmallClass_ID, "Small_Class""DBConnection");                return SmallClassName["SmallClass_ID"].ToString();        } 既然return SmallClassName[ " SmallClass_ID " ].ToString();为空,那就要判断下SmallClassName是否为空。DataRow smallClass_ID SmallClassName  =  DBOperate.GetDataRow( " select * from Small_Class where  SmallClass_ID= "   +  SmallClass_ID,  " Small_Class " " DBConnection " );                 return  SmallClassName[ " SmallClass_ID " ].ToString这个不这是不行,但只有判断下了DataRow smallClass_ID = null ; SmallClassName  =  DBOperate.GetDataRow( " select * from Small_Class where  SmallClass_ID= "   +  SmallClass_ID,  " Small_Class " " DBConnection " ); if (smallClass_ID == null ) {  return smallClassName["smallClass_ID"].ToString();  } else {   return null;    } 经测试可能达到解决问题的目的 

     

     

     

     


    最新回复(0)