Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用ExecuteReader计算存储过程显示的记录数,以便更好地控制进度条_C#_Sql Server 2008 - Fatal编程技术网

C# 如何使用ExecuteReader计算存储过程显示的记录数,以便更好地控制进度条

C# 如何使用ExecuteReader计算存储过程显示的记录数,以便更好地控制进度条,c#,sql-server-2008,C#,Sql Server 2008,下面是我用来从存储过程中检索记录的一段代码。我想要记录计数,以便能够定义ProgressBar的最大值 SqlCommand cmd = new SqlCommand("[Pax].[SP_Tax_By_Coupon_Level_And_Surcharge]", cs); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandTimeout = 300; cmd.Parameters.AddWithValue("@SalesDate_

下面是我用来从存储过程中检索记录的一段代码。我想要记录计数,以便能够定义ProgressBar的最大值

SqlCommand cmd = new SqlCommand("[Pax].[SP_Tax_By_Coupon_Level_And_Surcharge]", cs);
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandTimeout = 300;
cmd.Parameters.AddWithValue("@SalesDate_From", dateTimePicker1.Value);
cmd.Parameters.AddWithValue("@SalesDate_To", dateTimePicker2.Value);
cmd.Parameters.AddWithValue("@DocumentType", "Tax");
cmd.Parameters.AddWithValue("@AgentNumCode", ag);
cmd.Parameters.AddWithValue("@DocNum", docn);

this.progressBar1.Value = 0;

int rows = Convert.ToInt32(cmd.ExecuteReader());

cs.Close();

cs.Open();


SqlDataReader rd = cmd.ExecuteReader();

this.progressBar1.Maximum = rows;


int i = 0;

while (rd.Read())
{
    this.progressBar1.Value++;

    dbgTAX.Rows.Add("");


    dbgTAX.Rows[i].Cells[0].Value = rd.GetValue(0).ToString();
    dbgTAX.Rows[i].Cells[2].Value = rd.GetValue(1).ToString();
    dbgTAX.Rows[i].Cells[3].Value = rd.GetValue(2).ToString();

    i++;
}

实际需要多长时间?如果它不到几秒钟,就不用麻烦使用进度条,或者让它在执行返回时直接跳到50%,然后在完成时直接跳到100%。没有人会在意

或者,如果它确实需要很长时间(10秒以上),如果您只是想让用户看到“哦,进度!”那么就这样做

//first
progressBar1.MaxValue = 10000;


// Then in your DataReader loop
if(i % 100 == 0){
    progressBar1.Value += (progressBar1.MaxValue - progressBar1.Value)/10;
}

这将使进度条每100行向终点线爬行10%,但实际上从未到达终点线,因此用户可以看到移动并知道活动正在发生。然后在结束时加速到100%。

“请稍候。校准进度条…”。为了显示进度,让存储过程运行两次真的值得吗?也许您可以编写一个简化版本的proc,只返回行计数。除此之外,您还有什么问题?我想知道记录计数。我到处找,但没有答案。为了能够进行行计数,我必须使用ExecuteScalar,但只有当我想显示1列时,它才能工作。但这里我有几个专栏