我有一个愚蠢的问题,但我被困住了.我正在执行我的代码存储过程
@H_404_2@过程需要时间,所以我正在显示一个进度条,它显示执行的进度,但存储过程执行,没有什么可以增加进度条的值.
这是我的代码
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的解决方案.只显示无限进度条.
更新:更新以包含完整的解决方案
首先我讨厌给出完整的答案.它可以防止头脑找到解决方案的能力.相反,我喜欢将人们推向正确的路径,所以他们可以走路.@H_404_2@但在这里呢使用VS2012,NET4,MSIL在W7x64SP1和sql2012下进行测试.
我非常耗时的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)@H_404_2@>进度条(进度)@H_404_2@>标签(statusLabel)和@H_404_2@>一个具有WorkerReportsProgress的后台工作(SpCaller)设置为true.
而最后一个代码可以进行通话
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; } }