我是C#的新手,所以请耐心等待。我使用C#,Form和SQL Server 2012。
我编写了一些使用后台工作程序(来自表单设计器)和进度条的代码,向用户说明需要从SQL查询加载的数据百分比,直到完全读取所有记录为止。
我遇到的问题是,当Worker完成后,我会在datagridview中列出许多重复记录。我应该只从我的查询中获得14个返回的记录,但是我得到更多(这是重复的)。
我不确定为什么?我确定这里有一个错误(我的初学者代码可以改进)。
有人可以帮助我理解为什么我会在工人完成后获得重复记录吗?我的代码在
之下private void button2_Click(object sender,EventArgs e) {
bgw.WorkerReportsProgress = true;
bgw.WorkerSupportsCancellation = false;
bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
System.Threading.Thread.Sleep(10);
bgw.RunWorkerAsync();
}
DataSet ds = new DataSet();
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
string query = "Select * from Stars_Pillars";
string connetionString = null;
SqlConnection cnn;
connetionString = "Server=xxx\\xxx;Initial Catalog=xxx;User ID=xxx;Password=xxx;";
cnn = new SqlConnection(connetionString);
SqlDataAdapter da = new SqlDataAdapter(query, cnn);
//DataSet ds = new DataSet();
try
{
cnn.Open();
int resda, startrow, pagesize, pageno;
pagesize = getRowCount();
progressBar1.Maximum = pagesize;
pageno = 1;
ds.Tables.Clear();
dataGridView1.Rows.Clear();
while (true)
{
if (!bgw.CancellationPending)
{
startrow = pageno;
resda = da.Fill(ds, startrow, pagesize, "Stars_Pillars");
if (resda == 0)
{
e.Cancel = true;
break;
}
else
{
System.Threading.Thread.Sleep(10);
int percents = (pageno * 100 / pagesize);
bgw.ReportProgress(percents, pageno);
pageno++;
}
}
else
{
e.Cancel = true;
break;
}
}
da.Dispose();
cnn.Close();
cnn.Dispose();
}
catch (Exception ex)
{
MessageBox.Show("Can not open connection ! ");
}
}
private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.PerformStep();
}
private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar1.Value = progressBar1.Maximum;
progressBar1.Visible = false;
dataGridView1.DataSource = ds.Tables[0];
}
private int getRowCount()
{
int count = 0;
string connetionString;
connetionString = "Server=xxxx\\xxxx;Initial Catalog=xxxx;User ID=xxxx;Password=xxxx;";
SqlConnection conn = new SqlConnection(connetionString);
string sql = "SELECT COUNT(Serial_Number) FROM [Stars_Pillars]";
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
count = (int)dr[0];
}
}
catch { }
finally
{
conn.Close();
}
return count;
}
答案 0 :(得分:0)
在代码中有一些很多的改进...你永远不应该使用while (true)
这是非常糟糕的做法,你可以用无限循环结束。
另外,无法衡量并显示使用dataset
填充dataAdapter
的进度。
如果操作需要时间,则显示Marquee style
进度条。
首先尝试使用此代码将数据从数据库加载到DataSet
对象:
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
try
{
string query = "Select * from Stars_Pillars";
connetionString = "Server=xxx\\xxx;Initial Catalog=xxx;User ID=xxx;Password=xxx;";
using(cnn = new SqlConnection(connetionString))
{
cnn.Open();
using(SqlDataAdapter da = new SqlDataAdapter(query, cnn))
{
adapter.Fill(ds);
cnn.Close();
}
}
} catch (Exception ex) {
// handle errors here and close connetion if its open
}
}
答案 1 :(得分:0)
您必须使用代码获得异常。 您无法从bgwDoWork()
访问UI元素以下行必须失败。
dataGridView1.Rows.Clear();
请检查。