Web.config 是这样的http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<system.web>
<httpRuntime requestValidationMode="2.0" />
<compilation debug="true" targetFramework="4.0">
<assemblies>
<add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
</assemblies>
</compilation>
</system.web>
<system.web>
<customErrors mode="Off"/>
</system.web>
<connectionStrings>
<!-- 配置访问access数据库-->
<add name="access_con" connectionString="Provider=Microsoft.Jet.Oledb.4.0;data source="/>
<add name="access_path" connectionString="/App_Data/magazine.mdb"/>
</connectionStrings>
</configuration>
-->
<configuration>
<system.web>
<httpRuntime requestValidationMode="2.0" />
<compilation debug="true" targetFramework="4.0">
<assemblies>
<add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
</assemblies>
</compilation>
</system.web>
<system.web>
<customErrors mode="Off"/>
</system.web>
<connectionStrings>
<!-- 配置访问access数据库-->
<add name="access_con" connectionString="Provider=Microsoft.Jet.Oledb.4.0;data source="/>
<add name="access_path" connectionString="/App_Data/magazine.mdb"/>
</connectionStrings>
</configuration>
{
//从配置文件中得到数据库名称
public static string access_con = ConfigurationManager.ConnectionStrings["access_con"].ConnectionString;
//从配置文件中得到数据库驱动
public static string access_path = ConfigurationManager.ConnectionStrings["access_path"].ConnectionString;
//得到数据库连接字符串
public static string DBConnectionString = access_con + HttpContext.Current.Server.MapPath(access_path);
//建立数据库连接对象
private OleDbConnection OleDbConn = new OleDbConnection(DBConnectionString);//初始化数据库连接对象 public DBConnection()
{ } public OleDbConnection getConnection()
{
return OleDbConn;
}
}方法是这样写的
//删除杂志通过id
public bool DeleteMagazineByID(int id)
{
using (OleDbConnection con = new DAL.DBConnection().getConnection())
{
using (OleDbCommand cmd = new OleDbCommand())
{ cmd.CommandText = "delete from db_Magazine where MagazineID=" + @id + "";
cmd.Connection = con;
cmd.Parameters.Add("@id", OleDbType.Integer).Value = id;
con.Open();
if (cmd.ExecuteNonQuery() > 0)
{
return true;
}
else
{
return false;
}
}
}
}
//删除杂志通过id
public bool DeleteMagazineByID(int id)
{
using (OleDbConnection con = new DAL.DBConnection().getConnection())
{
using (OleDbCommand cmd = new OleDbCommand())
{ cmd.CommandText = "delete from db_Magazine where MagazineID=" + @id + "";
cmd.Connection = con;
cmd.Parameters.Add("@id", OleDbType.Integer).Value = id;
con.Open();
if (cmd.ExecuteNonQuery() > 0)
{
return true;
}
else
{
return false;
}
}
con.Close();
} }
改善下DBConnection类中的代码
连接类 public class DBConnection
{
//从配置文件中得到数据库名称
public static string access_con = ConfigurationManager.ConnectionStrings["access_con"].ConnectionString;
//从配置文件中得到数据库驱动
public static string access_path = ConfigurationManager.ConnectionStrings["access_path"].ConnectionString;
//得到数据库连接字符串
public static string DBConnectionString = access_con + HttpContext.Current.Server.MapPath(access_path);
//建立数据库连接对象
private OleDbConnection OleDbConn = new OleDbConnection(DBConnectionString);//初始化数据库连接对象 public DBConnection()
{ } public OleDbConnection getConnection()
{
return OleDbConn;
}
}
连接类 public class DBConnection
{
//从配置文件中得到数据库名称
public static string access_con = ConfigurationManager.ConnectionStrings["access_con"].ConnectionString;
//从配置文件中得到数据库驱动
public static string access_path = ConfigurationManager.ConnectionStrings["access_path"].ConnectionString;
//得到数据库连接字符串
public static string DBConnectionString = access_con + HttpContext.Current.Server.MapPath(access_path);
//建立数据库连接对象
private OleDbConnection OleDbConn = new OleDbConnection(DBConnectionString);//初始化数据库连接对象 public DBConnection()
{ } public OleDbConnection getConnection()
{
return OleDbConn;
}
}
/// 查询前两行杂志
/// </summary>
/// <returns></returns>
public List<Models.MagazineInfo> SelectAllMagazineInfo()
{
List<Models.MagazineInfo> list = new List<Models.MagazineInfo>();
using (OleDbConnection con = new DBConnection().getConnection())
{
using (OleDbCommand cmd = new OleDbCommand("select top 6 *,(select Nickname from db_Consumer c inner join db_Magazine b on c.ConsumerID=b.ConsumerID where b.MagazineID=m.MagazineID)as Nickname" +
" from db_Magazine m", con))
{
con.Open();
OleDbDataReader rd = cmd.ExecuteReader();
while (rd.Read())
{
Models.MagazineInfo m = new Models.MagazineInfo();
m.Addtime = rd["Addtime"].ToString();
m.CodePicture = rd["CodePicture"].ToString();
m.ConsumerID = Convert.ToInt32(rd["ConsumerID"]);
m.Content = rd["Content"].ToString();
m.Phone = rd["Phone"].ToString();
m.Title = rd["Title"].ToString();
m.NickName = rd["Nickname"].ToString();
m.MagazineID = Convert.ToInt32(rd["MagazineID"]);
list.Add(m);
}
}
}
return list;
}
改成静态方法比较好
public static OleDbConnection getConnection()
{
return new OleDbConnection(DBConnectionString); //直接返回一个新的实例
} 调用:
using (OleDbConnection con = DBConnection.getConnection())2、Web.config 不要用绝对路径, 用|DataDirectory| <add name="connString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|magazine.mdb" providerName="System.Data.OleDb"/>3、SelectAllMagazineInfo方法中
OleDbDataReader rd = cmd.ExecuteReader(); 加usingusing(OleDbDataReader rd = cmd.ExecuteReader())
{}
1.确保access数据库路径正确;2.确保数据能访问权限;3.数据库访问的代码里面注意close4.增加详细的log,
DAL.ConsumerService.CheckLogin(String account, String password) +228
MagazineManager.login.Button1_Click(Object sender, EventArgs e) +478
http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection.aspx
【To ensure that connections are always closed, open the connection inside of a using block, as shown in the following code fragment. Doing so ensures that the connection is automatically closed when the code exits the block. 】如果怀疑数据库连接没有被关闭的话,可以Debug一下看看啊。
如果还是不放心的话,可以在DBConnection 这个类里面实现 IDisposable接口的 Dispose 函数,在这个里面判断你的那个成员变量OleDbConn 是不是被关闭了,如果没有关闭的话就调用Close好了。
你贴出的代码部分,肯定是不需要再额外写 close 的。它可以确保(不论是正常还是程序异常)都自动执行 close。你的代码中,应该删掉 private OleDbConnection OleDbConn这一行,直接在函数中返回 public OleDbConnection getConnection()
{
return new OleDbConnection(DBConnectionString);
}
以避免有别的代码误调用 OleDbConn 变量。其它的,从你在帖子开头的代码中大概就看不出什么问题。应该正在开发环境发现问题,或者是应该在你的开发环境去重现这种问题。因此重要的还是回到测试水准上。在你测试环境上(也许模拟并发5个用户用不同数据访问200次才突然)重现问题,然后立刻进入调试环境,你也许会发现可能是某个sql语句中运用了根本不存在的数据库对象(例如表并不存在),或者别的问题。总之应该让bug出现在调试器上,然后你贴出能够明确指明“哪一个语句、哪一个变量抛出异常”的调试画面,再来问。
你贴出的代码部分,肯定是不需要再额外写 close 的。它可以确保(不论是正常还是程序异常)都自动执行 close。你的代码中,应该删掉 private OleDbConnection OleDbConn这一行,直接在函数中返回 public OleDbConnection getConnection()
{
return new OleDbConnection(DBConnectionString);
}
以避免有别的代码误调用 OleDbConn 变量。其它的,从你在帖子开头的代码中大概就看不出什么问题。应该正在开发环境发现问题,或者是应该在你的开发环境去重现这种问题。因此重要的还是回到测试水准上。在你测试环境上(也许模拟并发5个用户用不同数据访问200次才突然)重现问题,然后立刻进入调试环境,你也许会发现可能是某个sql语句中运用了根本不存在的数据库对象(例如表并不存在),或者别的问题。总之应该让bug出现在调试器上,然后你贴出能够明确指明“哪一个语句、哪一个变量抛出异常”的调试画面,再来问。
真心感谢,解决了,应用池的问题