public class OleConn
    {
        private static OleDbConnection conn;        private OleConn()
        { 
        }        public static OleDbConnection getConn()
        {
            string db = @"Provider=Microsoft.Jet.OleDb.4.0;Data Source=";
            string str = @"E:\C#\addressBook\addressBook\DataBase\MyBook.mdb";
            conn = new OleDbConnection(db+str);
            return conn;
        }
    }这样的单例oleconn 连接类//执行sql 带参数的数组
  public static bool ExecSQLParamters(OleDbParameter[] par, string sql)
       {
           try
           {
               using (OleDbCommand comm = new OleDbCommand(sql, OleConn.getConn()))
               {                   foreach (OleDbParameter pars in par)
                   {
                       comm.Parameters.Add(pars);
                   }                    
                       OleConn.getConn().Open();
                   
                       comm.ExecuteNonQuery();                      return true;
               }
           }
           catch
           {
               return false;
           }
           finally
           {
              OleConn.getConn().Close();
               
           }
       } 错误是ExecuteNonQuery 要求已打开且可用的连接。连接的当前状态为已关闭。 OleConn.getConn().Open();
 这句话断点调式确实执行了。并却状态显示为open 可会出现这样的错误.我实在没招了。access 为2003版本的 没有设置过用户名和密码这样的方法在sql 数据库中写的非常熟练.本人自认为不是特别的菜.所以回答要有点水平.

解决方案 »

  1.   

    隐约记得access只支持同时一个链接之前下面这句已经打开了一个链接了
    using (OleDbCommand comm = new OleDbCommand(sql, OleConn.getConn()))
      

  2.   

    skep99
    using (OleDbCommand comm = new OleDbCommand(sql, OleConn.getConn()))如果这样已经打开的话。那应该是显示 未关闭呀。怎么会显示已经关闭的呢
      

  3.   

    using (OleDbCommand comm = new OleDbCommand(sql, OleConn.getConn()))这句先打开了一个
    然后
    在执行之前,又打开了一个
    OleConn.getConn().Open();//又打开了一个
        
    comm.ExecuteNonQuery(); //这句取的应该是第一个的链接using (OleDbCommand comm ...
      

  4.   

     
    skep99 我测试过了,去掉下面的OleConn.getConn().Open();// 依然还是这个错误》  using (OleDbCommand comm = new OleDbCommand(sql, OleConn.getConn())) 断电放在 OleConn.getConn()显示状态为关闭的.
      

  5.   

    using (OleDbCommand comm = new OleDbCommand(sql, OleConn.getConn()))这句引用了一个链接,但没有打开,原因在这里改了一下,我运行了ok        //执行sql 带参数的数组
            public static bool ExecSQLParamters(OleDbParameter[] par, string sql)
            {
                try
                {
                  OleDbConnection myConn=  OleConn.getConn();
                  using (OleDbCommand comm = new OleDbCommand(sql, myConn))
                    {                    foreach (OleDbParameter pars in par)
                        {
                            comm.Parameters.Add(pars);
                        }                    myConn.Open();                    comm.ExecuteNonQuery();                    return true;
                    }
                }
                catch
                {
                    return false;
                }
                finally
                {
                    OleConn.getConn().Close();            }
            }
      

  6.   

    OleConn.getConn().Open()放在using外部试一下.
      

  7.   

    finally
      {
      OleConn.getConn().Close();
        
      }
    删掉看看,用using会自动释放资源的
      

  8.   

     public static OleDbConnection getConn()
      {
      string db = @"Provider=Microsoft.Jet.OleDb.4.0;Data Source=";
      string str = @"E:\C#\addressBook\addressBook\DataBase\MyBook.mdb";
      conn = new OleDbConnection(db+str);  return conn;
      }
      }调用的getConn()你获得的是一个新的对象,虽然已经打开了,但是是不同的实例对象,注意红色字体,5楼方法可以解决,另外,用using会自动释放资源的,为什么还要加上finally
      {
      OleConn.getConn().Close();
        
      }
    求解。
      

  9.   

    using (OleDbCommand comm = new OleDbCommand(sql, OleConn.getConn()))这句引用了一个链接,但没有打开,原因在这里改了一下,我运行了ok嗯 这样的可以. OleDbConnection myConn=  OleConn.getConn();
    那这里为什么呢? 这样的是不是我理解为 派生类调用基类的引用. 我 private static OleDbConnection conn;  private OleConn()
      {  
      }  public static OleDbConnection getConn()
      {
    这个单例类 私有的构造,静态的目的就是要让它自己创建自己。外面只能调用.不能创建.OleDbConnection myConn=  OleConn.getConn();这样实际上是生成了一个新的对象了、
      

  10.   


    多虑了,和你说的这个没关系
    源代码中,执行到下面这句的时候,connection还没有打开
    using (OleDbCommand comm = new OleDbCommand(sql, OleConn.getConn()))