ZLHZHJ 2016-04-28 07:47 采纳率: 0%
浏览 1903
已结题

asp.net 高并发下 一个web页面同时调用2个方法,这2个方法都是查询数据库,查询的结果乱掉了

问题描述:这个问题只有在高并发情况下才会出现。
具体如下:
后台.cs有2个方法,这2个方法在前端.aspx通过流的方式调用(<%%>),然而DaoJiShi()这个方法获得的是gd()方法的数据,gd()获得的是DaoJiShi()方法的数据,那么在相应的方法里遍历DaTable的时候就会报列不存的情况。
这个问题让我很困惑,这样写已经很多项目了,都没这个问题。这个项目有时候会高并发,我测试也是疯狂刷新页面的时候才会出现,混迹CSDN5年了,突然怀疑自己不会写代码了
开始我怀疑是查询数据的公共方法QueryDataSetByParameters是静态(static)的原因,改成现在的动态的也会出现问题
我尽量少的去掉业务逻辑,关联的代码进行测试,代码贴出来,希望各位一起探讨下,如下:
aspx页面代码:

  <div class="wrap">
        <div class="box2">
            <ul>
                <%=gd()%>
            </ul>
            <ui>剩余时间:<%=intEndTime %></ui>
        </div>
    </div>

aspx.cs代码:

 public partial class mobile_FuDai3 : System.Web.UI.Page
{
    public int intEndTime = 0;
    protected void Page_Load(object sender, EventArgs e)
    {

        int intCount = DaoJiShi();

    }
    public int DaoJiShi()
    {
        string path = Server.MapPath("./log/error");
        int inth = DateTime.Now.Hour;
        int intResult = 0; DataTable Dt = null;
        try
        {
            string strSql = @"select isnull(COUNT(0),0) djs from kww_hongbao 
                        where type=17 and comment='抢福袋红包' and datepart(hh,createtime)= @H and userid=-1 and DATEDIFF(DAY,createtime,GETDATE())=0";
            SqlParameter[] Sp = { new SqlParameter("@H", inth) };
            DataSet ds = SqlDataOperator.QueryDataSetByParameters(strSql, Sp);
            if (ds != null && ds.Tables.Count > 0)
            {
                Dt = ds.Tables[0];
                if (Dt != null && Dt.Rows.Count > 0)
                {
                    intResult = Convert.ToInt32(Dt.Rows[0][0]);
                }
                Dt.Dispose();
            }
            ds = null;
        }
        catch (Exception ex)
        {
            Writer.WriteLog(path, "\n\r" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") +"错误信息1:" + ex.ToString() + "<br/>");
            foreach (DataColumn dc in Dt.Columns)
            {
                Response.Write(string.Format("1.列名:{0} ,数据类型:{1},值:{2}<br/>", dc.ColumnName, dc.DataType, dc.DefaultValue.ToString()));
                Writer.WriteLog(path, "\n\r" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " " + string.Format("1.列名:{0} ,数据类型:{1},值:{2}<br/>", dc.ColumnName, dc.DataType, dc.DefaultValue.ToString()));
            }
        }

        return intResult;
    }
    //头部滚动栏
    public string gd()
    {
        string strStatus = string.Empty;
        string strResult = string.Empty;
        string path = Server.MapPath("./log/error");
        StringBuilder sb = new StringBuilder();
        string strCache = "cache_fudai_gundong";
        string strSql = @"select top 100 t2.nickname,isnull(Convert(decimal(18,2),t1.num*0.0001),0) num from kww_hongbao t1
                            join kww_user t2
                            on t1.userid=t2.userid
                            where t1.type=17 order by t1.createtime desc";
        SqlParameter[] paramList = null;
        DataTable Dt = null;
        try
        {
            DataSet Ds = SqlDataOperator.QueryDataSetByParameters(strSql, paramList);
            if (Ds != null && Ds.Tables.Count > 0)
            {
                Dt = Ds.Tables[0];
                if (Dt != null && Dt.Rows.Count > 0)
                {
                    foreach (DataRow dr in Dt.Rows)
                    {
                        string strNickname = dr["nickname"].ToString();
                        if (strNickname.Length > 2)
                        {
                            strNickname = strNickname.Substring(0, 2);
                        }
                        string strNum = dr["num"].ToString();
                        sb.AppendLine("<li>" + strNickname + "***抢到" + strNum + "元</li>");
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Writer.WriteLog(path, "\n\r" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "错误信息1:" + ex.ToString() + "<br/>");
            DataSet Ds1 = new SqlDataOperatorAuto().QueryDataSetByParameters(strSql, paramList);
            foreach (DataColumn dc in Dt.Columns)
            {
                Response.Write(string.Format("2.列名:{0} ,数据类型:{1},值:{2}<br/>", dc.ColumnName, dc.DataType, dc.DefaultValue.ToString()));
                Writer.WriteLog(path, "\n\r" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " " + string.Format("2.列名:{0} ,数据类型:{1},值:{2}<br/>", dc.ColumnName, dc.DataType, dc.DefaultValue.ToString()));
            }
        }
        Dt.Dispose();
        return sb.ToString();
    }
}

调用的公共查询数据库类方法:
/*参数化查询数据库 防止SQL注入*/

 public  DataSet QueryDataSetByParameters(string strSql, SqlParameter[] paramList)
        {
            SqlConnection SqlConn = new SqlConnection(sqlConfigStr);
            DataSet Ds = new DataSet();
            string strResult = string.Empty;
            try
            {

                SqlConn.Open();
                SqlDataAdapter Da = new SqlDataAdapter();
                Da.SelectCommand = new SqlCommand();
                Da.SelectCommand.Connection = SqlConn;
                Da.SelectCommand.CommandType = CommandType.Text;
                Da.SelectCommand.CommandText = strSql;
                if (paramList != null)
                {
                    Da.SelectCommand.Parameters.AddRange(paramList);
                }
                Da.Fill(Ds);
                Da.Dispose();
            }
            catch
            {

            }
            finally
            {
                SqlConn.Close();
                SqlConn.Dispose();
            }
            return Ds;
        }
  • 写回答

1条回答 默认 最新

  • ZLHZHJ 2016-04-28 09:41
    关注

    怎么没人回答呢,应该是一个比较有意思的话题吧,难道是我没描述清楚么,高并发带来的异常,很吸引人吧

    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?