.NET 计划

帮助你学习.NET,我们的目的是要精通.NET!

导航

“操作必须执行一个可更新的查询”处理结果

Posted on 2004-11-16 20:35  FREE一族  阅读(1826)  评论(2编辑  收藏  举报
发生的错误:

未将对象引用设置到对象的实例。

说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。

源错误:
行 281:                  OleDbCommand myCommand11=new OleDbCommand(selCmd,myConn);
行 282:                  myCommand11.Connection.Open();                  
行 283:                  int flag=(int)myCommand11.ExecuteScalar();                        
行 284:                  myCommand11.Connection.Close();
行 285:                  if(flag!=0)
源文件: e:\site\jiasheng\manager.aspx.cs    行: 283

堆栈跟踪:

[NullReferenceException: 未将对象引用设置到对象的实例。]
   jiasheng.admin.manager.Chk_Pass() in e:\site\jiasheng\manager.aspx.cs:283
   jiasheng.admin.manager.Button5_Click(Object sender, EventArgs e) in e:\site\jiasheng\manager.aspx.cs:246
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +108
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +57
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
   System.Web.UI.Page.ProcessRequestMain() +1277


版本信息: Microsoft .NET Framework 版本:1.1.4322.573; ASP.NET 版本:1.1.4322.573
原来的代码:
private bool Chk_Pass()
  {
   string path=ConfigurationSettings.AppSettings["strConn2"];
   string dataPath="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath(path)+";";
   OleDbConnection myConn=new OleDbConnection();
   myConn.ConnectionString=dataPath;
   string selCmd="select * from [user] where username='"+Session["UserName"].ToString()+"' and pass='"+tb_OldPass.Text+"'";
   OleDbCommand myCommand11=new OleDbCommand(selCmd,myConn);
   myCommand11.Connection.Open();   
   int flag=(int)myCommand11.ExecuteScalar();    
   myCommand11.Connection.Close();
   if(flag!=0)
    {
     return true;
    }
    else
     return false;
  }
分析原因:
首先说明一下,如果在执行数据库查询的过程当中,username和pass都为正确的,那么则不会发生此错误,如果username或者pass其中一者是错的,则一定会出现此错误,分析了一下:
所引发的异常为NullReferenceException,证明myCommand11.ExecuteScalar()是一个空对象,当int flag=(int)myCommand11.ExecuteScalar(); 试图把空对象转化成int并赋值时,引发了此异常
解决办法:
经过以上的分析得出:如果当
myCommand11.ExecuteScalar()为一个空对象时,也就是select * from [user] where username='"+Session["UserName"].ToString()+"' and pass='"+tb_OldPass.Text+"'";
的结果为空时,在程序中引发一个异常,可以用try....catch....finally来解决此问题。

修改后的代码:
private bool Chk_Pass()
  {
   string path=ConfigurationSettings.AppSettings["strConn2"];
   string dataPath="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath(path)+";";
   OleDbConnection myConn=new OleDbConnection();
   myConn.ConnectionString=dataPath;
   string selCmd="select * from [user] where username='"+Session["UserName"].ToString()+"' and pass='"+tb_OldPass.Text+"'";
   OleDbCommand myCommand11=new OleDbCommand(selCmd,myConn);
   myCommand11.Connection.Open();   
   try
   {
    int flag=(int)myCommand11.ExecuteScalar();    
    if(flag!=0)
    {
     return true;
    }
    else
     return false;
   }
   catch
   {
    return false;
   }
   finally
   {
    myCommand11.Connection.Close();
   }   }
小结:
这个错误的出现,使我认识到:不能用一个空对象来给将来赋值的对象赋值,否则会引起NullReferenceException异常。