以下代码在本机及服务器上测试均存在相同问题,浏览量少一切正常,当频繁刷新或同时浏览量大时,提示aspx页面上的绑定找不到数据列,System.Web.HttpException: DataBinding:“System.Data.DataRowView”不包含名为“sitename”的属性,得出此类异常信息.操作系统windows server 2003,开发工具 vs 2008,asp.net 2.0, 数据库是mssql 2005.网站中用到了HttpModules做流量统计,在其中使用以下DbHelper类,该helper类使用singleton模式编写,在module中是静态的,目的是希望无论多少请求都只使用一个helper类完成流量的记录,并由于害怕连接过多,所以connection对象在DbHelper类中也是静态的.请看代码:
public class DbHelper : IDisposable
{
private static string m_strConn;
private static DbHelper m_singleton;
private SqlConnection m_conn; private DbHelper()
{ } private DbHelper(string connStr)
{
m_strConn = connStr;
m_conn = new SqlConnection(connStr);
} public static DbHelper CreateHelper(string connStr)
{
m_strConn = connStr;
if (m_singleton == null)
m_singleton = new DbHelper(m_strConn);
return m_singleton;
} public static DbHelper CreateHelper()
{
if (m_singleton == null)
m_singleton = new DbHelper(m_strConn);
return m_singleton;
} public DataTable GetTableBySql(string SqlStatement, SqlParameter[] parameters, CommandType cmdType)
{
DataTable dt = new DataTable();
using (SqlCommand cmd = PrepareCommand(SqlStatement, parameters, cmdType))
{
SqlDataAdapter adap = new SqlDataAdapter(cmd);
try
{
adap.Fill(dt);
}
catch (Exception ex)
{
throw ex;
}
finally
{
cmd.Parameters.Clear();
m_conn.Close();
}
}
return dt;
} public DataRow GetRowBySql(string SqlStatement, SqlParameter[] parameters, CommandType cmdType)
{
DataRow row = null;
using (SqlCommand cmd = PrepareCommand(SqlStatement, parameters, cmdType))
{
SqlDataAdapter adap = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
try
{
adap.Fill(dt);
row = dt.Rows[0];
}
catch (Exception ex)
{
throw ex;
}
finally
{
cmd.Parameters.Clear();
m_conn.Close();
}
}
return row;
} public void ExcuteNonQuery(string SqlStatement, SqlParameter[] parameters, CommandType cmdType)
{
using (SqlCommand cmd = PrepareCommand(SqlStatement, parameters, cmdType))
{
try
{
m_conn.Open();
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
m_conn.Close();
}
}
} public int ExcuteScalar(string SqlStatement, SqlParameter[] parameters, CommandType cmdType)
{
int ret = 0;
using (SqlCommand cmd = PrepareCommand(SqlStatement, parameters, cmdType))
{
try
{
m_conn.Open();
ret = Convert.ToInt32(cmd.ExecuteScalar());
}
catch (Exception ex)
{
throw ex;
}
finally
{
cmd.Parameters.Clear();
m_conn.Close();
}
}
return ret;
} private SqlCommand PrepareCommand(string SqlStatement, SqlParameter[] parameters, CommandType cmdType)
{
if (string.IsNullOrEmpty(SqlStatement))
return null;
SqlCommand cmd = new SqlCommand(SqlStatement);
if (parameters != null && parameters.Length > 0)
cmd.Parameters.AddRange(parameters);
cmd.CommandType = cmdType;
cmd.Connection = m_conn;
return cmd;
} #region IDisposable 成员 public void Dispose()
{
m_conn.Close();
m_conn.Dispose();
GC.SuppressFinalize(true);
} #endregion
}
用法:
public class MyPage : System.Web.UI.Page //站内所有页面都继承此页,页面不多
{
private DbHelper helper = DbHelper.CreateHelper(ConfigurationManager.ConnectionStrings["TestConnectionString"].ConnectionString); protected DbHelper DBHelper
{
get { return helper; }
} public MyPage()
{ }
}
public class DbHelper : IDisposable
{
private static string m_strConn;
private static DbHelper m_singleton;
private SqlConnection m_conn; private DbHelper()
{ } private DbHelper(string connStr)
{
m_strConn = connStr;
m_conn = new SqlConnection(connStr);
} public static DbHelper CreateHelper(string connStr)
{
m_strConn = connStr;
if (m_singleton == null)
m_singleton = new DbHelper(m_strConn);
return m_singleton;
} public static DbHelper CreateHelper()
{
if (m_singleton == null)
m_singleton = new DbHelper(m_strConn);
return m_singleton;
} public DataTable GetTableBySql(string SqlStatement, SqlParameter[] parameters, CommandType cmdType)
{
DataTable dt = new DataTable();
using (SqlCommand cmd = PrepareCommand(SqlStatement, parameters, cmdType))
{
SqlDataAdapter adap = new SqlDataAdapter(cmd);
try
{
adap.Fill(dt);
}
catch (Exception ex)
{
throw ex;
}
finally
{
cmd.Parameters.Clear();
m_conn.Close();
}
}
return dt;
} public DataRow GetRowBySql(string SqlStatement, SqlParameter[] parameters, CommandType cmdType)
{
DataRow row = null;
using (SqlCommand cmd = PrepareCommand(SqlStatement, parameters, cmdType))
{
SqlDataAdapter adap = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
try
{
adap.Fill(dt);
row = dt.Rows[0];
}
catch (Exception ex)
{
throw ex;
}
finally
{
cmd.Parameters.Clear();
m_conn.Close();
}
}
return row;
} public void ExcuteNonQuery(string SqlStatement, SqlParameter[] parameters, CommandType cmdType)
{
using (SqlCommand cmd = PrepareCommand(SqlStatement, parameters, cmdType))
{
try
{
m_conn.Open();
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
m_conn.Close();
}
}
} public int ExcuteScalar(string SqlStatement, SqlParameter[] parameters, CommandType cmdType)
{
int ret = 0;
using (SqlCommand cmd = PrepareCommand(SqlStatement, parameters, cmdType))
{
try
{
m_conn.Open();
ret = Convert.ToInt32(cmd.ExecuteScalar());
}
catch (Exception ex)
{
throw ex;
}
finally
{
cmd.Parameters.Clear();
m_conn.Close();
}
}
return ret;
} private SqlCommand PrepareCommand(string SqlStatement, SqlParameter[] parameters, CommandType cmdType)
{
if (string.IsNullOrEmpty(SqlStatement))
return null;
SqlCommand cmd = new SqlCommand(SqlStatement);
if (parameters != null && parameters.Length > 0)
cmd.Parameters.AddRange(parameters);
cmd.CommandType = cmdType;
cmd.Connection = m_conn;
return cmd;
} #region IDisposable 成员 public void Dispose()
{
m_conn.Close();
m_conn.Dispose();
GC.SuppressFinalize(true);
} #endregion
}
用法:
public class MyPage : System.Web.UI.Page //站内所有页面都继承此页,页面不多
{
private DbHelper helper = DbHelper.CreateHelper(ConfigurationManager.ConnectionStrings["TestConnectionString"].ConnectionString); protected DbHelper DBHelper
{
get { return helper; }
} public MyPage()
{ }
}
public class RefererModule : IHttpModule
{
private static DbHelper helper = DbHelper.CreateHelper(ConfigurationManager.ConnectionStrings["TestConnectionString"].ConnectionString); #region IHttpModule 成员 public void Dispose()
{
throw new NotImplementedException();
} public void Init(HttpApplication context)
{
context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
} /// <summary>
/// 进行流量统计,并将合作网站带来的流量作统计
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void context_AcquireRequestState(object sender, EventArgs e)
{
//...这里略去使用DbHelper所做的数据操作 } #endregion
}
public static DataSet ExecuteDataset(string strCon,CommandType cmdType,string cmdText,params SqlParameter[] cmdParms)
{
SqlCommand cmd = new SqlCommand();
using (SqlConnection conn = new SqlConnection(strCon))
{
PrepareCommand(cmd, conn, null,cmdType, cmdText, cmdParms);
SqlDataAdapter adp = new SqlDataAdapter();
DataSet ds = new DataSet();
adp.SelectCommand = cmd;
adp.Fill(ds);
cmd.Parameters.Clear();
adp.Dispose();
return ds;
}
}private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
{ if (conn.State != ConnectionState.Open)
conn.Open(); cmd.Connection = conn;
cmd.CommandText = cmdText; if (trans != null)
cmd.Transaction = trans; cmd.CommandType = cmdType; if (cmdParms != null)
{
foreach (SqlParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
}你写的好纠结啊。Db层不要处理异常吧。应该放在业务层去处理异常吧。
你的DbHelper每一个方法其实内部都是临时分配局部变量的,例如你的GetTableBySql方法,似乎都是临时分配变量嘛(除了m_conn,但是这个并不改变)。是singleton还是static,还是创建对象,都没有什么区别。