2011-03-19 2 views
1

백그라운드 작업자를 사용 중이며 backgroundworker 클래스 외부에서이 MySQL/C# select 쿼리를 테스트했으며 완벽하게 작동합니다. 그러나 backgroundworker를 사용하려고하면 모든 문자열 값이 끝나면 비어 있습니다!DoWork() 내부에서 MySQL 데이터베이스의 정보를 얻을 수 없습니다.

void bWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     if (action != Action.ViewOrder) 
     { 
      if (HasErrors != null || HasErrors != "" || HasErrors != String.Empty) 
      { 
       Alert(HasErrors, 
        "Retry", 
        Error, 
        true, 
        Color.FromArgb(249, 87, 55) 
       ); 
      } 
      else 
      { 
       var found = false; 

       foreach (var item in thelist.Items) 
       { 
        if (item.ToString().Contains(OrderNumber)) 
         found = true; 
       } 
       if (thelist.Items.Count == 0) 
       { 
        ListViewItem LItem = new ListViewItem(OrderNumber); 
        ListViewItem.ListViewSubItemCollection SubItems = new ListViewItem.ListViewSubItemCollection(LItem); 

        SubItems.Add(FirstName + " " + LastName); 
        SubItems.Add(EmailAddress); 
        SubItems.Add(DeliveryAddress); 
        SubItems.Add(Company); 
        SubItems.Add(PhoneNumber); 

        thelist.Items.Add(LItem); 
        thelist.Update(); 
       } 
      } 
     } 
    } 

    void bWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     SlideTimer.Enabled = true; 
     Alert("All unconfirmed orders have been retrieved.", 
      "Dismiss", 
      Information, 
      true, 
      Color.FromArgb(63, 187, 249) 
     ); 
     action = Action.None; 
    } 


    void bWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     for (int i = 1; (i <= 10); i++) 
     { 
      if (bWorker.CancellationPending == true) 
      { 
       e.Cancel = true; 
      } 
      else 
      { 
       if (action == Action.ViewOrder) 
       { 
        // Connect to Database, check for orders, and end. 
          string cs = "server=" + 
           Settings.Default.Server + 
           ";username=" + 
           Settings.Default.Username + 
           ";database=" + 
           Settings.Default.Database + 
           ";port=3306;password=BLAH" + 
          ";"; 
        MySql.Data.MySqlClient.MySqlConnection msc = new MySql.Data.MySqlClient.MySqlConnection(cs); 
        try 
        { 
         msc.Open(); 

         // Check for new orders. 
         string st = "SELECT sessionid, firstname, lastname, email, streetaddress, suburb, postcode, state, company, phone FROM mysql_9269_dbase.order"; 
         MySql.Data.MySqlClient.MySqlCommand cd = new MySql.Data.MySqlClient.MySqlCommand(st, msc); 
         MySql.Data.MySqlClient.MySqlDataReader msdr = cd.ExecuteReader(); 

         while (msdr.Read()) 
         { 
          OrderNumber = msdr[0].ToString(); 
          FirstName = msdr[1].ToString(); 
          LastName = msdr[2].ToString(); 
          EmailAddress = msdr[3].ToString(); 
          DeliveryAddress = msdr[4].ToString() + " " + msdr[5].ToString() + " " + msdr[6].ToString() + " " + msdr[7]; 
          Company = msdr[8].ToString(); 
          PhoneNumber = msdr[9].ToString(); 


          // System.Threading.Thread.Sleep(500); 
          bWorker.ReportProgress((i * 10)); 
         } 

         msc.Close(); 
        } 
        catch (Exception en) 
        { 
         HasErrors = en.Message; 
        } 

       } 
      } 
     } 
    } 

나는 테이블의 정보가 알고, 나 또한 내가있는 BackgroundWorker를 사용하지 않는 경우 작동으로 MySQL의 쿼리 아무 문제가 없다 알고있다.

왜 BackgroundWorker에서 작동하지 않습니까?

답변

0

목록이 업데이트되지 않도록하는 두 가지 주요 문제가 있습니다. 첫 번째는 HasErrors 문자열의 if 문인 bWorker_ProgressChanged입니다. 모든 문자열이 null이 아니거나 공백이 아니기 때문에 OR 조건을 함께 사용하면 if(true)이 표시 될 수 있습니다. 난 당신이 함께거야 무엇을 달성 할 수 있다고 생각 :

if(!string.IsNullOrEmpty(HasErrors)) 

다른 문제는 thelist는 함수가 실행 처음으로 빈 될 것입니다 것입니다. if (thelist.Items.Count == 0)if (!found)으로 변경해야합니다.

관련 문제