none
关于OleDbConnection私有成员封装字段的问题 RRS feed

  • 问题

  • 我在使用如下代码封装了私有OleDbConnection变量后,使用OleConn。Open(),确无法打开连接。后来在代码中加入了私有成员oleConn是否为null的判断,此时,OleConn。Open(),可以正常打开连接。那么我考虑,应该是由于重复创建新的连接对象造成。但是我通过vs2005单步调试发现,只运行该代码一次,即在调用OleConn。Open()时。且运行后,我直接观察oleConn和OleConn的State属性,均为Closed,那么这是什么原因。在什么地方多次重新创建新对象了?期待高手解答,先谢谢了!(注:应该已经保证只有OleConn。Open()一处,使用到了OleConn)

        private OleDbConnection oleConn;
        /// <summary>
        /// OleDB连接
        /// </summary>
        public OleDbConnection OleConn
        {
          get 
          {
            //if (oleConn == null)
            //{
              oleConn = new OleDbConnection(this.StrConn);
            //}
            return oleConn; 
          }
          set { oleConn = value; }
        }
    

    2011年4月11日 13:32

答案

  • 好吧,这个问题,我终于找到问题所在了。现在和大家分享下我的想法。原来C#的类成员初始化与JAVA是不一致的,它是先初始化类成员变量,再运行构造函数。同时在存在成员字段封装的情况下,初始化时,就会执行封装字段内的操作。所以,以后像这样直接在封装的get里面修改属性的做法。还是少写。(如果我的理解有错误,希望大家可以指出,再次非常感谢帮助我的人。)
    2011年4月12日 1:41
  • 你好!

    不管怎样都建议你使用  Connection 时都使用 using 以避免连接使用后未及时关闭与释放。参考下面的例子:

    public class DB
    {
      private String filePath;
      private String strConn;
    
      public DB(string filePath)
      {
        this.filePath = filePath;
        this.strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + this.filePath + ";";
      }
    
      /// <summary>
      /// OleDB连接
      /// </summary>
      public OleDbConnection CreateConnection()
      {
        return new OleDbConnection(this.strConn);
      }
    }
    
    class Program
    {
      static void Main(string[] args)
      {
        var db = new DB("db file path.");
    
        // 调用
        using (var conn = db.CreateConnection())
        {
          conn.Open();
          // 数据操作
        }
      }
    }
    


    知识改变命运,奋斗成就人生!
    2011年4月12日 1:50
    版主

全部回复

  • 我试了楼主的代码,我把你的代码放到了 DBConn的类里,然后按照下面的放法调用,没有问题:

     DBConn db = new DBConn();
                db.OleConn.Open(); //没有问题

     

    楼主能把你调用OleConn.Open();    的代码贴出来吗? 还有你open失败时候的异常信息?       

     

    2011年4月11日 15:05
  • 我经过调试发现,其实是在创建DB类的时候,(上面的代码全在DB.cs内),即DB db = new DB(firePath);时,已经全部都已经生成了一次(虽然我并没有看到执行到那段代码处)。这样我在调用的时候果然是第二次创建。那么,我不明白的是我的构造函数中,只是给数据库路径赋值。为什么其他属性均会初始化。这个是不是我原理还没弄明白,希望可以得到解答,谢谢

    public class DB
      {
        public DB(string filePath)
        {
          this.FilePath = filePath;
        }
    
        private String filePath;
        /// <summary>
        /// 数据库文件路径
        /// </summary>
        public String FilePath
        {
          get { return filePath; }
          set { filePath = value; }
        }
    
        private String strConn;
        /// <summary>
        /// 连接字符创
        /// </summary>
        public String StrConn
        {
          get 
          {
            strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + this.filePath+";";
            return strConn; 
          }
          set { strConn = value; }
        }
    
        private OleDbConnection oleConn;
        /// <summary>
        /// OleDB连接
        /// </summary>
        public OleDbConnection OleConn
        {
          get 
          {
            //if (oleConn == null)
            //{
              oleConn = new OleDbConnection(this.StrConn);
            //}
            return oleConn; 
          }
          set { oleConn = value; }
        }
    
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public bool openConn()
        {
          try
          {
            OleConn.Open();  //这是现在唯一调用的地方,在外部查询时,调用openConn()方法
            return true;
          }
          catch (OleDbException ode)
          {
            MessageBox.Show(ode.Message.ToString().Trim());
          }
          return false;
        }
    

     

    2011年4月12日 0:35
  •  oleConn = new OleDbConnection(this.StrConn);
    加断点
    http://feiyun0112.cnblogs.com/
    2011年4月12日 1:07
    版主
  • 恩啊,我在DB db = new DB(firePath);加了断点。并设置了oleConn和OleConn的监视。并在oleConn = new OleDbConnection(this.StrConn);处也加了断点。初始时,oleConn和OleConn均不存在,然后运行DB db = new DB(firePath)后,oleConn和OleConn均初始化。但断点并没有进入oleConn = new OleDbConnection(this.StrConn)。
    2011年4月12日 1:25
  • 好吧,这个问题,我终于找到问题所在了。现在和大家分享下我的想法。原来C#的类成员初始化与JAVA是不一致的,它是先初始化类成员变量,再运行构造函数。同时在存在成员字段封装的情况下,初始化时,就会执行封装字段内的操作。所以,以后像这样直接在封装的get里面修改属性的做法。还是少写。(如果我的理解有错误,希望大家可以指出,再次非常感谢帮助我的人。)
    2011年4月12日 1:41
  • 你好!

    不管怎样都建议你使用  Connection 时都使用 using 以避免连接使用后未及时关闭与释放。参考下面的例子:

    public class DB
    {
      private String filePath;
      private String strConn;
    
      public DB(string filePath)
      {
        this.filePath = filePath;
        this.strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + this.filePath + ";";
      }
    
      /// <summary>
      /// OleDB连接
      /// </summary>
      public OleDbConnection CreateConnection()
      {
        return new OleDbConnection(this.strConn);
      }
    }
    
    class Program
    {
      static void Main(string[] args)
      {
        var db = new DB("db file path.");
    
        // 调用
        using (var conn = db.CreateConnection())
        {
          conn.Open();
          // 数据操作
        }
      }
    }
    


    知识改变命运,奋斗成就人生!
    2011年4月12日 1:50
    版主