问题描述
我用asp.net做了一个管理系统,在每次编译后,布署到IIS,第一次加载时,可能需要编译有点缓慢,然后我反复点菜单,链接到页面,偶尔随机会报这两个错ExecuteScalar要求已打开且可用的连接。连接的当前状态为已关闭ExecuteScalar要求已打开且可用的连接。连接的当前状态为已连接我的代码如下publicintGetRecorders(stringsql){SqlConnectionconn=Connection;SqlCommandcmd=newSqlCommand("selectcount(*)from("+sql+")a",conn);try{intt=Convert.ToInt32(cmd.ExecuteScalar());returnt;}catch{throw;}finally{cmd.Dispose();conn.Close();conn.Dispose();}}为什么会有这样了,现在我的操作系统是win764位,数据库是SqlServer2008,电脑CPU是4核。会不会是多线程的问题?请问各位有何解决办法,因为报错是偶然的,调试时,又不一定会碰到这个错
解决方案
解决方案二:
SqlConnectionconn=Connection;SqlCommandcmd=newSqlCommand("selectcount(*)from("+sql+")a",conn);这两句之间加上conn.open();把连接打开
解决方案三:
建议你用usingpublicstaticobjectExecuteScalar(stringsqlStr){objectobj=newobject();using(OleDbConnectionconn=newOleDbConnection(connectionString)){using(OleDbCommandcomm=newOleDbCommand()){conn.Open();comm.Connection=conn;comm.CommandType=CommandType.Text;comm.CommandText=sqlStr;obj=comm.ExecuteScalar();}}returnobj;}
解决方案四:
publicstaticobjectExecuteScalar(stringsqlStr){objectobj=newobject();using(OleDbConnectionconn=newOleDbConnection(connectionString)){using(OleDbCommandcomm=newOleDbCommand()){conn.Open();comm.Connection=conn;comm.CommandType=CommandType.Text;comm.CommandText=sqlStr;obj=comm.ExecuteScalar();}}returnobj;}顶楼上的,加个conn.open()就好
解决方案五:
using(OleDbConnectionconn=newOleDbConnection(connectionString)){}使用时打开连接,使用完了自动关闭
解决方案六:
感谢各位,原因找到了,因为ado数据访问类,我只生成了一个静态实例,所以访问频繁时,会造成多个线程同时访问一段代码。。。
解决方案七:
本人菜鸟,楼主怎么解决的啊
解决方案八:
引用楼主longhun522008的回复:
我用asp.net做了一个管理系统,在每次编译后,布署到IIS,第一次加载时,可能需要编译有点缓慢,然后我反复点菜单,链接到页面,偶尔随机会报这两个错ExecuteScalar要求已打开且可用的连接。连接的当前状态为已关闭ExecuteScalar要求已打开且可用的连接。连接的当前状态为已连接我的代码如下publicintGetRecorders(stringsql){SqlConnectionconn=Connection;SqlCommandcmd=newSqlCommand("selectcount(*)from("+sql+")a",conn);try{intt=Convert.ToInt32(cmd.ExecuteScalar());returnt;}catch{throw;}finally{cmd.Dispose();conn.Close();conn.Dispose();}}为什么会有这样了,现在我的操作系统是win764位,数据库是SqlServer2008,电脑CPU是4核。会不会是多线程的问题?请问各位有何解决办法,因为报错是偶然的,调试时,又不一定会碰到这个错
估计你的连接对象是静态的数据库连接即使你搞成静态的,连接也不会持久化,相反连接还容易丢,数据库连接建议搞成局部变量,用完就端开,连接被连接池回收反复利用。
解决方案九:
引用5楼longhun522008的回复:
感谢各位,原因找到了,因为ado数据访问类,我只生成了一个静态实例,所以访问频繁时,会造成多个线程同时访问一段代码。。。
恩,那个东西确实不能使用静态的,加上using就好了。