【问题标题】:When multiple people try to save a transaction the user id is going null to the database当多人尝试保存事务时,用户 ID 将变为空到数据库
【发布时间】:2021-11-29 22:33:00
【问题描述】:

当多人尝试保存事务时,用户 ID 将变为空到数据库。我每次都根据数据库中的会话 ID 获取用户信息。 我也尝试过查询字符串和会话。

下面提到的是从数据库中检索会话 ID 和系统名称记录的用户信息的代码。

我以前调用这些构造函数是web方法

public clsLoggedUser()
    {
        try
        {
            string strUserId = "";
            if (HttpContext.Current.Request.QueryString["x"] == null)
            {
              
                string strSessionID = HttpContext.Current.Session.SessionID;
                string strUrl = HttpContext.Current.Request.UrlReferrer.Authority;
                string strSystemName = Convert.ToString(System.Net.Dns.Resolve(HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]).HostName);

                OracleParameter[] objParam = new OracleParameter[3];
                objParam[0] = new OracleParameter("SESSIONID", OracleType.VarChar);
                objParam[1] = new OracleParameter("SYSNAME", OracleType.VarChar);
                objParam[2] = new OracleParameter("URL", OracleType.VarChar);

                objParam[0].Value = strSessionID.Trim();
                objParam[1].Value = strSystemName.Trim();
                objParam[2].Value = strUrl.Trim();

                DataTable dtUserDetails = clsOracleAccess.StaticExecuteDataset(CommandType.StoredProcedure, "PACKCOMMON.GETLOGGEDUSERID", objParam, true).Tables[0];
                if (dtUserDetails.Rows.Count > 0)
                {
                    strUserId = dtUserDetails.Rows[0]["APPLOCKID_NR"].ToString();
                }
                else
                {
                    Exception ex = new NullReferenceException();
                    clsErrorLogEntity.fn_AddNewErrorLog(DateTime.Now, "clsLoggedUser.cs (clsLoggedUser(-1)) [" + ex.Source + "]:" + ((String[])ex.StackTrace.Split(':'))[((String[])ex.StackTrace.Split(':')).Length - 1] + "", ex.Message, ex);
                }

            }
            else
            {
                strUserId = HttpContext.Current.Request.QueryString["x"].ToString().Trim();
            }
            
            if (!String.IsNullOrEmpty(strUserId))
            {
                OracleParameter[] objParam = new OracleParameter[1];
                objParam[0] = new OracleParameter("USERID", OracleType.Number);
                objParam[0].Value = Int32.Parse(strUserId);
                DataTable dtUserDetails = clsOracleAccess.StaticExecuteDataset(CommandType.StoredProcedure, "HMPACK.GETUSERINFOBYID", objParam, true).Tables[0];
                if (dtUserDetails.Rows.Count > 0)
                {
                    UserID = Convert.ToInt32(dtUserDetails.Rows[0]["APPID_NR"].ToString());
                    UserName = dtUserDetails.Rows[0]["APPUNAME_CD"].ToString();
                    Password = dtUserDetails.Rows[0]["APPUACCESS_CD"].ToString();
                    UserCode = dtUserDetails.Rows[0]["APPCODE_CD"].ToString();
                    IsAdmin = Convert.ToChar(dtUserDetails.Rows[0]["ADMINUSER_YN"].ToString());
                    UserConID = Convert.ToInt32(dtUserDetails.Rows[0]["CONID_NR"].ToString());
                    IsLoggedIn = true;
                    blIsAdmin = IsAdmin == 'Y' ? true : false;
                }
            }
        }
        catch (Exception ex)
        {
            
        }
    }
}
clsLoggedUser objclsLoggedUser = new clsLoggedUser();
objclsLoggedUser.UserName;
objclsLoggedUser.UserID; 

【问题讨论】:

  • 我不太明白你的意思,但只是想指出你可能不必使用例如ConvertToInt32(somerow["SOMECOL"].ToString()) - 如果你从数据库中出来的东西是一个整数, char 等,您可以将其转换为字符串,然后再转换为数字
  • 关于你的问题;你是说当只有一个人使用它时一切都很好,但当多人同时使用它时,它似乎忘记了一些变量用户并将其设置为空?
  • @CaiusJard 是的,当多个用户进行相同的交易时,它会崩溃
  • 您在调试器中暂停哪一行代码并检查以发现它为空?哪个变量不应该为空?
  • @CaiusJard objclsLoggedUser.UserName;这是我发现为空的行。

标签: c# jquery asp.net ajax webmethod


【解决方案1】:

(抱歉还不能评论) 我注意到有很多可能性可以通过该代码运行并最终得到“objclsLoggedUser.UserName == null”。如果发生异常,您可以使用“clsErrorLogEntity.fn_AddNewErrorLog”进行记录,但“if (!String.IsNullOrEmpty(strUserId))”没有其他错误记录。你的'catch (Exception ex)' 也没有记录任何东西。 如果您在这些位置设置断点并运行代码,您很可能会找到罪魁祸首。或者在 'catch (Exception ex)' 集之后:

catch (Exception ex)
if(UserName == null)
   throw new IllegalStateException($"User is NULL, HELP!! Some info: {HttpContext.Current.Session.SessionID}");

在 throw 上设置断点或观察错误以了解问题所在。

【讨论】:

  • 如果您没有代表发表评论,请避免发布应该是 cmets 的答案 - 它们会吸引反对票,这会严重影响您获得 50 名代表发表评论的使命
猜你喜欢
  • 2020-08-08
  • 2019-03-30
  • 1970-01-01
  • 2021-03-14
  • 2013-04-08
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
相关资源
最近更新 更多