C#:从SqlConnection对象获取反馈?

时间:2017-08-04 14:45:32

标签: c# sql-server

我目前正面临一个问题,即从服务器处理信息需要花费很长时间,我希望为用户提供主动反馈,以便在应用程序看起来只是坐在那里时知道发生了什么。 / p>

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

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

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

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

谢谢大家的帮助!

修改

另外,另一个说明;我不是在寻找代码的讲义。我正在寻找能够在这种情况下帮助我的资源(如果有的话)。我已经讨论了这个问题已经有好几天了,我认为在这一点上寻求帮助的最佳位置就在这里。

附加

更全面的解释:我想知道是否有办法向用户提供当前正在接收的数据库,表格,视图等的名称。

例如:

  • 从服务器Z上的数据库Y加载表X
  • 从服务器Z上的数据库B加载表A

1 个答案:

答案 0 :(得分:1)

SqlConnection有一个InfoMessage-Event,您可以为其分配方法。 此外,您必须将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处)。

无论如何,您还可以使用它来报告存储过程或查询的进度。

伪代码(我不是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

获得解析的乐趣,因此请记住:此类消息也可以由服务器本身生成(因此,启动您自己的,相关的&#34;错误&#34;以及不能发生的satic序列可能是个好主意在正常情况下)。