问题描述
以下是dbconn.cs的内容:usingSystem;usingSystem.Web;usingSystem.Data;usingSystem.Data.OracleClient;usingSystem.Collections;namespacedbconn{publicclassDA{staticOracleConnectionm_conn=null;publicDA(){}publicstaticDataTable查询数据库(string查询语句){OracleConnectionmyConnection=创建连接();DataTabledt=newDataTable();OracleDataAdapterda=newOracleDataAdapter(查询语句,myConnection);da.Fill(dt);myConnection.Close();returndt;}publicstaticOracleConnection创建连接(){if(m_conn==null)m_conn=newOracleConnection("userid=abc;datasource=orasvr;password=123");returnm_conn;}publicstaticint更新数据库(string更新语句){OracleConnectionConn=创建连接();OracleCommandComm=newOracleCommand(更新语句,Conn);OracleTransactiontrans=null;inti=0;try{Comm.Connection.Open();trans=Conn.BeginTransaction();Comm.Transaction=trans;i=Comm.ExecuteNonQuery();trans.Commit();}catch{trans.Rollback();i=0;//throw;}finally{Comm.Connection.Close();}returni;}}}以下是调用页面的代码:stringSQL="SELECTshdwFROMT_chukudanwhereno='"+no1+"'";DataTabledt;dt=DA.查询数据库(SQL);一个人,同一时间,访问一个页面,没有问题,如果一个人或多个人,同时访问2个以上的页面,就会出现数据库连接已关闭的错误我大概分析出来是什么原因,但是不知道怎么用C#语言来改DA.查询数据库(SQL);是静态的,大家共用的,第一个人查询完,需要关闭数据库连接的时候,第二个人再查询,就出错了。
解决方案
解决方案二:
publicstaticDataTable查询数据库(string查询语句){OracleConnectionmyConnection=创建连接();DataTabledt=newDataTable();OracleDataAdapterda=newOracleDataAdapter(查询语句,myConnection);da.Fill(dt);myConnection.Close();returndt;}好像数据库没有打开
解决方案三:
staticOracleConnectionm_conn=null;这句:OracleConnection不能用静态的,否则会有并发性问题。
解决方案四:
慎用staticstatic类型的对象是共用的
解决方案五:
静态成员初始化及静态够着函数只会在第一次调用时执行,那么我们来看下你的程序执行情况:第一个人打开网站(第一次调用哪个):(1)m_conn=null;(2)在创建连接()方法中m_conn被实例化(3)更新数据库(string更新语句)更新后m_conn断掉了,而且m_conn!=null,OracleConnectionmyConnection=创建连接();//这种方式并没有创建新的链接对象,而是把创建连接()返回链接对象的引用给了myConnection第二个人打开网站:(1)staticOracleConnectionm_conn=null;//这句不在执行,静态成员初始化只会在第一次调用时进行;(2)此时m_conn!=null,并且这个链接已经被关闭了,在open的时候肯定打不开了
解决方案六:
引用3楼net_lover的回复:
慎用staticstatic类型的对象是共用的
+
解决方案七:
如果去掉static这个关键字,调用的时候就出错了,那应该如何写呢。
解决方案八:
去掉方法外的哪个Connection定义,直接写在publicstaticOracleConnection创建连接(){OracleConnectionm_conn=newOracleConnection("userid=abc;datasource=orasvr;password=123");returnm_conn;}就可以了。
解决方案九:
也就是不要用成员变量,非静态的成员变量需要new出类的实例才能用的,所以你会出错。
解决方案十:
该回复于2011-12-22 10:12:23被版主删除