private void ThreadProc()
{
if(my.State==ConnectionState.Closed)
{
try
{
my.Open();
}
catch
{
label1.Text="不能打开数据库!";
}
}
                            while(Qu.Count>0)//需要执行队列的总数,(2000个左右)
                            {
                               adddata();
                             }
Thread.Sleep(1000);
}
}private void adddata()
{
//处理数据生成SQL,插入数据库
    SqlCommand cmd = new SqlCommand(sql,my);
cmd.ExecuteNonQuery();
}
//执行线程
private void button1_Click(object sender, System.EventArgs e)
{
 my = new SqlConnection(connstr);
 my.Open();
 Thread Ft= new Thread(new ThreadStart(ThreadProc));
 Ft.IsBackground=true;
 Ft.Start();
}问题:程序执行到队列1000左右的时候,数据库提示当前连接为CLOSE,后面运行的时候有些可以运行,有些不能提示错误!
     是数据库连接的问题?!还是多线程的问题呢?!请高手指点。

解决方案 »

  1.   

    private void ThreadProc()
    {
      SqlCommand cmd = new SqlCommand();//有循环应将此对象放外面
      cmd.Connection = my;  while(Qu.Count>0)//需要执行队列的总数,(2000个左右)
      {
         adddata(cmd);
      }
      //Thread.Sleep(1000);没必要的延时
    }//应该在adddata方法中加try{...},因为ExecuteNonQuery()会导致错误。
    private void adddata(SqlCommand cmd){
      try
      {//处理数据生成SQL,插入数据库
       if(my.State == ConnectionState.Closed) this.my.Oper();
       cmd.ExecuteNonQuery();
      }
      catch
      {
       ErrorCount++;//错误计数器
      }
    }
    //......其实你完全可以不使用线程,因为这里执行的速度取决于cmd.ExecuteNonQuery()方法,即SQL的复杂程度。
    还有,你应该加一个执行进度条来直观的显示执行进度(在while上++),不然这个线程只能能防止出现假死的作用罢了!
      

  2.   

    你用的WINDOWS2000Server吧?IIS里默认最大线程1000改改看.可能是这个问题!