偶尔出现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();
}
}
...全文
1888 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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
  • 打赏
  • 举报
回复
谁能帮忙解决?需要多少分直接说,可用分多得是。。。

62,017

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧