导航
  • 主页
  • ASP
  • .NET Framework
  • Web Services
  • VB
  • VC
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • LINQ
  • 问答

偶尔出现Invalid operation. The connection is closed.这种错误,求解

bzszp 2013-06-20 04:53:06
数据库操作类是一个static类
public static class CDataAccess
{
public static string strConnectString=System.Configuration.ConfigurationManager.AppSettings["Connstr"];
public static OracleConnection Conn = new OracleConnection(strConnectString);
。。。。
获取结果集的静态方法,如:
public static bool OpenDataSet(DataSet dsResult, string strTableName, string strSQL, CSQLParams[] ParamNames, Object[] ParamValues)
{
try
{

OracleCommand OraCommand = new OracleCommand(strSQL, Conn);
AssignCommandParams(OraCommand, ParamNames, ParamValues);
OracleDataAdapter daSQL = new OracleDataAdapter(OraCommand);
daSQL.Fill(dsResult, strTableName);
return true;
}
catch (Exception E)
{
throw E;
}
finally
{
if (Conn.State == ConnectionState.Open) Conn.Close();
}
}
...全文
495 点赞 收藏 12
写回复
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
饕餮123 2013-06-21
静态类,静态链接字符串,静态方法访问数据库 。。。。。 能不出问题才怪!
回复
johneyson 2013-06-21
STATIC 是常驻内存的,楼主用完连接后,要把他关闭并释放掉,否则是有几率发生这类错误的 解决方法: 1、不用STATIC 2、STATIC调用的CONN,用完就释放掉
回复
bzszp 2013-06-21
程序修改了一下,谢谢各位,运行几天 看看没问题就来结贴。
回复
只要你能保证每次连接都正常打开,完毕释放,应该没啥问题 可以看看DBHelper.cshttp://www.cnblogs.com/JemBai/archive/2008/09/02/1281864.html
回复
吴青峰 2013-06-20
using里面,只要是出了{}大括号,就会自动释放资源,所以你不用担心说,每次都要new,而且你也不存在你说的那种情况,只要你这样写using(OracleConnection Conn = new OracleConnection(strConnectString)){}。
回复
Banianer 2013-06-20
数据库连接字符串静态木有问题, 用using去调用一个静态方法 返回一个打开的连接即可。 而不是在静态类里弄一个静态方法去公用。 给你一个示例,这样是可以的。

 public class SQLHelper
{
        private static string ConnStr = DAL.DBConnection.Connection;//读取数据库连接语句

        /// <summary>
        /// 功能描述:打开数据库
        /// </summary>
        /// <returns></returns>
        public static SqlConnection Openconn()
        {
            SqlConnection conn = new SqlConnection(ConnStr);
            if (conn.State.Equals(ConnectionState.Closed)) { conn.Open(); }
            return conn;
        }

	public static DataSet ExecuteDataSet(string SQLString, params SqlParameter[] cmdParms)
        {
            using (SqlConnection conn = Openconn())
            {
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = SQLString;
                    PrepareCommand(cmd, cmdParms);
                    DataSet ds = new DataSet();
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    da.Fill(ds);
                    return ds;
                }
            }
        }
}

回复
bzszp 2013-06-20
如果使用非静态类,那就得每次创建一个实例了。谁有这种比较好用的例子,给我一个。
回复
吴青峰 2013-06-20
但是一定不要public static OracleConnection Conn = new OracleConnection(strConnectString); 静态new出链接来,大忌!!!
回复
Banianer 2013-06-20
public static OracleConnection 不要用静态。 同一个静态方法内的静态连接 被调用,正好同时有另外一个任务调用了该静态方法,它完事走人关闭连接。 你这个任务还没搞定,数据库连接被关了。 另外数据连接请用 Using
回复
吴青峰 2013-06-20
查查看,如果有using的关键字,最好using(OracleConnection Conn = new OracleConnection(strConnectString)){ }这样写。不过strConnectString就随便你静态不静态了。
回复
吴青峰 2013-06-20
最好不要public static OracleConnection Conn = new OracleConnection(strConnectString); 这样静态的链接。
回复
bzszp 2013-06-20
谁能帮忙解决?需要多少分直接说,可用分多得是。。。
回复
发动态
发帖子
.NET技术社区
创建于2007-09-28

5.8w+

社区成员

.NET技术交流专区
申请成为版主
社区公告
暂无公告