填充数据表时取得进展

时间:2014-10-28 09:12:50

标签: c# database progress-bar

我必须获取当前存储在DataTable中的记录数量,因为数据库服务器位于其他位置并且连接速度很慢,因此获取记录有时可能需要一些时间,我想知道下载了多少记录。

这是填充数据表的方法:

public DataTable fillMyDataTable(string sQuery)
    {

        SqlDataAdapter myDataAdapter;
        SqlCommandBuilder mySqlCommandBuilder;
        DataTable dataTable;

        myDataAdapter = new SqlDataAdapter(sQuery, this.connection);
        mySqlCommandBuilder = new SqlCommandBuilder(mySqlDataAdapter);
        myDataAdapter.SelectCommand.CommandTimeout = 240;

        dataTable = new DataTable();
        mySqlDataAdapter.Fill(dataTable);

        return dataTable;
    }

这就是我从上面调用方法的方法: DataTable dt = new DataTable();

private void FillData()
{
        string sql = "SELECT Id, Code, Desc FROM myTable";
        dt.RowChanged += new DataRowChangeEventHandler(this.dt_RowChanged);
        dt = fillMyDataTable(sql);
        dt.AcceptChanges();
}

void dt_RowChanged(object sender, DataRowChangeEventArgs e)
{
   if (e.Action == DataRowAction.Add)
   {
       Console.WriteLine("Current no. of rec.: " + dt.Rows.Count.ToString());
   }
 }

输出应该是2100条记录中的1904条。问题是没有触发dt_RowChanged事件。怎么做?

更新<!/强> 上面的代码一直有效,直到触发dt_RowChanged事件,甚至dt对象都填充了记录。

3 个答案:

答案 0 :(得分:1)

要触发事件,请尝试此操作。如果它没有在事件中使用适当的代表。

private void FillData()
{
        string sql = "SELECT Id, Code, Desc FROM myTable";
        dt = fillMyDataTable(sql);
        DataRowChangeEventArgs args = new DataRowChangeEventArgs (dt.Rows, dt.RowState);
        dt_RowChanged(this, args);

}

更新

我刚刚注意到你没有声明事件dt_RowChanged并且你解雇了它。也许这就是你的错误。再次检查。

 dt.RowChanged += new DataRowChangeEventHandler(this.dt_RowChanged);

答案 1 :(得分:0)

所以你想要计算提取的记录数量吗?

int countFetched = dt.Rows.Count;

答案 2 :(得分:0)

我想我成功了,这是我目前的解决方案:

int iCurrentCount = 0;
int iTotalNumOfRec = 0;


iTotalNumOfRec = getNumOfRec("SELECT COUNT(*) FROM myTable)

dt = fillMyDataTable(sql);           
int i = 0;

      while (i < iTotlNumOfRec)
      {
           DataRowChangeEventArgs args = new DataRowChangeEventArgs(dt.Rows[i], DataRowAction.Add);
           dt_RowChanged(this, args);
           ++i;
      }

     void dt_RowChanged(object sender, DataRowChangeEventArgs e)
     {
          if (e.Action == DataRowAction.Add)
          {               
               Console.WriteLine("Current rec. no.: " + iCurrentCount.ToString());
               iCurrentCount++;
           }
      }

感谢所有人!