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


    发生的错误:

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

    说明: 执行当前 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异常。
  • 相关阅读:
    linux环境下的时间编程
    golang1.13中重要的新特新
    vs2019+cmake实现Linux远程开发
    现代c++与模板元编程
    一个commit引发的思考
    golang中判断两个slice是否相等
    c++性能测试工具:计算时间复杂度
    c++性能测试工具:google benchmark入门(二)
    使用vs2019进行Linux远程开发
    智能指针和二叉树(3):图解查找和删除
  • 原文地址:https://www.cnblogs.com/free/p/64536.html
Copyright © 2020-2023  润新知