未将对象引用设置到对象的实例。
说明: 执行当前 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异常。