2017-08-04 58 views
0

我目前面临的问题是需要花费相当长的时间来处理来自服务器的信息,并且我希望为用户提供主动反馈,以便知道应用程序看起来正在发生什么。C#:从SqlConnection对象获取反馈?

有关应用程序:它允许用户从指定的服务器中提取所有数据库以及这些数据库中的所有内容。这可能需要相当长一段时间,因为我们的一些数据库可以达到2TB的大小。每个服务器可以包含数百个数据库,因此,如果我尝试使用100个数据库加载服务器,并且其中30%的数据库大小超过100GB,那么在应用程序能够运行之前需要几分钟的时间再次有效。

目前我只是有一个简单的加载消息说:“请稍等,这可能需要一段时间...”。但是,在我看来,这对于需要几分钟时间的事情来说并不足够。

因此,我想知道是否有办法跟踪SqlConnection对象的进度,因为它正在执行指定的查询?如果是这样,我可以提供什么类型的细节,并且是否有现成的资源可供查看并更好地理解解决方案?

我希望有一种方法可以做到这一点,而不必重新创建SqlConnection对象。

谢谢大家的帮助!

编辑

此外,作为另注;我不在这里寻找代码的讲义。如果有任何可用的情况,我正在寻找能够帮助我解决这种情况的资源。我一直在调查这个问题已经有几天了,我想这里最好的地方就是寻求帮助。

额外

一个更详尽的解释:我想知道是否有提供与当前正在接收数据库,表,视图等名用户的方式。

例如:

  • 负载表X从数据库是开服务器ž
  • 加载表格从数据库B在服务器ž
+0

只是一个想法在这里。让您的代码在启动SQL作业后立即返回的SPROC启动。该sproc应该返回一个标识用户作业的GUID,以便用户可以查询状态。该作业可以将进度记录写入表中,您可以查询该表。连接不需要保持打开状态,用户应用程序不需要保持打开状态。它全部断开连接。 GUID将用于检索有关作业的信息并有选择地控制作业。 – Amy

+1

您可以将查询分解为较小的查询,并在每个阶段完成后向用户界面报告。 – Amicable

+0

请看,这就是为什么当我卡住时,我会问StackOverflow问题。但是,性能会有什么影响?这是否会显着降低处理速度?在加载每个数据库的详细信息之前,我可以轻松地提取数据库名称列表,并通过该列表循环以提供反馈。 – lxxtacoxxl

回答

1

关闭SqlConnection有一个InfoMessage-事件,其中将您可以分配一个方法。此外,您必须将FireInfoMessageEventOnUserErrors-Property设置为true。 不,你可以这样做

private void OnInfoMessage(object sender, SqlInfoMessageEventArgs e) 
    { 
     for (var index = 0; index < e.Errors.Count; index++) 
     { 
      var message = e.Errors[index]; 
      //use the message object 
     } 
    } 

请注意,你应该只用较低的则11(一切上面是一个“真正的”错误)的错误代码评估的消息。

根据您使用的是什么命令,服务器已经生成了这样的信息消息(例如在VERIFY BACKUP中)。

反正你也可以用它来报告存储过程或查询的进度。

伪代码(IM不是sqlguy):

RAISEERROR('START', 1,1) WITH NOWAIT; -- Will raise your OnInfoMessage-method 
WHILE 
-- Execute something 
RAISEERROR('Done something', 1,1) WITH NOWAIT; -- Will raise your OnInfoMessage-method 
-- etc. 

END 

与解析乐趣,因为请记住:这种消息也可以由服务器本身生成的(所以它可能是开始自己的一个好主意,相关的“错误”与在正常情况下不会发生的饱和序列)。

+0

从我的理解中,这个例子只会返回执行SPROC或查询的错误相关的信息?我可能会感到困惑。这是一个很有用的信息,因为它提供了有关错误反馈的信息。 – lxxtacoxxl

+0

是的,这是正确的。反正没有理由不能滥用“错误”来返回进度信息。例如:如果你知道你需要执行n个查询(你以前确定过),你可以在开始时产生一个“错误”,告诉你需要执行n个查询。然后在执行每个查询后生成一个“错误”,因此您可以向客户报告进度。 – BudBrot

+0

我会争辩说,只要你选择的动词是“滥用”,那么解决方案应该放在backburner上,直到其他解决方案耗尽。不要认为这是一个糟糕的解决方案,只是没有被描述为“滥用”的解决方案应该是首选。 – Amy