【发布时间】:2019-11-27 19:20:08
【问题描述】:
想看看我能不能得到一些帮助。我有一个BackgroundWorker,它将执行SQL 查询,然后在进度更改事件期间更新DataGridView。但是,它会跳过第一行并将重复的最后一行添加到DGV。当我在 UID 中添加以进行故障排除时,列标题已关闭。所以请忽略标题与数据不匹配的地方。
我检查了Read() 在IF 中的常见罪魁祸首,但事实并非如此。
有趣的是,如果我在reader = Sqlcmd.ExecuteReader(); 上休息一下并单步执行它,它会随机工作。
任何帮助将不胜感激!我完全不知所措。
此外,如果我可以将 DGV 添加从进度更改为完整事件,那也将是一个巨大的好处。
/// DO WORK
private void issueBWworker_DoWork_1(object sender, DoWorkEventArgs e)
{
// DGV 1
RetriveTableData Obj = (RetriveTableData)e.Argument;
string SqlcmdString = "SELECT * FROM xBETA_OAP_ISSUE";
SqlDataReader reader;
int i = 1;
try
{
using (SqlConnection conn = new SqlConnection(ConnString))
{
Sqlcmd = new SqlCommand(SqlcmdString, conn);
conn.Open();
reader = Sqlcmd.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
Obj.uid = reader["id"].ToString();
Obj.iss_type = reader["issue_type"].ToString();
Obj.inc_num = reader["ticket_num"].ToString();
Obj.create_date = reader["create_date"].ToString();
Obj.created_by = reader["created_by"].ToString();
Obj.active = reader["active"].ToString();
Obj.change_date = reader["change_date"].ToString();
Obj.changed_by = reader["changed_by"].ToString();
Thread.Sleep(100);
//MessageBox.Show(Obj.uid);
// To Report progress.x
issueBWworker.ReportProgress(i, Obj);
if (issueBWworker.CancellationPending)
{
// Set the e.Cancel flag so that the WorkerCompleted event
// knows that the process was cancelled.
e.Cancel = true;
issueBWworker.ReportProgress(0);
return;
}
i++;
}
conn.Close();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// Progress Changes
private void issueBWworker_ProgressChanged_1(object sender, ProgressChangedEventArgs e)
{
if (!issueBWworker.CancellationPending)
{
// DGV 1
RetriveTableData Obj = (RetriveTableData)e.UserState;
issue_dgv.Rows.Add(Obj.uid.ToString(), Obj.iss_type.ToString(), Obj.inc_num.ToString(), Obj.create_date.ToString(), Obj.created_by.ToString(), Obj.active.ToString(), Obj.change_date.ToString(), Obj.changed_by.ToString());
pbar.Value = e.ProgressPercentage;
//toolStripStatusLabel1.Text = "Processing row.. " + e.ProgressPercentage.ToString() + " of " + TotalRecords;
}
}
/// Complete
private void issueBWworker_RunWorkerCompleted_1(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
//toolStripStatusLabel1.Text = "Cancelled by User Intentionally...";
pbar.Value = 0;
pbar.Visible = false;
}
// Check to see if an error occurred in the background process.
else if (e.Error != null)
{
//toolStripStatusLabel1.Text = e.Error.Message;
pbar.Visible = false;
}
else
{
// BackGround Task Completed with out Error
pbar.Visible = false;
//toolStripStatusLabel1.Text = " All Records Loaded...";
}
}
【问题讨论】:
-
添加到将解决您的主要问题的答案。 1)您也可以删除
if (reader.HasRows)并直接从while (reader.Read())开始,因为如果阅读器没有行,您什么都不做。 2)您不需要conn.Close();using将负责关闭和处理连接。 3)SqlCommand和SqlReader都是一次性对象,也就是说,您需要像使用SqlConnection一样在using块中创建它们。祝你好运。
标签: c# datagridview backgroundworker sqldatareader