我做一个窗体应用 通过按钮执行  OleDbConnection conn;
        OleDbDataReader reader;       
       
        /// <summary>
        /// 打开数据连接
        /// </summary>
        /// <param name="sql">数据库连接语句</param>
        public void open(String sql)
        {
            conn = new OleDbConnection(sql);          
            conn.Open();
        }
我的意思是执行这一次之后在软件关闭之前都不需要执行close关闭连接
 然后我在后面的代码上执行   public bool sql(String sql)
        {
            OleDbCommand comm = new OleDbCommand();
            comm.CommandText = sql;
            comm.Connection = conn;            
            reader=comm.ExecuteReader();
            rd = reader.Read();
            reader.Close();
            return rd;        }   public void inquire(Object text)
        {
               
            object lockojb = new object();
            //lock锁
            lock (lockojb)
            {
                //去掉条形码ID的条码号
               // da.open(Class1.strconn);
                String t=text.ToString().Substring(1);
                String ID=text.ToString().Substring(0,1);
                String select_one = "select * from tables where 条码号='" +t+ "'";                    
                if (da.sql(select_one)==false)
                {
//省略了具体的处理过程
}我创建了一个线程池 在符合一定的条件下都会执行inquire();
ThreadPool.QueueUserWorkItem(new WaitCallback(ts.inquire), text);问题如下:
在我通过按钮执行open()之后 按理说conn在软件关闭之前都是连同的 为什么当我执行到sql()方法来具体执行sql语句是显示“ExecuteReader: Connection 属性尚未初始化”;我用断点去看conn是null值。
 急求啊 谢谢啦数据库sql线程池

解决方案 »

  1.   

    conn = new OleDbConnection(sql); 
    连接对象应该传连接字符串,怎么传sql。
      

  2.   

     @"provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\admin\Desktop\saomiaoqiang\abc.mdb"
    我传的是链接字符串 就是写的有点不规范用sql表示了链接语句
    为什么我的conn在后面会成为null呢
    我没有把他close啊
      

  3.   

    我在UI层  private void button5_Click(object sender, EventArgs e)
            {
                cl.openD();
                timer1.Enabled = true;
                timer2.Enabled = true;
                timer3.Enabled = true;
            }通过点击按钮条用了BLL层的openD()方法
    而BLL层有这么一个对应的方法 public void openD()
            {
                da.open(Class1.strconn);
            }da.open 就是DAL层的conn.open();Class1.strconn是一个静态string存就的是数据库连接语句
      

  4.   

    说明下 上面那3个timer控件是我哪来测试用的没别的
      

  5.   

    在conn = new OleDbConnection(sql);下个断点
    单步执行你的程序,看看到底有没有执行到这一行,
    以及执行完了conn.Open()是否触发什么异常。
      

  6.   

    是这样的 我在conn.Open()和 public bool sql(String sql)
            {
                OleDbCommand comm = new OleDbCommand();
                comm.CommandText = sql;
                comm.Connection = conn;            
                reader=comm.ExecuteReader();
                rd = reader.Read();
                reader.Close();
                return rd;        }都下了断点 当我按下按钮后代码走进了conn.open() 点开看conn的状态是open 表示已经打开了没错 单我按下F5断点执行到OleDbCommand comm = new OleDbCommand()是我在把鼠标移到conn上看到conn是空的null 然后我想了下把conn = new OleDbConnection(sql);修改为conn.ConnectionString=sql;  把new  OleDbConnection() 放到了clss的下面而不是在方法内new他的实例
    当我再次断点执行的时候conn已经不为空了 但是他的start状态显示为close关闭着的
      

  7.   

    也就是说在开始我通过按钮执行open方法是conn已经是打开了 但是不知道为什么当我执行到comm时它的状态有是close的 
      

  8.   

    OleDbConnection conn;
    写成
    static OleDbConnection conn;
      

  9.   

    谢谢 问题好像是没了 我就是有个疑问 为什么需要把它设置为static 按理说是没有必要这样做的啊
      

  10.   

    谢谢 问题好像是没了 我就是有个疑问 为什么需要把它设置为static 按理说是没有必要这样做的啊你可能new了不同的对象。