问题描述:这个问题只有在高并发情况下才会出现。
具体如下:
后台.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;
}