C#在空引用时停止

C#在空引用时停止,c#,sql,try-catch,nullreferenceexception,C#,Sql,Try Catch,Nullreferenceexception,在程序的登录序列中,我在admin表中检查用户是否存在 如果它们不存在于admin表中,我希望程序停止执行其余的登录序列,并更新登录屏幕上的标签文本,以显示它们无法登录的原因等等 此时,标签不会随文本更新,这将导致在更改文本之前刷新页面 我还有其他在登录过程中发生的检查,可以阻止他们登录 在这种情况下,最好的方法是什么,以确保基于某些检查,每次都可以显示不同的标签文本 谢谢你的帮助 try { conn.Open(); string checkAdmin = "Select Us

在程序的登录序列中,我在admin表中检查用户是否存在

如果它们不存在于admin表中,我希望程序停止执行其余的登录序列,并更新登录屏幕上的标签文本,以显示它们无法登录的原因等等

此时,标签不会随文本更新,这将导致在更改文本之前刷新页面

我还有其他在登录过程中发生的检查,可以阻止他们登录

在这种情况下,最好的方法是什么,以确保基于某些检查,每次都可以显示不同的标签文本

谢谢你的帮助

try
{
    conn.Open();
    string checkAdmin = "Select Username from Admins where Username= '" + Session["Username"] + "'";

    SqlCommand adminCheck = new SqlCommand(checkAdmin, conn);
    string admin = adminCheck.ExecuteScalar().ToString();
    conn.Close();
    Session["Admin"] = admin;
}
catch (NullReferenceException)
{

    Session.Abandon();
    Response.Redirect(Request.RawUrl);
    Label3.Text = "blablabla"
}
编辑

好的,我已经根据您对……的评论进行了更新

                try
            {

                string checkAdmin = "Select Username from Admins where Username= @User";
                conn.Open();
                SqlCommand adminCheck = new SqlCommand(checkAdmin, conn);
                adminCheck.Parameters.AddWithValue("@User", Session["Username"]);
                var admin = adminCheck.ExecuteScalar();
                conn.Close();
                if (admin != null)
                {
                    Session["Admin"] = admin;


                }

                else 
                {
                    Session["Admin"] = null;
                }

            }
            catch (Exception)
            {

            }
这将立即取消当前代码的执行,并传输到该URL(可能是其他代码)。因此,将不执行以下用于更改标签的语句

(备注部分):

完成时引发ThreadAbortException异常的重定向调用


我(个人)不会依赖于引发的异常来调用您应该始终使用的UIC的这种行为。这种类型的字符串连接对攻击是开放的。如果停止NullReferenceException,请检查查询返回的行的计数,而不是检查第一个单元格值。捕获NRE不是一个好主意。不要养成捕获NullReferenceException的习惯。NRE几乎完全代表一个应该修复的逻辑错误。我认为另一个错误是,您检查会话[“用户名”],但将其存储在会话[“管理员”]中。然后用户名将始终为nullOP,我是否认为您以前遇到过此异常,并且(由于您认为这是由于DB的响应)您正试图以这种方式处理它?如果是,请张贴引发此异常的行。正如上面的评论所示,您正在使用这个try/catch来掩盖代码中的错误,并且可能有更好(更具防御性)的方法来处理不存在的用户。是的,没错,我如何停止执行页面的其余部分而只更新标签文本?@DavidHayward我认为您误解了HTTP的工作原理,以及WebForms在HTTP请求/响应周期内的工作方式:在页面完成执行之前,将不会有响应发送到具有更改标签的客户端;最后
Response.Redirect(Request.RawUrl);