之前发过:http://topic.csdn.net/u/20101022/16/d4596a4b-07fc-45f6-a2f2-fbfee071c981.html?32438很多朋友也给了建议,但是我改来改去,问题依然存在,就是一会正常,一会不正常。求个位帮帮忙啊!!!!!问题:“/zhxy”应用程序中的服务器错误。
--------------------------------------------------------------------------------ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidOperationException: ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭。
OledbHelper 代码:
public class OleDbHelper
{
static OleDbConnection conn = null;
static OleDbCommand cmd = null;
static string appPath = System.Web.HttpContext.Current.Request.ApplicationPath;
static string connStr = "provider=microsoft.jet.oledb.4.0;data source="+System.Web.HttpContext.Current.Server.MapPath(appPath + "/App_Data/ZHXYDB.mdb")+"";
public OleDbConnection OpenConnection()
{
try
{
//connStr = ConfigurationManager.ConnectionStrings["DBS"].ToString() + System.Web.HttpContext.Current.Server.MapPath(appPath + "/App_Data/ZHXYDB.mdb");
conn = new OleDbConnection(connStr);
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
}
catch { }
return conn;
} public void CloseConnection()
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
} public void CloseConnection(OleDbConnection connection)
{
if (connection.State == ConnectionState.Open)
{
connection.Close();
}
} public object DB_ExecuteScalar(string sqlStr)
{
OleDbConnection conn = OpenConnection();
cmd = new OleDbCommand(sqlStr, conn);
return cmd.ExecuteScalar();
} public OleDbDataReader ExecuteOdr(string sqlStr, OleDbConnection conn)
{
cmd = new OleDbCommand(sqlStr, conn);
OleDbDataReader odr = cmd.ExecuteReader();
return odr;
} public int DB_ExecuuteNonQuery(string sqlStr)
{
OleDbConnection conn = OpenConnection();
cmd = new OleDbCommand(sqlStr, conn);
int result = cmd.ExecuteNonQuery();
CloseConnection(conn);
return result;
} public DataTable DB_Fill(string sqlStr)
{
OleDbConnection conn = OpenConnection();
DataTable dt = new DataTable();
OleDbDataAdapter oda = new OleDbDataAdapter(sqlStr, conn);
oda.Fill(dt);
return dt;
}
}引用 ExecuteOdr 方法的的代码:
public MODEL.CompanyInfo GetModel(int id)
{
MODEL.CompanyInfo model = new MODEL.CompanyInfo();
OleDbConnection conn = helper.OpenConnection();
sqlStr = new StringBuilder();
sqlStr.Append("select * from CompanyInfo ");
sqlStr.Append("where ID=" + id + "");
OleDbDataReader odr = helper.ExecuteOdr(sqlStr.ToString (), conn);
if (odr.Read() == true)
{
model.ID = (int)odr[0];
model.InfoTitle = odr[1].ToString();
model.InfoContent = odr[2].ToString();
}
odr.Close();
helper.CloseConnection(conn);
return model;
}问题到底出在哪?求个位详加指点下,小弟新人,先致敬了!!!
--------------------------------------------------------------------------------ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidOperationException: ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭。
OledbHelper 代码:
public class OleDbHelper
{
static OleDbConnection conn = null;
static OleDbCommand cmd = null;
static string appPath = System.Web.HttpContext.Current.Request.ApplicationPath;
static string connStr = "provider=microsoft.jet.oledb.4.0;data source="+System.Web.HttpContext.Current.Server.MapPath(appPath + "/App_Data/ZHXYDB.mdb")+"";
public OleDbConnection OpenConnection()
{
try
{
//connStr = ConfigurationManager.ConnectionStrings["DBS"].ToString() + System.Web.HttpContext.Current.Server.MapPath(appPath + "/App_Data/ZHXYDB.mdb");
conn = new OleDbConnection(connStr);
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
}
catch { }
return conn;
} public void CloseConnection()
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
} public void CloseConnection(OleDbConnection connection)
{
if (connection.State == ConnectionState.Open)
{
connection.Close();
}
} public object DB_ExecuteScalar(string sqlStr)
{
OleDbConnection conn = OpenConnection();
cmd = new OleDbCommand(sqlStr, conn);
return cmd.ExecuteScalar();
} public OleDbDataReader ExecuteOdr(string sqlStr, OleDbConnection conn)
{
cmd = new OleDbCommand(sqlStr, conn);
OleDbDataReader odr = cmd.ExecuteReader();
return odr;
} public int DB_ExecuuteNonQuery(string sqlStr)
{
OleDbConnection conn = OpenConnection();
cmd = new OleDbCommand(sqlStr, conn);
int result = cmd.ExecuteNonQuery();
CloseConnection(conn);
return result;
} public DataTable DB_Fill(string sqlStr)
{
OleDbConnection conn = OpenConnection();
DataTable dt = new DataTable();
OleDbDataAdapter oda = new OleDbDataAdapter(sqlStr, conn);
oda.Fill(dt);
return dt;
}
}引用 ExecuteOdr 方法的的代码:
public MODEL.CompanyInfo GetModel(int id)
{
MODEL.CompanyInfo model = new MODEL.CompanyInfo();
OleDbConnection conn = helper.OpenConnection();
sqlStr = new StringBuilder();
sqlStr.Append("select * from CompanyInfo ");
sqlStr.Append("where ID=" + id + "");
OleDbDataReader odr = helper.ExecuteOdr(sqlStr.ToString (), conn);
if (odr.Read() == true)
{
model.ID = (int)odr[0];
model.InfoTitle = odr[1].ToString();
model.InfoContent = odr[2].ToString();
}
odr.Close();
helper.CloseConnection(conn);
return model;
}问题到底出在哪?求个位详加指点下,小弟新人,先致敬了!!!
把这个静态去了,asp.net是多线程,这样很容易出问题。连接有连接池的,所以你不用用静态来提升性能。
写时候可能把文件锁死了,另一个进程读就会失败
public OleDbConnection OpenConnection()
{
//connStr = ConfigurationManager.ConnectionStrings["DBS"].ToString() + System.Web.HttpContext.Current.Server.MapPath(appPath + "/App_Data/ZHXYDB.mdb");
OleDbConnection conn = new OleDbConnection(connStr);
conn.Open();
return conn;
}
返回实例的connection对象,这个对象是从连接池中得到的,再就是把try catch去掉,这么底层的代码,不应该把异常吃掉,那是界面层需要管的事
你的方法是
public OleDbConnection OpenConnection()
{
try
{
//connStr = ConfigurationManager.ConnectionStrings["DBS"].ToString() + System.Web.HttpContext.Current.Server.MapPath(appPath + "/App_Data/ZHXYDB.mdb");
conn = new OleDbConnection(connStr);
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
}
catch { }
return conn;
}你重载一个带参数的方法,参数就是connection对象,试下
去掉 静态后,提示
未将对象引用设置到对象的实例。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。
是conn没有关闭应该是 它每次关闭都是放到那什么池中 那里边只能放100份
如果是就要好好检查自己的代码……
改成 cmd.ExecuteReader(CommandBehavior.CloseConnection); 试试
public static class OleDbHelper
{
static string appPath = System.Web.HttpContext.Current.Request.ApplicationPath;
static string connStr = "provider=microsoft.jet.oledb.4.0;data source=" + System.Web.HttpContext.Current.Server.MapPath(appPath + "/App_Data/ZHXYDB.mdb") + ""; public static OleDbConnection OpenConnection()
{
OleDbConnection conn = new OleDbConnection(connStr);
conn.Open();
return conn;
} public static object DB_ExecuteScalar(string sqlStr)
{
using (OleDbConnection conn = OpenConnection())
{
OleDbCommand cmd = new OleDbCommand(sqlStr, conn);
return cmd.ExecuteScalar();
}//不要手动关闭了,用using来关
} public static OleDbDataReader ExecuteOdr(string sqlStr, OleDbConnection conn)
{
OleDbCommand cmd = new OleDbCommand(sqlStr, conn);
OleDbDataReader odr = cmd.ExecuteReader();
return odr;
} public static int DB_ExecuuteNonQuery(string sqlStr)
{
using (OleDbConnection conn = OpenConnection())
{
OleDbCommand cmd = new OleDbCommand(sqlStr, conn);
int result = cmd.ExecuteNonQuery();
return result;
}
} public static DataTable DB_Fill(string sqlStr)
{
using (OleDbConnection conn = OpenConnection())
{
DataTable dt = new DataTable();
OleDbDataAdapter oda = new OleDbDataAdapter(sqlStr, conn);
oda.Fill(dt);
return dt;
}
}
}
public MODEL.CompanyInfo GetModel(int id)
{
MODEL.CompanyInfo model = new MODEL.CompanyInfo();
OleDbConnection conn = OleDbHelper.OpenConnection();
sqlStr = new StringBuilder();
sqlStr.Append("select * from CompanyInfo ");
sqlStr.Append("where ID=" + id + "");
OleDbDataReader odr = OleDbHelper.ExecuteOdr(sqlStr.ToString (), conn);
if (odr.Read() == true)
{
model.ID = (int)odr[0];
model.InfoTitle = odr[1].ToString();
model.InfoContent = odr[2].ToString();
}
odr.Close();
conn.Close();
return model;
}
public static OleDbDataReader ExecuteOdr(string sqlStr)
{
OleDbCommand cmd = new OleDbCommand(sqlStr, OpenConnection());
OleDbDataReader odr = cmd.ExecuteReader(CommandBehavior.CloseConnection); //在关闭reader的同时关闭连接
return odr;
}
这样调用就方便了
public MODEL.CompanyInfo GetModel(int id)
{
MODEL.CompanyInfo model = new MODEL.CompanyInfo();
sqlStr = new StringBuilder();
sqlStr.Append("select * from CompanyInfo ");
sqlStr.Append("where ID=" + id + "");
OleDbDataReader odr = OleDbHelper.ExecuteOdr(sqlStr.ToString ());
if (odr.Read() == true)
{
model.ID = (int)odr[0];
model.InfoTitle = odr[1].ToString();
model.InfoContent = odr[2].ToString();
}
odr.Close(); //关闭它的情况下,会自动关闭连接的.
return model;
}
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.OleDb.OleDbException: 未指定的错误源错误: 执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。 堆栈跟踪:
[OleDbException (0x80004005): 未指定的错误]
System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection) +1054817
System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject) +53
System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup) +27
System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) +47
System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +105
System.Data.OleDb.OleDbConnection.Open() +37
DAL.OleDbHelper.OpenConnection() in E:\学友资料\学友网站 备份\ZH-XY\DAL\OleDbHelper.cs:19
DAL.CompanyInfo.GetModel(Int32 id) in E:\学友资料\学友网站 备份\ZH-XY\DAL\CompanyInfo.cs:40
BLL.CompanyInfo.GetModel(Int32 id) in E:\学友资料\学友网站 备份\ZH-XY\BLL\CompanyInfo.cs:33
company.Page_Load(Object sender, EventArgs e) +113
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +34
System.Web.UI.Control.OnLoad(EventArgs e) +99
System.Web.UI.Control.LoadRecursive() +47
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1061
我 bll里面 没静态方法啊。。
if (odr.Read() == true)
{
model.ID = (int)odr[0];
model.InfoTitle = odr[1].ToString();
model.InfoContent = odr[2].ToString();
}
//为什么你不释放资源
odr.Dispose();//释放资源
odr.Close(); conn.Close();
return model;
参考下这个帖子
http://topic.csdn.net/u/20070828/17/7cceb47c-f0c2-46cb-9a9b-797d7193c661.html
http://bbs.pageadmin.net/showtopic.aspx?topicid=37&forumpage=1&onlyauthor=1
http://support.microsoft.com/kb/825738
还是看这个吧,大概是说因为文件夹操作权限的问题.