我用asp.net做了一个管理系统,在每次编译后,布署到IIS,第一次加载时,可能需要编译有点缓慢 ,然后我反复点菜单,链接到页面,偶尔随机会报这两个错ExecuteScalar 要求已打开且可用的连接。连接的当前状态为已关闭ExecuteScalar 要求已打开且可用的连接。连接的当前状态为已连接
我的代码如下
   public int GetRecorders(string sql)
        {
            SqlConnection conn = Connection;
            
                SqlCommand cmd = new SqlCommand("select count(*) from (" + sql + ") a", conn);
                try
                {
                    int t = Convert.ToInt32(cmd.ExecuteScalar());
                    return t;
                }
                catch
                {
                    throw;
                }
                  finally
                {
                    cmd.Dispose();
                    conn.Close();
                    conn.Dispose();
                }
        }
为什么会有这样了,现在我的操作系统是win7 64位,数据库是Sql Server2008,电脑CPU是4核。会不会是多线程的问题?请问各位有何解决办法,因为报错是偶然的,调试时,又不一定会碰到这个错asp.net ado.net iis 

解决方案 »

  1.   

    SqlConnection conn = Connection;
                
                    SqlCommand cmd = new SqlCommand("select count(*) from (" + sql + ") a", conn);
    这两句之间加上conn.open();把连接打开
      

  2.   

    建议你用using    public static object ExecuteScalar(string sqlStr)
        {
            object obj = new object();
            using (OleDbConnection conn = new OleDbConnection(connectionString))
            {
                using (OleDbCommand comm = new OleDbCommand())
                {
                    conn.Open();
                    comm.Connection = conn;
                    comm.CommandType = CommandType.Text;
                    comm.CommandText = sqlStr;
                    obj = comm.ExecuteScalar();
                }
            }
            
            return obj;
        }
      

  3.   

     public static object ExecuteScalar(string sqlStr)
        {
            object obj = new object();
            using (OleDbConnection conn = new OleDbConnection(connectionString))
            {
                using (OleDbCommand comm = new OleDbCommand())
                {
                    conn.Open();
                    comm.Connection = conn;
                    comm.CommandType = CommandType.Text;
                    comm.CommandText = sqlStr;
                    obj = comm.ExecuteScalar();
                }
            }
            
            return obj;
        } 顶楼上的,加个conn.open()就好 
      

  4.   

    using (OleDbConnection conn = new OleDbConnection(connectionString))
    {
      
    }
    使用时打开连接,使用完了自动关闭
      

  5.   

    感谢各位,原因找到了,因为ado数据访问类,我只生成了一个静态实例,所以访问频繁时,会造成多个线程同时访问一段代码