C#当我将数据从SQL返回到数据集时,为什么会出现重复记录?

时间:2017-05-15 16:45:15

标签: winforms datagridview duplicates dataset records

我是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;
    }

2 个答案:

答案 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();

请检查。