c# – 通过进度条显示执行进度
发布时间:2020-12-15 07:38:46 所属栏目:百科 来源:网络整理
导读:我有一个愚蠢的问题,但我被困住了.我正在执行我的代码存储过程 过程需要时间,所以我正在显示一个进度条,它显示执行的进度,但存储过程执行,没有什么可以增加进度条的值. 这是我的代码 void btnYes_Click(object sender,EventArgs e){ if (DialogResult.Yes ==
我有一个愚蠢的问题,但我被困住了.我正在执行我的代码存储过程
过程需要时间,所以我正在显示一个进度条,它显示执行的进度,但存储过程执行,没有什么可以增加进度条的值. 这是我的代码 void btnYes_Click(object sender,EventArgs e) { if (DialogResult.Yes == MessageBox.Show("Are you sure","",MessageBoxButtons.YesNo)) { try { dbDataEntities db = new dbDataEntities(); string myquery = "DECLARE @return_value int EXEC @return_value = [dbo].[ssspUpdateMarksOfStudent] SELECT 'Return Value' = @return_value"; //progressbar1.Maximum = 5000; //progressbar1.value = ?; // how could i increment it // db.Database.ExecuteSqlCommand("myquery"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } 另外我也尝试通过设置程序执行时没有增加的当前值,通过秒表来做到这一点 Stopwatch st = new Stopwatch(); st.Start(); progressbar1.Maximum = 5000; progressbar1.Value = Convert.ToInt16(st.Elapsed.Seconds); //My stored procedure call st.Stop(); 那么它只能通过使用后台工作人员来完成,还有其他的方法呢? 我是新的编程,所以没有使用后台工作者,所以我正在寻找一个替代方案. 请建议.提前致谢. 解决方法
一个有趣的想法SqlConnection提供了在服务器执行PRINT命令时触发的InfoMessage事件.您可以在存储过程的某些部分打印并收听此事件.
-- do something PRINT '10 PERCENT COMPLETED'; -- do another thing PRINT '20 PERCENT COMPLETED'; ... PRINT '100 PERCENT COMPLETED'; 除此之外,请使用@ hamlet-hakobyan的解决方案.只显示无限进度条. 更新:更新以包含完整的解决方案 首先我讨厌给出完整的答案.它可以防止头脑找到解决方案的能力.相反,我喜欢将人们推向正确的路径,所以他们可以走路. 我非常耗时的SP.使用RaisError而不是打印立即发送消息. Create Procedure usp_LongProcess As Begin Declare @i Int; Declare @msg VarChar(50); Set @i = 0; while (@i < 100) Begin WaitFor Delay '00:00:02'; Set @i = @i + 10; Set @msg = Convert(VarChar(10),@i) + ' PERCENT COMPLETE'; RaisError(@msg,1,1) With NoWait End End 和我的形式 >一个按钮(CallSpButton) 而最后一个代码可以进行通话 private void CallSpButton_Click(object sender,EventArgs e) { CallSpButton.Enabled = false; SpCaller.RunWorkerAsync(); } private void SpCaller_DoWork(object sender,DoWorkEventArgs e) { var self = (BackgroundWorker) sender; var cb = new SqlConnectionStringBuilder { DataSource = ".",InitialCatalog = "Sandbox",IntegratedSecurity = true }; using (var cn = new SqlConnection(cb.ToString())) { cn.FireInfoMessageEventOnUserErrors = true; cn.Open(); cn.InfoMessage += (o,args) => self.ReportProgress(0,args.Message); using (var cmd = cn.CreateCommand()) { cmd.CommandText = "usp_LongProcess"; cmd.CommandType = CommandType.StoredProcedure; cmd.ExecuteNonQuery(); } } } private void SpCaller_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e) { CallSpButton.Enabled = true; } private void SpCaller_ProgressChanged(object sender,ProgressChangedEventArgs e) { var message = Convert.ToString(e.UserState); Debug.WriteLine(message); statusLabel.Text = message; if (message.EndsWith(" PERCENT COMPLETE")) { int percent; if (int.TryParse(message.Split(' ')[0],out percent)) progress.Value = percent; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |