C# 无法从内部DoWork()从MySQL数据库获取信息
我使用的是后台工作程序,我在backgroundworker类之外测试了这个MySQL/C select查询,它工作得非常好。但是当我尝试使用backgroundworker时,所有的字符串值在它的末尾都是空的C# 无法从内部DoWork()从MySQL数据库获取信息,c#,.net,mysql,winforms,listview,C#,.net,Mysql,Winforms,Listview,我使用的是后台工作程序,我在backgroundworker类之外测试了这个MySQL/C select查询,它工作得非常好。但是当我尝试使用backgroundworker时,所有的字符串值在它的末尾都是空的 void bWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { if (action != Action.ViewOrder) {
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;
}
}
}
}
}
我知道表中有信息,我也知道mysql查询没有问题,因为如果我不使用backgroundworker,它就可以工作
为什么BackgroundWorker不能使用它?我发现有两个主要问题会阻止您的列表被更新。第一个是bWorker_ProgressChanged中HasErrors字符串上的if语句。当您将这些条件组合在一起时,您可能会说iftrue,因为每个字符串都不是null,也不是空的。我认为你可以通过以下方式实现你的目标:
if(!string.IsNullOrEmpty(HasErrors))
另一个问题是,只有在函数第一次运行时,列表才会为空。您需要将if thelist.Items.Count==0更改为if!找到了